es geht um diesen Thread: Daten kopieren, ergänzen und zurückkopieren Ich habe eine Beispieldatei erstellt, mit einem seltsamen Laufzeitfehler, den ich nicht verstehe. Das Programm listet mir in der Mahnliste alle Fristen auf, bei der 3. Mahnung kommt Laufzeitfehler 91 Deaktiviere ich den Befehl davor, so das 2. Mahnung NICHT mitgelistet wird, läuft das Makro durch.
Wieso macht eine IF Then Anweisung 6 Befehle anstandslos richtig, und verweigert den 7. Befehl? Es gibt keinen Zähler der das beeinflußten könnte. Sowas habe ich in 20 Jahren VBA nicht erlebt.
Vielleicht habe ich auch nur ein Brett vorm Kopf und sehe den eigenen Fehler nicht. Ich bin gespannt auf eure Antwort. Danke für eure Ausklärung...
26.02.2026, 15:17 (Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2026, 15:18 von knobbi38.)
Hallo Gast123,
das ist kein seltsamer Fehler, sondern die Folge von unerwünschten Seiteneffekten, wenn man mit globalen Variablen, in diesem Fall "AC", hantiert.
Deine Kopieraktion ".Cells(z, 6).Value = AC.Offset(0, 5)" löst das "Worksheet_Change" Event in Tabelle2 aus und in dessen Verlauf wird nach dem Verlassen der Schleife "For Each AC In RÜB.Range("H5:H" & lz1)" die Referenz AC auf Nothing gesetzt, was dann zum Fehler 91 in ".Cells(z, 7).Value = AC.Offset(0, 6) '** Error" in der Prozedur Daten_abrufen führt.
Daraus folgt: 1. Globale Variablen wegen den möglichen Seiteneffekten vermeiden und/oder 2. Verhindern, das das Worksheet_Change Event ausgelöst wird oder die Bedingungen innerhalb des Worksheet_Change Event korrigieren. Z.B. dadurch, dass keine negative Logik bei IF verwendet wird, sondern die einzelnen Teile nur dann ausgeführt werden, wenn die Bedingungen zutreffen. Ein "Exit Sub" gehört sowieso nicht in so eine Ereignisroutine ( bad practice !).
Knobbi38
Folgende(r) 1 Nutzer sagt Danke an knobbi38 für diesen Beitrag:1 Nutzer sagt Danke an knobbi38 für diesen Beitrag 28 • Gast 123
wenn du im Makro Daten-Abrufen die Zellwerte änderst, wird auch automatisch das Change-Eventmakro ausgelöst. die Prüfung in diesem Makro ergibt, dass der Hauptteil des Makros ausgeführt wird, wenn du eine Zelle in der Spalte F oder G änderst (Spalte 6 und 7) In diesem Hauptteil verwendest die Variable AC. Weil du aber AC auch im aufrufenden Makro "Daten_abrufen" verwendest und diese Variable als Projektweit gültig deklariert hast (Deklaration als Public außerhalb des Makros), verwendest du in beiden Makros die selbe Variable, dh die Änderungen, die das Change-Eventmakro mit dieser Variable durchführt, sind danach dann auch im Makro "Daten_abrufen" wirksam. Weil du im Change-Eventmakro ein For each AC in ... -Schleife hast, ist AC nach durchlauf dieser Schleife Nothing.
Abhilfe: - ich vermute mal, dass du AC aus Faulheit als projektweit Gültig deklariert hast, damit du sie nicht mehrfach in jedem Makro deklarieren musst. du solltest aber eine Variable nur dann Projekt weit gültig machen, wenn du sie wirklich für die Datenübertragung zwischen den einzelnen Makros benötigst, das ist hier aber nicht der fall, weil du sie nur als einfachen Schleifenzähler verwendest. - soll das Change-Makro wirklich ausgeführt werden, wenn du im Makro "Daten_abrufen" die Werte änderst? wenn nein, könntest du mit Application.EnableEvents = False dieses verhindern. Bitte nicht vergessen, vor Makroende wieder Application.EnableEvents = True zu programmieren, denn hier bleibt die letzte Einstellung erhalten und die Events werden auch dann nicht ausgeführt, wenn der Anwender von Hand die Werte ändert.
Gruß Daniel
Folgende(r) 1 Nutzer sagt Danke an slowboarder für diesen Beitrag:1 Nutzer sagt Danke an slowboarder für diesen Beitrag 28 • Gast 123
die Ursache ist dies: AC.Offset(0, 5) = Cells(Target.Row, 6). Da weist du einer Public Range Variable einen String zu.
Folge: Unsichtbarer Einsturz dieser Variable.
Gruß Uwe
Hi Uwe nein, das stimmt nicht. der Variable AC wird hier nichts zugewiesen, eine Zuweisung an die Variable AC müsste so programmiert werden: Set AC = ... Hier wird einfach nur ein Wert in eine Zelle geschrieben (.Value ist die Default-Eigenschaft eines Range-Objektes, also die Eigenschaft, die verwendet wird, wenn keine Eigenschaft angeben ist. ) die Variable "stürzt ein", weil sie die Schleifenvariable in einer Objekt-Schleife ist (for each AC in RÜB.Range(...)) und so eine Schleifenvariable nach vollständigem Schleifendurchlauf auf Nothing gesetzt wird.
herzlichen Dank für eure Hilfe, wie ich schon sagte, das "eigene Brett vorm Kopf"! Ich war mit Public AC zu faul, diese Variable in jedem Sheet neu zu programmieren. Und hatte völlig vergessen, das man Daten zurückschreiben soll! Change-Events!
Eine alte Weisheit aus meiner Zeit als Bankkaufmann! Prüfe NIE selbst die Kasse, wenn sie nicht stimmt! Eine Kollege schaut auf die Belege, und sagt: "da ist doch der Fehler!" Die berühmte Denksperre .....