Automatisierungsfehler in Excel VBA

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Blaupunkt79.

    Automatisierungsfehler in Excel VBA

    Hallo Zusammen,

    ich habe ein auf Excel VBA basierendes Programm geschrieben, mit dem man Bestell-Listen (excel-dateien) für Kunden erstellen kann.

    Leider komme ich mit einer Fehlermeldung nicht weiter.

    Wenn ich eine Bestell-Liste ändere und Artikel bearbeite, öffnet sich per Doppelklick auf die Bestell-Liste ein Fenster. Nun kann ich den Artikeltext etc. ändern. Das funktioniert auch soweit gut, die Bestell-Liste wird nach der Änderung aktualisiert und so weiter. Möchte ich nun eine größere Anzahl an Artikeln ändern, so erfolgt nach ca. 80 aufrufen bei Klick auf "OK" ein "Automatisierungsfehler das aufgerufene objekt wurde von den clients getrennt". Habe zum Verständnis 2 Bilder mit drangehängt.

    Bestell-Liste:

    bilder-upload.eu/show.php?file=ce52b4-1528662360.jpg

    Wird nach Doppelklick auf einen Artikel aufgerufen:

    bilder-upload.eu/show.php?file=6c31bc-1528662468.jpg

    Der Fehler tritt lt. Debug an folgender Stelle auf:

    VB.NET-Quellcode

    1. Set rng = Worksheets("food").Range("a1:a" & nummer2).Find(artikelnummer999, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)


    Hier ist der Code, wenn ich auf "OK" klicke:

    VB.NET-Quellcode

    1. Dim i As Integer
    2. Dim rng As Range
    3. Dim nummer2 As Long
    4. On Error GoTo fehler
    5. GoTo beginn
    6. fehler:
    7. MsgBox ("Fehlermeldung: " & Err.Description)
    8. GoTo zuende
    9. beginn:
    10. logtext = "Anwahl: OK"
    11. Call loggen
    12. If TextBox6 = "" Then MsgBox ("Bitte füllen Sie das Feld 'I-EK' aus!"): logtext = "Feld I-EK leer.": Call loggen: GoTo zuende
    13. If TextBox7 = "" Then MsgBox ("Bitte füllen Sie das Feld 'I-VK' aus!"): logtext = "Feld I-VK leer.": Call loggen: GoTo zuende
    14. If TextBox8 = "" Then MsgBox ("Bitte füllen Sie das Feld 'VA' aus!"): logtext = "Feld Verpackungsart leer.": Call loggen: GoTo zuende
    15. If TextBox9 = "" Then MsgBox ("Bitte füllen Sie das Feld 'Artikeltext' aus!"): logtext = "Feld Artikeltext leer.": Call loggen: GoTo zuende
    16. Worksheets("aendern").Range("c" & multi) = TextBox6
    17. Worksheets("aendern").Range("D" & multi) = TextBox7
    18. Worksheets("aendern").Range("E" & multi) = TextBox8
    19. Worksheets("aendern").Range("B" & multi) = TextBox9
    20. Worksheets("aendern").Range("m" & multi) = ""
    21. artikelnummer999 = CStr(Worksheets("aendern").Range("a" & multi))
    22. nummer2 = Worksheets("food").Range("a" & Rows.Count).End(xlUp).Row
    23. Set rng = Worksheets("food").Range("a1:a" & nummer2).Find(artikelnummer999, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
    24. If rng Is Nothing Then VA = "": GoTo allesersetzt
    25. Worksheets("food").Range("C" & rng.Row) = TextBox6
    26. Worksheets("food").Range("d" & rng.Row) = TextBox7
    27. nummer2 = Worksheets("einheit").Range("b" & Rows.Count).End(xlUp).Row
    28. For i = 1 To nummer2
    29. If TextBox8 = Worksheets("Einheit").Range("b" & i) Then GoTo weiter
    30. Next i
    31. MsgBox ("Einheit nicht gefunden, konnte somit nicht ersetzt werden!"): GoTo weiter1
    32. weiter:
    33. Worksheets("food").Range("e" & rng.Row) = Worksheets("Einheit").Range("a" & i)
    34. weiter1:
    35. ww7 = ww7 + 1
    36. logtext = "Inhalt EK/VK bei Artikel " & Worksheets("aendern").Range("a" & multi) & " " & Worksheets("aendern").Range("b" & multi) & " geändert.": Call loggen
    37. allesersetzt:
    38. merke = 1
    39. merke1 = 0
    40. verschieben = 0
    41. Aendern2.Hide
    42. Aendern.Hide
    43. Load Aendern
    44. Aendern.Show
    45. zuende:


    Danke

    Gruß
    Bau mal folgenden Rahmen;

    Visual Basic-Quellcode

    1. On Error Goto ErrHandler
    2. '... dein Code
    3. ErrHandler:
    4. If Err,Number <> 0 Then
    5. Debug.Print Err.Description
    6. Stop
    7. Resume
    8. End If

    Wenn du bei deinem 80. Durchlauf auf Fehler läufst, hält er bei Stop.
    Dann kommst du mit 2x SingleStep (F8) an die Stelle, die streikt.
    Dort kannst du mit dem Debugger rausfinden, welches der Objekte sich in Luft aufgelöst hat.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo Blaupunkt79,
    das Verlasssen einer Schleife mit Goto verursacht ein Problem. Die Daten
    für die Schleife werden auf einem Stack abgelegt. Wenn die Schleife
    nicht korrekt mit Next (oder Exit) beendet wird, bleiben die Daten auf
    dem Stack, so dass er immer voller wird.
    Weiterhin lädst du eine bereits geladene Form (Load Aendern). Wenn du
    eine Form mit Show aufrufst wird sie automatisch geladen.
    Gruss,

    Neptun