Stapelfehler bei Datumsabgleich
#1
Hallo zusammen,

ich möchte gerne zwei Tagesdaten vergleichen (in A1 und A2) und dann, wenn die Bedingung erfüllt ist, in Zelle A3 einen Text schreiben lassen.
A1 und A2 sind jeweils als Datum formatiert. In A1 habe ich das heutige Datum (21.09.22) und in A2 habe ich das morgige Datum (22.09.22) eingetragen. Der Rest der Arbeitsmappe ist unangetastet und rein.

Leider bekomme ich jedes Mal beim Start der Datei einen Stapelfehler 28 und will die erste Zeile des Codes debuggen, obwohl er die Aktion letztlich doch ausführt und den Text tatsächlich noch in A3 reinschreibt.

Was mache ich bei folgendem Code falsch??


Code:
Private Sub Worksheet_Change(ByVal Target As Range)

    If Range("a1") <= Range("a2") Then
    Range("a3").Value = "KW 39+40"
    End If
   
End Sub
   

Leider komme ich selbst bei diesem vermeintlich einfachen und kurzen Code nicht alleine weiter und würde mich über Ratschläge freuen.

Danke und viele Grüße ins Forum
Antworten Top
#2
Hi,

du rennst hier in eine Endlos-Schleife, da deine Routine das Worksheet ändert und die Routine dadurch erneut aufgerufen wird und wieder etwas ändert und wieder aufgerufen wird und ...

Abhilfe:
entweder vor dem Schreiben die Events ausschalten oder prüfen ob eine der beiden Ausgangszellen im Target steckt. Am Besten beides.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
[-] Folgende(r) 1 Nutzer sagt Danke an HKindler für diesen Beitrag:
  • junjor
Antworten Top
#3
Hallo,

oder du nimmst anstelle der Change-Funktion das Worksheet_Activate-Ereignis.
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
[-] Folgende(r) 1 Nutzer sagt Danke an Glausius für diesen Beitrag:
  • junjor
Antworten Top
#4
..wozu dafür VBA notwendig ist, bleibt Dein Geheimnis. In A3 folgende Funktion: =Wenn(A1 <= A2;"Dein Text";"")

Und wenn schon VBA, dann so:


Code:
If target.count = 1 and (Target.Address(0,0) = "A1" or target.address(0,0) = "A2") and(cells1,1) <= cells(2,1) then
cells(3,1) = "Dein Text"
else
cells(3,1) = null
endif
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

[-] Folgende(r) 1 Nutzer sagt Danke an Ralf A für diesen Beitrag:
  • junjor
Antworten Top
#5
So, habe ich das noch hinbekommen.


Code:
Private Sub Worksheet_Change(ByVal Target As Range)

   
    If Range("a1") <= Range("a2") Then
    Application.EnableEvents = False
    Range("a3").Value = "KW 39+40"
    Application.EnableEvents = True

    End If
   

   
End Sub
[-] Folgende(r) 1 Nutzer sagt Danke an Charmin für diesen Beitrag:
  • junjor
Antworten Top
#6
Big Grin 
Ich habe es eben zuerst mit dem Vorschlag von Charmin versucht und es hat auf Anhieb funktioniert.
Insofern belasse ich es dabei, möchte mich aber ausdrücklich bei euch allen vielmals für die konstruktiven und schnellen Antworten und lehrreichen Hinweise bedanken!!!!
Ein super Forum hier!!    28
Antworten Top
#7
...ich spiele ja nur ungern den Spielverderber, aber Charmin's Vorschlag hat einen kleinen Schönheitsfehler. Wenn einmal KW39 + 40 in der Zelle steht, ändert sich nie mehr etwas am Inhalt von A3. Auch dann nicht, wenn irgendwann mal A2 > A1 ist... kann mir nicht vorstellen, dass das so gewollt ist...
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#8
Außerdem passiert das immer noch bei jeder Änderung irgendeiner Zelle im Worksheet.
PHP-Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If 
Not Intersect(TargetRange("A1:A2")) Is Nothing Then
    
If Range("a1") <= Range("a2"Then
        Application
.EnableEvents False
        Range
("a3") = "KW 39+40"
        Application.EnableEvents True
    
Else
        Application.EnableEvents False
        Range
("A3").ClearContents
        Application
.EnableEvents True
    End 
If
End If   
End Sub 
Hier bräuchte man eigentlich kein Application.EnableEvents, denn wenn etwas in A3 geändert wird (was die Routine ja macht), passiert beim erneuten Aufruf dieses Events nichts, da A3 außerhalb von Range("A1:A2") liegt.
Allerdings: sicher ist sicher. Es könnte ja sein, dass du mal etwas ändern willst und in einen Bereich schreiben, der überwacht wird.
Wenn man die Events ausschaltet, sollte man sie tunlichst wieder einschalten. Daher so wenig Befehle wie möglich ohne Events ausführen. Hier könnte z.B. beim Vergleich von A1 mit A2 ein Fehler auftreten. Z.B. wenn eine der beiden Zellen einen Fehlerwert enthält. Dann würde die Routine einfach so abbrechen. Wären dann die Events ausgeschaltet würde das so bleiben.

So ich gehe mal davon aus, dass du in Wirklichkeit mehr machen willst. Denn für den gezeigten Fall ist VBA völlig überflüssig und viel zu umständlich. Es reicht die Formel =WENN(A1<=A2;"KW 39+40";"") in A3.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste