none
Automatisierungsfehler - Das aufgerufene Objekt wurde von den Clients getrennt (Word 2010) RRS feed

  • Frage

  • Hallo zusammen

    Ich habe unter Word 2010 ein VBA Projekt geschrieben bei welchem der nachfolgende Fehler auftritt, sobald
    ich das Projekt (Userform) aufrufe:

    Laufzeitfehler '-2147417848 (80010108)':
    Automatisierungsfehler
    Das aufgerufene Objekt wurde von den Clients getrennt

    Jedoch kann ich keinen Fehler finden in meinem Code. Was ebenfalls komisch ist, ist wie die Fehlermeldung auftritt.

    1: Starte ich das Projekt via Custom UI Ribbon Befehl (Schaltfläche) dann taucht der ob genannte Fehler auf.

    2: Starte ich zuerst ein anderes VBA Projekt in Word und anschliessend mein (Problem VBA-Projekt) tritt der Fehler NICHT auf. Beide male starte ich die
    Projekte via Custom UI Ribbon Befehl.

    3: Starte ich mein (Problem VBA-Projekt) direkt aus dem VBA Editor tritt der Fehler nicht auf.

    Ich habe zwar ein bisschen auf Google gesucht aber so richtig schlau bin ich nicht geworden respektive
    es hat niemand eine konkrete Lösung für dieses Problem.

    Kennt jemand dieses Problem und weiss evtl. Abhilfe?

    Danke und Gruss

    - André

    Mittwoch, 22. September 2010 20:16

Alle Antworten

  • Hi

    es ist natürlich schwer aus diesen Beschreibungen ohne Code Rückschlüsse auf die Ursachen zu ziehen.

    Setze in alle Module ein

    Option Explicit

    und deklariere alle Variablen passend (nicht als Variant).

    Lasse den Debugger darüber laufen und korrigier alle gefundenen Fehler.

    Der Automatisierungsfehler lässt auf Zugriffe auf andere Objekte (Office-Komponenten, Dateisystem o.ä.) vermuten. Setze überall eine Fehlerroutine, z.B. mit Hilfe der MZTools für VBA, und versuche den Fehler auf eine Prozedur oder Code-Bereich einzugrenzen.

    HTH


    Gruß Christian
    Donnerstag, 23. September 2010 07:45
  • Hallo Christian

    Vielen Dank für deine Hilfe. Ich habe die MZTools installiert und den Code überprüft jedoch keine
    Fehler gefunden.

    Die Funktion "Option Explicit" kann ich nicht anwenden, da mein Code direkt in der Userform
    steckt und nicht in einem Module.

    Anbei nun der Code welcher den Fehler produziert:

    Sub seite2GermanAktualisieren()

       On Error GoTo seite2GermanAktualisieren_Error

        Dim doc1 As Word.Document
        Set doc1 = ActiveDocument
       
        Dim german As Boolean
        Dim french As Boolean

        french = Me.selectF.Value
        german = Me.selectG.Value

        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibFirma2", strTextmarkeText:=Me.txtFirma
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibGesellschaftUVG", strTextmarkeText:=Me.GesellschaftUVG
       
    If german Then
        If Word.Application.UserInitials = "d" Then
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGPersonal", strTextmarkeText:=Me.uvgPersonal
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGAbteilung", strTextmarkeText:=Me.uvgAbteilung
        End If
       
        If Word.Application.UserInitials = "f" Then
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGPersonal", strTextmarkeText:=Me.uvgPersonalF
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGAbteilung", strTextmarkeText:=Me.uvgAbteilungF2
        End If
       
        'Blattbeschreibungen - Titel
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Titel", strTextmarkeText:="UVG Versicherung"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Beschreibung", strTextmarkeText:="obligatorische Unfallversicherung laut UVG"
       
        'Blattbeschreibungen - Linker Rand
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Firma", strTextmarkeText:="Firma"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Gesellschaft", strTextmarkeText:="Versicherungsgesellschaft"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_VP", strTextmarkeText:="Versicherte Personen"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Deckungsart", strTextmarkeText:="Deckungsart"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Leistungen", strTextmarkeText:="Versicherungsleistungen"
       
        'Blattbeschreibungen - Inhalt
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_furdieBasis", strTextmarkeText:="für die Basis gemäss UVG"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_BUNBU", strTextmarkeText:="Berufs- und Nichtberufsunfälle"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_DeckungsartText", strTextmarkeText:="Personen, die weniger als 8 Stunden pro Woche arbeiten, sind nur gegen Berufsunfälle versichert."
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Heilungskosten", strTextmarkeText:="Heilungskosten"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_HeilungskostenArt", strTextmarkeText:="Ambulante Behandlung und bei Spitalaufenthalt die Kosten für die"
    End If

    If french Then
        If Word.Application.UserInitials = "d" Then
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGPersonal", strTextmarkeText:=Me.uvgPersonalF
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGAbteilung", strTextmarkeText:=Me.uvgAbteilungF2
        End If
       
        If Word.Application.UserInitials = "f" Then
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGPersonal", strTextmarkeText:=Me.uvgPersonal
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGAbteilung", strTextmarkeText:=Me.uvgAbteilung
        End If
       
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGPersonal", strTextmarkeText:=Me.uvgPersonalF
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGAbteilung", strTextmarkeText:=Me.uvgAbteilungF2
       
        'Blattbeschreibungen - Titel
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Titel", strTextmarkeText:="Assurance LAA"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Beschreibung", strTextmarkeText:="Assurance-accident obligatoire selon la LAA"
       
        'Blattbeschreibungen - Linker Rand
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Firma", strTextmarkeText:="Entreprise"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Gesellschaft", strTextmarkeText:="Assureur"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_VP", strTextmarkeText:="Personnes assurées"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Deckungsart", strTextmarkeText:="Couverture"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Leistungen", strTextmarkeText:="Etendue des prestations"
       
        'Blattbeschreibungen - Inhalt
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_furdieBasis", strTextmarkeText:="pour la base selon la LAA"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_BUNBU", strTextmarkeText:="Accidents professionnels et non-professionnels"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_DeckungsartText", strTextmarkeText:="Les personnes travaillant moins de 8 heures par semaine ne sont assurées que pour les accidents professionnels."
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_Heilungskosten", strTextmarkeText:="Frais de guérison"
        funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibPage2Desc_HeilungskostenArt", strTextmarkeText:="Frais de traitements médicaux, frais de séjour à l'hôpital en"
    End If

       On Error GoTo 0
       Exit Sub

    seite2GermanAktualisieren_Error:

        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure seite2GermanAktualisieren of Formular RecapV5"
    End Sub

    -> Und hier noch der Code für das befüllen der Textmarken. Wie gesagt ich verwende diesen Code in vielen anderen Projekten respektive Userforms habe aber nie ein Problem

    Private Function funcTextmarkeBefüllen1(ByVal doc1 As Word.Document, ByVal strTextmarkeName As String, ByVal strTextmarkeText As String) As Boolean

       Dim rng As Word.Range
       Dim BM As Word.Bookmark

       With doc1.Bookmarks
          If .Exists(strTextmarkeName) Then
             Set rng = .Item(strTextmarkeName).Range
             rng.Text = strTextmarkeText

             Set BM = .Add(strTextmarkeName, rng)

             funcTextmarkeBefüllen1 = True
          End If
       End With
    End Function

    Freitag, 24. September 2010 06:32
  • Hallo Andre

    auf den ersten Blick sieht es gut aus.

    Aber ein paar Anmerkungen: Verwende in der FUnktion nicht den selben Namen für das Objekt wie Hauptcode, damit die Objektvariable nicht bei den vielen Aufrufen durcheinandergerät. Verwende bitte auch ByRef da du ja einen Verweis auf das Dokument verwendest (ist nicht wirklich tragisch, aber man weiß ja nie).

    Private Function funcTextmarkeBefüllen1(ByRef oDoc As Word.Document, ByVal strTextmarkeName As String, ByVal strTextmarkeText As String) As Boolean

    Und ein paar der Abfragen erscheinen mir unlogisch

     If Word.Application.UserInitials = "d" Then
      funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGPersonal", strTextmarkeText:=Me.uvgPersonalF
      funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGAbteilung", strTextmarkeText:=Me.uvgAbteilungF2
      End If
      
      If Word.Application.UserInitials = "f" Then
      funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGPersonal", strTextmarkeText:=Me.uvgPersonal
      funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGAbteilung", strTextmarkeText:=Me.uvgAbteilung
      End If
      
      funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGPersonal", strTextmarkeText:=Me.uvgPersonalF
      funcTextmarkeBefüllen1 doc1:=doc1, strTextmarkeName:="ibUVGAbteilung", strTextmarkeText:=Me.uvgAbteilungF2
    

    Da wird nicht nur abgefragt, sondern zusätzlich die Textmarke gefüllt? Ich würde so weige Zugriffe auf die Textmarken wie notwendig verwenden. Bei der großen Anzahl der Zugriffe scheint irgendwann Word ein Timing Problem zu bekommen (Automatisierungfehler)

    Ich würde da ansetzen und in die Funktion ein

    DoEvents

    einbauen und weiter beobachten.

    Sonst fällt mir tatsächlich kein Fehler auf.


    Gruß Christian
    Freitag, 24. September 2010 08:47
  • Hallo Christian

    Vielen Dank für deine Hilfe, ich habe nun den halben Nachmittag damit verbracht einerseits den Fehler zu finden und zu korrigieren und auch weiterhin im Web nach einer Lösung zu suchen.

    Ich wurde fündig auf einer englischen Seite, es bezog sich zwar eher auf Excel, aber der Grundtenor geht in die gleiche Richtung. Empfehlenswert ist es den Code aus der Userform in ein Module zu verfrachten. Dies habe ich gemacht so weit so gut. Nun habe ich aber ein Funktionsproblem.

    Meine UserForm heisst "RecapV5" sofern ich den Code in der Userform erstelle kann ich ja meine Felder Textboxen usw. mit Me.XXX ansprechen, dies funktioniert
    logischerweise in einem Modul nicht. Ich habe nun im Modul das "Me." durch "RecapV5." erstetzt jedoch funktioniert somit mein Code nicht mehr richtig. Hättest du mir eventuelle eine Hilfestellung wie ich dies korrekt anstelle.

    Hier mal ein Beispiel Code von mir welcher einwandfrei funktioniert wenn dieser in einer Userform platziert ist, aber nicht mehr funktioniert sobald dieser in einem Modul steht:

    Sub seite2_UVG_Beitrag_UVGNormal()
    ' Einschluss UVG Zusatzbeitrag

    Dim german As Boolean
    Dim french As Boolean
        french = RecapV5.selectF.Value
        german = RecapV5.selectG.Value

    Dim docZiel As Word.Document
    Dim docQuelle As Word.Document
    Dim rngZiel As Word.Range
    Dim rngQuelle As Word.Range
    Dim oBM As Bookmark
    Dim rgTextMarke As Range

        Set docZiel = ActiveDocument
        Set rngZiel = Selection.Range

    ' Bestehenden Text löschen und Bookmark wiederum neu setzen
        If ActiveDocument.Bookmarks.Exists("ibDokumentBeitragUVGZ") Then
            Set rgTextMarke = ActiveDocument.Bookmarks("ibDokumentBeitragUVGZ").Range
        End If

    ' Neuen Text in Bookmark einfügen
        If german Then
            ChangeFileOpenDirectory recapDVBAV4
            Set docQuelle = Documents.Open(filename:="UVG_BeitragNormal.doc")
            docQuelle.Activate
        End If
       
        If french Then
            ChangeFileOpenDirectory recapFVBAV4
            Set docQuelle = Documents.Open(filename:="UVG_BeitragNormal.doc")
            docQuelle.Activate
        End If
       
        funcTextmarkeBefüllen1 doc1:=docQuelle, strTextmarkeName:="ibpruvg1", strTextmarkeText:=RecapV5.prUVG1
        funcTextmarkeBefüllen1 doc1:=docQuelle, strTextmarkeName:="ibpruvg3", strTextmarkeText:=RecapV5.prUVG3
            
        If german Then
            funcTextmarkeBefüllen1 doc1:=docQuelle, strTextmarkeName:="ibpruvgTXT1", strTextmarkeText:=RecapV5.beitragTXTuvg
        End If
                   
        If french Then
            funcTextmarkeBefüllen1 doc1:=docQuelle, strTextmarkeName:="ibpruvgTXT1", strTextmarkeText:=RecapV5.beitragTXTuvg
        End If
            
        Set rngQuelle = docQuelle.Range
        rngQuelle.SetRange Start:=rngQuelle.Start, End:=rngQuelle.End - 0
       
        If docZiel.Bookmarks.Exists("ibDokumentBeitragUVGZ") Then
        Set rngZiel = docZiel.Bookmarks("ibDokumentBeitragUVGZ").Range

        rngZiel.FormattedText = rngQuelle.FormattedText

        docQuelle.Saved = True
        docQuelle.Close wdDoNotSaveChanges

        Set oBM = docZiel.Bookmarks.Add(name:="ibDokumentBeitragUVGZ", Range:=rngZiel)
        End If
    End Sub

    Freitag, 24. September 2010 17:44
  • Hallo Andre,

    also aus meiner Sicht bräuchtest du nur die Function auszulagern.

    Ich verwende auch viel Userforms um Text in Textmarken zu füllen und hatte diesen Fehler noch nie.

    Wenn du denn unbedingt auch das UserForm als Objekt/Parameter übergeben möchtest, schau dir mal folgendes Beispiel an:

    Userform mit einer TextBox1.

    Dokument mit Textmarke "Test".

    Per Klick auf das UserForm wird der Inhalt von TextBox1 in die Textmarke geschrieben.

    Das Besondere ist nun, dass der UserForm-Name und TextBox1-Name als Parameter übergeben werden. In einer SChleife werden alle aktiven/geladenen UserForms durchlaufen und nach der übergebenen UserForm gesucht. Dann gehe ich davon aus, dass das Control auf dem UserForm ist und ermittel den Inhalt des Controls.

    Also im Endeffekt das gleiche wie im Urpsrungscode nur mit dem UserForm-Objekt als Parameter.

    UserForm:

    Private Sub UserForm_Click()
    Userform2Doc ActiveDocument, "Test", Me.Name, Me.TextBox1.Name
    End Sub
    

    Modul:

    Function Userform2Doc(ByRef oDoc As Document, sBM As String, sUF As String, sControl As String)
    Dim rngZiel As Range
    Dim oUserForm As Object
    Set oUserForm = objUF(sUF)
      If oDoc.Bookmarks.Exists(sBM) Then
      Set rngZiel = oDoc.Bookmarks(sBM).Range
      rngZiel.Text = oUserForm.Controls(sControl).Value
      Set oBM = oDoc.Bookmarks.Add(Name:=sBM, Range:=rngZiel)
      End If
    End Function
    
    Function objUF(sUF) As UserForm
    Dim oUF As Object
    For Each oUF In VBA.UserForms
      If oUF.Name = sUF Then
      Set objUF = oUF
      Exit For
      End If
    Next oUF
    End Function
    

    Gruß Christian
    Freitag, 24. September 2010 18:10