Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Stacküberlauf

Forumthread: Stacküberlauf

Stacküberlauf
18.03.2025 12:16:29
JWK
Guten Tag zusammen,
ich habe schon seit einigen Jahren in VBA nichts mehr gemacht und meine Kenntnisse sind daher nur noch bescheiden.
Für die Berechnung nutze ich den Aufruf
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("C4:J14")
......
Das funktioniert auch wunderbar !! Wenn ich allerdings die Zellen mit vordefinierten Werten automatisch belegen möchte [z.B.: cells(5,10)=20] erhalte ich einen Stacküberlauf.
Ändere ich manuell den Bereich um, in z.B.: Set KeyCells = Range("A1:A1"), gibt es keine Probleme.
Ich suche nun eine Lösung, wie ich in VBA den vorher definierten Bereich ändern kann. Alle meine bisherigen Versuche misslangen.
Kann mir bitte jemand helfen?
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Stacküberlauf
18.03.2025 12:21:15
Yal
Hallo JWK,

1. wann soll "Worksheet_Change" reagieren?
2. und was macht Worksheet_Change?
3. was passiert dann im Hintergrund?

zuerst nachdenken, dann Antwort anschauen.












zu 1. : reagiert, wenn der Inhalt einer Zelle geändert wurde
zu 2. : ändert der Inhalt einer Zelle
zu 3. : endlose Schleife


Lösung: Ereignis-Procedure blockieren:
Application.EnableEvents = False
am Anfang und
Application.EnableEvents = True
am Ende

VG
Yal



Anzeige
AW: Stacküberlauf
18.03.2025 13:40:46
daniel
Hi
wenn du so ein Eventmakro erstellst und die Aktion, die das Eventmakro auslöst, von diesem Makro ausgeführt wird, dann ruft sich das Makro selber auf.
wenn man da nicht aufpasst, bekommt man eine Endlosschleife, weil das Makro dabei ständig neu gestartet wird.
Stack ist der Speicher, in dem die Variablen des alten Aufrufs kommen, damit diese wieder verwendet werden, wenn der neue Aufruf durchgelaufen ist.
bei einer Endlosschleife kommen immer wieder neue Werte in den Stack und irgendwann ist der Speicher voll, dann bekommst du den Fehler (sonst müsstest du ewig warten)

das einfachste ist, wenn das ChangeEventmakro selbst Werte ändert und sich dabei nicht selbst aufrufen soll, diesen automatischen Makrostart mit Application.EnableEvents = False zu unterbinden.
Danach kannst du dann im Makro Zellen ändern, ohne dass da ChangeEvent-Makro gestartet wird.

du darfst nur nicht vergessen, bei Makroende die Events wieder zu aktivieren (Application.EnableEvents = True), denn sonst bleiben sie dauerhaft ausgeschaltet.
sollte mal der Fall passieren, beispielsweise nach einen Fehlerabbruch, musst du diesen Befehl im Direktfenster eingeben.

Gruß Daniel
Anzeige
AW: Stacküberlauf
18.03.2025 13:57:01
JWK
Besten Dank für die Antworten !! Ja, es funktioniert nun so, wie ich es möchte.
Lediglich musste ich die Reihenfolge vertauschen, d.h. am Anfang
Application.EnableEvents = True
und vor der automatischen Vorbelegung dann eben Application.EnableEvents = False.

Vielen herzlichen Dank !!
Anzeige
AW: Stacküberlauf
18.03.2025 14:20:14
Yal
Jein: immer am Anfang ausschalten, immer am Ende wiedereinschalten.

Umgekehrt ist weder sinnig noch auf langer Sicht lauffähig (eigentlich sollte es gar nicht funktionieren)

Private Sub Worksheet_Change(ByVal Target As Range)

Dim KeyCells As Range

Application.EnableEvents = False
Set KeyCells = Range("C4:J14")
'...
Application.EnableEvents = True
End Sub


VG
Yal
Anzeige
AW: Stacküberlauf
18.03.2025 18:06:54
JWK
Yal, ich verbeuge mich vor deiner Weisheit ! Ich habe es nun doch komplett umstellen müssen, denn beim ausgiebigem Testen kamen die Fehler...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("C4:J14")
Dim...
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
...
If strVOR = "R" Or strVOR = "r" Then
Application.EnableEvents = False
Cells(4,3)=sglVCu
...
Application.EnableEvents = True
End If
End If
Anzeige
AW: Stacküberlauf
19.03.2025 10:28:29
Yal
Hallo JMK,

ich kann aus deinem Beispiel nicht entnehmen, wo eine Fehler verursacht werden kann.

Target ist ein Range und kann als solche direkt in Intersect verwendet werden.
Dieser Code funktioniert nur, weil bei einem Worksheet_Change üblicherweise das Blatt aktiv ist, wo "C4:J14" gemeint ist. Sonst wäre der Bereich nicht eindeutig genug definiert und man müsste mit Target.Parent (Parent von einem Range ist ein Blatt, also Worksheet) es definieren:
Private Sub Worksheet_Change(ByVal Target As Range)

Const cPrüfAdress = "C4:J14"

If Not Application.Intersect(Target.Parent.Range(cPrüfAdress), Target) Is Nothing Then
If UCase(strVOR) = "R" Then
Application.EnableEvents = False
Cells(4, 3) = sglVCu
Application.EnableEvents = True
End If
End If
End Sub


VG
Yal
Anzeige
AW: Stacküberlauf
19.03.2025 10:48:58
GerdL
Moin Yal!

Dieser Code funktioniert nur, weil bei einem Worksheet_Change üblicherweise das Blatt aktiv ist, wo "C4:J14" gemeint ist.

Das ist zwar aktiv. Das Parent (Worksheet) von Range oder Cells ohne Blattangabe im Tabellenblattmodul ist Me;
also das Blatt des Eventmakros. Daher muss man es i.d.R. nicht davorschreiben.

Ansonsten könnte man am Code bestimmt noch schrauben, wenn der Fragesteller die fehlenden Variablendeklarationen u. -zuweisungen
zeigen u. den Zweck der Übung mitteilen würde.

Gruß Gerd
Anzeige
Tatsächlich. wie könnte ich "Me" übersehen... owT
19.03.2025 13:51:32
Yal
AW: Stacküberlauf
18.03.2025 16:00:32
UweD
Hallo


Wenn du es ganz genau nimmst, solltest du noch eine Fehlerbehandlung mit einbauen.

Denn im Fehlerfall bleiben Events ausgeschaltet und dann läuft erst mal nichts mehr automatisch.

So in der Art.

Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fehler
Const APPNAME = "Worksheet_Change"

Dim KeyCells As Range

Set KeyCells = Range("C4:J14")

' Dein Code...
'..


Application.EnableEvents = False
KeyCells = 20 'hier würde das event sich selbst wieder aufrufen
Application.EnableEvents = True



'dein weiterer Code
'
'

'*** Fehlerbehandlung
Err.Clear
Fehler:
Application.EnableEvents = True
If Err.Number > 0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub


LG UweD
Anzeige
AW: Stacküberlauf
18.03.2025 18:09:21
JWK
Danke für den hilfreichen Hinweis mit Beispiel !!!
Das fehlt leider im Moment und muss ich natürlich noch einfügen.

Viele Grüße und einen schönen Abend
JWK
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18