Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Laufzeitfehler 462 bei VBA Zugriff auf Word von Ex

Laufzeitfehler 462 bei VBA Zugriff auf Word von Ex
02.09.2018 23:56:32
Ex
Hallo zusammen,
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

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 462 bei VBA Zugriff auf Word von Ex
03.09.2018 01:27:04
Ex
Hallo Sonnenklee,
wenn Du Dir die ganze Fehlermeldung durchliest, dann steht da noch so was:
"Der Remote-Server-Computer existiert nicht oder ist nicht verfügbar."
Du solltest Dir angewöhnen, ALLE erzeugten Objektvariablen auch wieder zu schließen und auf 'Nothing' zu setzen.
Dieser Befehl: Word.Application.Quit
kann eigentlich nur funktionieren, wenn Du im Vba-Editor denn Verweis auf das Word-Objekt gesetzt hast und damit 'Early-Binding' verwenden würdest - Deine Zusammenarbeit von Excel/Word beruht aber auf 'Late Binding' [durch Set wordApp = CreateObject("Word.Application")].
Die Word-Variable, mit der Du Word öffnest ist aber diese: wordApp - deshalb: wordApp.Quit
Ja, ich höre schon wieder die Weltverbesserer mit der Meinung: lokal definierte Variablen werden nach dem Beenden der Sub/Funktion sowieso automatisch ins Jenseits geschickt. Der berühmteste dt.-sprachige Vertreter davon ist wohl Lorenz Hölscher, der in seinen Video2Brain-Videos darauf immer wieder hinweist und bei Vba sogar schon vom 'garbage collector' gesprochen hat. In einem seiner letzten Access-Videos hat er sogar den Recordset nicht geschlossen und auf Nothing gesetzt und es extra noch wortreich untermalt.
Überprüfe also noch mal alle erzeugten Objectvariablen, informiere Dich, ob die geschlossen werden müssen (.Close) und setze sie zum Schluß auf 'Nothing'.
Auch das erzeugen nicht genutzer Objektvariablen ist der Übersichtlichkeit nicht förderlich, z.B.
Dim wb As Workbook
Set wb = ThisWorkbook - es gibt nirgens einen Befehl, der mit wb.fortgesetzt wird
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Laufzeitfehler 462 bei VBA Zugriff auf Word von Ex
03.09.2018 03:30:53
Ex
Vielen Dank für die Rückmeldung.
Die Objektvariabel wb habe ich entfernt, ebenso Word.Application.Quit durch wordApp.Quit ersetzt. Und wordApp habe ich zum Ende hin auf Nothing gesetzt. Leider ändert das aber nichts an meinem Problem. Es ist aber aufgeräumter und stimmiger.
Wenn ich nicht total übermüdet bin, dann habe ich 2 Objektvariablen: wordApp und doc. Doc schließe ich bereits in meinem Code und wordApp lässt sich nicht schließen.
"Der Remote-Server-Computer existiert nicht oder ist nicht verfügbar." sagt mir nicht viel, da dieser definitiv zur Verfügung steht.
Anzeige
Crosspost
03.09.2018 07:03:37
SF
Hola,
https://ms-office-forum.net/forum/showthread.php?t=354131
Gruß,
steve1da
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Laufzeitfehler 462 bei VBA Zugriff auf Word von Excel beheben


Schritt-für-Schritt-Anleitung

  1. VBA-Code anpassen: Stelle sicher, dass alle Objektvariablen korrekt gesetzt und am Ende der Routine auf Nothing gesetzt werden. Dies hilft, den Laufzeitfehler 462 zu vermeiden.

  2. Word-Anwendung korrekt instanziieren:

    Dim wordApp As Object
    Set wordApp = CreateObject("Word.Application")
  3. Word-Dokument öffnen und schließen:

    • Verwende die wordApp-Variable zum Öffnen und Schließen des Word-Dokuments.
    • Beispiel:
      Set doc = wordApp.Documents.Open(sFilename)
      ' ... Dein Code ...
      doc.Close False
      wordApp.Quit
  4. Exportieren als PDF: Achte darauf, dass du die richtige Instanz von ActiveDocument verwendest, um den Serienbrief als PDF zu speichern:

    doc.ExportAsFixedFormat Outputfilename:=PDFFilename, ExportFormat:=wdExportFormatPDF
  5. Fehlerbehandlung: Füge Fehlerbehandlungsroutinen hinzu, um den Fehler zu identifizieren und zu beheben:

    On Error GoTo ErrorHandler
    ' ... Dein Code ...
    Exit Sub
    
    ErrorHandler:
    MsgBox "Fehler: " & Err.Description

Häufige Fehler und Lösungen

  • Laufzeitfehler 462: Tritt auf, wenn die Word-Anwendung nicht verfügbar ist. Überprüfe, ob die Word-Instanz korrekt läuft und alle Variablen ordnungsgemäß geschlossen wurden.

  • Remote-Server-Computer nicht verfügbar: Dies kann passieren, wenn die Word-Anwendung nicht richtig instanziiert wurde. Stelle sicher, dass du CreateObject("Word.Application") verwendest.

  • Objektvariablen nicht geschlossen: Achte darauf, dass du alle erstellten Objektvariablen schließt. Verwende:

    Set wordApp = Nothing
    Set doc = Nothing

Alternative Methoden

  • Early Binding: Wenn du häufig mit Word arbeitest, kannst du Early Binding verwenden, indem du den Verweis auf die Word-Bibliothek in deinem VBA-Projekt hinzufügst. So kannst du den Code typisieren und mögliche Fehler frühzeitig erkennen.

  • Verwendung von With-Blöcken: Reduziere die Anzahl der Objektaufrufe, indem du With-Blöcke verwendest. Dies kann die Lesbarkeit deines Codes verbessern und die Wahrscheinlichkeit von Fehlern verringern.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie man ein Word-Dokument aus Excel öffnet und als PDF speichert:

Sub ExportToPDF()
    Dim wordApp As Object
    Dim doc As Object
    Dim PDFFilename As String

    Set wordApp = CreateObject("Word.Application")
    wordApp.Visible = True
    Set doc = wordApp.Documents.Open("C:\DeinPfad\DeinDokument.docx")

    PDFFilename = "C:\DeinPfad\ExportiertesDokument.pdf"
    doc.ExportAsFixedFormat Outputfilename:=PDFFilename, ExportFormat:=17 ' 17 = wdExportFormatPDF

    doc.Close False
    wordApp.Quit

    Set doc = Nothing
    Set wordApp = Nothing
End Sub

Tipps für Profis

  • Debugging: Nutze den Debugger, um deinen Code Schritt für Schritt zu überprüfen. Setze Haltepunkte und beobachte, wo der Fehler auftritt.

  • Fehlerprotokollierung: Füge eine Protokollierung für Fehler ein, um zu verstehen, wann und warum sie auftreten. Dies kann bei der Fehlersuche von vba error 462 hilfreich sein.

  • Konsistenz: Achte darauf, dass dein Code konsistent ist. Verwende immer die gleichen Variablennamen und Strukturen, um Verwirrung zu vermeiden.


FAQ: Häufige Fragen

1. Was bedeutet Laufzeitfehler 462?
Laufzeitfehler 462 tritt auf, wenn ein Remote-Server-Computer (in diesem Fall Word) nicht verfügbar ist oder wenn die Verbindung zwischen Excel und Word unterbrochen wurde.

2. Wie kann ich den Fehler vermeiden?
Stelle sicher, dass du alle Objektvariablen korrekt schließt und auf Nothing setzt. Verwende außerdem die CreateObject-Methode, um Word zu instanziieren.

3. Ist es besser, Early Binding oder Late Binding zu verwenden?
Early Binding ist in der Regel besser, wenn du häufig mit Word arbeitest, da es die Typensicherheit erhöht und die Fehlersuche erleichtert. Late Binding kann jedoch nützlich sein, wenn du unterschiedliche Versionen von Word unterstützen möchtest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige