ich arbeite mit Office 2016 und möchte von Excel aus einen Serienbrief in Word generieren. Das klappt auch alles wunderbar. Wenn es dann aber daran geht, den erstellten Serienbrief als PDF-Dokument zu speichern, dann kann ich diese Funktion genau ein einziges Mal aufrufen. Führe ich die Funktion ein weiteres Mal durch, dann erhalte ich jedes Mal den Laufzeitfehler 462.
Das Problem ist folgender VBA-Code:
ActiveDocument.ExportAsFixedFormat Outputfilename:=PDFFilename, ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=True, OptimizeFor:=wdExportOptimizeForPrint, Range:= _
wdExportAllDocument, Item:=wdExportDocumentContent, _
IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _
wdExportCreateNoBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False
Was bitte muss ich verändern, damit der Laufzeitfehler nicht mehr auftritt? Ich stehe vor einem Rätsel, habe schon etwas länger rumgebastelt. Daher bin ich für Hilfe echt dankbar.
Leider hilft mir der Support von Microsoft nicht so richtig weiter. Dort heißt es zum Laufzeitfehler 462:
Zum Automatisieren von Microsoft Excel legen Sie eine Objektvariable fest, die normalerweise auf die Excel-Anwendung oder das Excel-Arbeitsmappenobjekt verweist. Dann können weitere Objektvariablen festgelegt werden, um auf eine Arbeitsmappe, einen Bereich oder andere Objekte im Microsoft Excel-Objektmodell zu verweisen. Wenn Sie Code schreiben, der ein Excel-Objekt, eine Excel-Methode oder -Eigenschaft verwendet, sollte dem Aufruf immer eine entsprechende Objektvariable vorhergehen. Anderenfalls erstellt Visual Basic einen eigenen Verweis auf Excel. Dieser Verweis könnte zu Problemen führen, wenn Sie versuchen, den Automatisierungscode mehrere Male auszuführen. Beachten Sie, dass selbst wenn die Codezeile mit der Objektvariablen beginnt, ein Aufruf eines Excel-Objekts, einer Excel-Methode oder -Eigenschaft in der Mitte der Codezeile erfolgen kann, der keine Objektvariable vorangestellt ist.
Hier noch der vollständige VBA-Code meiner Routine:
Sub Serienbrief_Zertifikat()
Worksheets("Serie").Activate
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Serie")
'Prüfen ob Teilnehmer und VAG eingetragen sind
Dim iZeileInhalt, iZeile As Integer
iZeileInhalt = 0
For iZeile = 2 To 20
If ws.Cells(iZeile, 1) "" And ws.Cells(iZeile, 1) "0" Then
iZeileInhalt = 1
Exit For
End If
Next
If iZeileInhalt = 0 Then
MsgBox "Keine Teilnehmer vorhanden." & vbCr & vbCr & "Daten eintragen oder anderes Seminar _
auswählen.", vbCritical, "Fehlende Daten"
Exit Sub
End If
If ws.Cells(21, 2) = "" Or ws.Cells(21, 2) = 0 Then
MsgBox "VAG ist bei dem ausgewählten Seminar nicht eingetragen." & vbCr & vbCr & "Ohne VAG _
keine weitere Verarbeitung möglich!", vbCritical, "Fehlerhafte Eingabe"
Exit Sub
End If
Dim VAG_Jahr, VAG_Nr, DatT, DatM, DatJlang, DatJkurz As String
With ws
VAG_Jahr = Left(.Cells(21, 2), 2)
VAG_Nr = Mid(.Cells(21, 2), InStr(1, .Cells(21, 2), "/") + 1)
DatT = Left(.Cells(2, 40), 2)
DatM = Mid(.Cells(2, 40), 4, 2)
DatJlang = Right(.Cells(2, 40), 4)
DatJkurz = Right(.Cells(2, 40), 2)
End With
'Verzeichnisse und Vorlagen auslesen und überprüfen
Dim Gruppenlaufwerk, sFilename, PDFVerzeichnis, PDFFilename As String
Gruppenlaufwerk = Names("GruppenlaufwerkVerzeichnis").RefersToRange.Value
If Gruppenlaufwerk = "" Then
MsgBox "Es wurde kein Gruppenlaufwerk eingegeben.", vbCritical, "Fehlende Daten _
Gruppenlaufwerk"
Exit Sub
End If
If Right(Gruppenlaufwerk, 1) "\" Then Gruppenlaufwerk = Gruppenlaufwerk & "\"
If Dir(Gruppenlaufwerk) = "" Then
MsgBox "Das Verzeichnis: " & vbCr & vbCr & Gruppenlaufwerk & vbCr & vbCr & "existiert nicht. _
", vbCritical, "Fehlerhaftes Verzeichnis"
Exit Sub
End If
sFilename = Gruppenlaufwerk & "Vorlagen\" & Names("VorlageZertifikat").RefersToRange.Value
If sFilename = "" Then
MsgBox "Es wurde keine Vorlagendatei für das Zertifikat eingegeben.", vbCritical, "Fehlende _
Daten Vorlagendatei"
Exit Sub
End If
If Dir(sFilename) = "" Then
MsgBox "Die Vorlage für das Zertifikat existiert nicht" & vbCr & vbCr & "Dateiname:" & _
sFilename, vbCritical, "Fehler Vorlage"
Exit Sub
End If
PDFVerzeichnis = DatJkurz & DatM & DatT & "_" & VAG_Jahr & "_" & VAG_Nr
PDFFilename = Gruppenlaufwerk & DatJlang & "\" & PDFVerzeichnis & "\" & DatJkurz & DatM & DatT & _
"_Zertifikat_Serie.pdf"
If Dir(Gruppenlaufwerk & DatJlang, vbDirectory) = "" Then
MkDir (Gruppenlaufwerk & DatJlang)
End If
If Dir(Gruppenlaufwerk & DatJlang & "\" & PDFVerzeichnis, vbDirectory) = "" Then
MkDir (Gruppenlaufwerk & DatJlang & "\" & PDFVerzeichnis)
End If
'Word-Dokument öffnen
Dim wordApp As Object
Set wordApp = CreateObject("Word.Application")
wordApp.Visible = True
Dim doc As Word.Document
Set doc = CreateObject("Word.Document")
Set doc = wordApp.Documents.Open(sFilename, ConfirmConversions:=False, ReadOnly:=False, _
AddToRecentFiles:=False)
Dim wb As Workbook
Set wb = ThisWorkbook
Dim sExcel_Filename As String
sExcel_Filename = ThisWorkbook.FullName
'Excel Datenquelle
doc.MailMerge.OpenDataSource Name:=sExcel_Filename, SQLStatement:="SELECT * FROM `Serie$` where _
[31] '' "
'Serienbrief erzeugen
If Err.Number = 9 Then
Err.Clear
doc.MailMerge.Execute
ElseIf Err.Number 0 Then
MsgBox "Fehler Word beim Daten holen von Excel." & vbCr & Err.Description, vbCritical, " _
Fehler"
Else
doc.MailMerge.Execute
End If
ActiveDocument.ExportAsFixedFormat Outputfilename:=PDFFilename, ExportFormat:=wdExportFormatPDF, _
_
OpenAfterExport:=True, OptimizeFor:=wdExportOptimizeForPrint, _
Range:= _
wdExportAllDocument, Item:=wdExportDocumentContent, _
IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _
wdExportCreateNoBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False
'Word-Dokumente schließen und Word beenden
ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
doc.Close False
Word.Application.Quit
Set ws = Nothing
Set wb = Nothing
Set doc = Nothing
End Sub