VBA Access: Word Fernsteuerung löst bei jedem 2. mal Fehler aus

klecksii

Ensign
Registriert
Apr. 2021
Beiträge
151
Servus,
ich bin gerade dabei eine kleine Access-Datenbank zu basteln, und es gibt ein kleines Problem.
Es handelt sich dabei um eine Access-Anwendung die eine Word-Vorlage mit Textmarken öffnet (Fernsteuerung), und den Inhalt an die Textmarken setzt und dann als PDF speichert.
Das Problem ist, das jede zweite Rechnung folgenden Fehler auslöst:
Laufzeitfehler '462':
Der Remote-Server-Computer existiert nicht oder ist nicht verfügbar.

Hier einmal der Button_Click-Code:
Code:
Dim objWord As word.Application
On Error Resume Next
Set objWord = GetObject(, "Word.Application")
  
If Err.Number > 0 Then
    On Error GoTo 0
    Set objWord = CreateObject("Word.Application")
Else
    objWord.Activate
End If

setzeTextinMarke "markeVNr", Me.Recordset.VNr
setzeTextinMarke "markeGesamtSummeBrutto", Me.Recordset![Brutto-Betrag]

Dim strSpeicherpfadKomplett As String
strSpeicherpfadKomplett = "C:\TestOrdner\"
objWord.ActiveDocument.SaveAs2 strSpeicherpfadKomplett & "Rechnungtest1.pdf", FileFormat:=WdFormatPDF


    objWord.Quit savechanges:=WdDoNotSaveChanges
    Set objWord = Nothing

Das setzen der Textmarken erledigt die "setzeTextinMarke"-Prozedur:
Code:
Private Sub setzeTextinMarke(ByVal strTextmarkeName As String, ByVal strAusgabeText As String)
If word.ActiveDocument.Bookmarks.Exists(strTextmarkeName) Then  '<-- LÖST BEI JEDEM 2. Mal einen Fehler aus!
    Selection.Goto what:=wdGoToBookmark, Name:=strTextmarkeName
    Selection.TypeText strAusgabeText
Else
    MsgBox "Es ist ein Fehler aufgetreten!"
End If
End Sub

Der PDF-Dateiname wird natürlich jedes mal händisch geändert (dies wird später automatisiert erfolgen), zum testen reicht es erstmal.

Ich habe mal die If-Then-Anweisung in der setzeTextinMarke-Prozedur entfernt, wo der Fehler ausgelöst wird. Seitdem wird die Zeile direkt dadrunter markiert:
Code:
Selection.Goto what:=wdGoToBookmark, Name:=strTextmarkeName

Das ganze läfut unter Access 2016 x64, auf einem Windows 10 x64 PC.
Ich würde mich sehr im Unterstützung freuen!
Ergänzung ()

Das Problem konnte durch eine einfache End-Anweisung am Ende des Button-Click-Ereignisses gelöst werden... Siehe:

Code:
Private Sub cmdErstelleRechnung_Click()
Dim objWord As word.Application
On Error Resume Next
Set objWord = GetObject(, "Word.Application")
 
If Err.Number > 0 Then
    On Error GoTo 0
    Set objWord = CreateObject("Word.Application")
Else
    objWord.Activate
End If

setzeTextinMarke "markeVNr", Me.Recordset.VNr
setzeTextinMarke "markeGesamtSummeBrutto", Me.Recordset![Brutto-Betrag]

Dim strSpeicherpfadKomplett As String
strSpeicherpfadKomplett = "C:\TestOrdner\"
objWord.ActiveDocument.SaveAs2 strSpeicherpfadKomplett & "Rechnungtest1.pdf", FileFormat:=WdFormatPDF


    objWord.Quit savechanges:=WdDoNotSaveChanges
    Set objWord = Nothing
End '<-- hat das Problem gelöst...
End Sub

Kann mir jemand erklären, warum die End-Anweisung zur Lösung des Problems führt? Die Ereignis-Prozedur wäre mit "End Sub" doch sowieso beendet worden.
 
Zuletzt bearbeitet:
Microsoft sagt:
"Beendet die Ausführung sofort. Nie erforderlich, kann aber an einer beliebigen Stelle in einer Prozedur platziert werden, um die Codeausführung zu beenden, Dateien zu schließen, die mit der Open-Anweisung geöffnet wurden, und um Variablen zu löschen."
 
Hm... Merkwürdig. Denn Variablen werden doch automatisch bei Prozedur-Ende gelöscht. Und Open-Anweisungen nutze ich nicht, es sei denn OpenRecordset gehört dazu.

So ganz verstehe ich das ganze nicht.
 
Du hälst die Word Instanz vor in der Variable "objword".
In der Sub setzeTextinMarke verwendest du eine Variable namens "word".
Irgendwo muss ja sowas wie Set word= objword stehen aber das zeigst du uns nicht.
Ich vermute jedenfalls die word Variable ist nicht aktuell.
 
"word" ist ein vordefiniertes Objekt (der korrekte Begriff?), wenn man ein Verweis auf die "Microsoft Word Object Library" gesetzt hat.

1656719759079.png
 
Ah danke, ich erinnere mich dunkel, denke aber immer noch da liegt das Problem, er sollte objWord einfach als Parameter reinreichen und diese Referenz statt das vordefinierte Word, das vermutlich durch die ROT gespeist ist, verwenden.
 
Zurück
Oben