Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1900to1904
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array / Stapelspeicherfehler

Array / Stapelspeicherfehler
13.10.2022 17:07:13
Oliver
Hallo Liebe Gemeinde,
vielleicht könnt ihr ja bei meinem Problem helfen.
Ich habe eine Tabelle die ich über ein Datum filtere, diese gefilterte Tabelle lese ich dann über Array in eine Listbox ein. Habe das vorher mit .RowSource versucht was aber am Ende viel zu langsam beim öffnen war.
Beim Click auf die Listbox werden mir die Daten dann in Comboboxen und Textboxen angezeigt.
Nun wollte ich bei Änderung der Werte(Comboxen/ Textboxen) das diese in die Tabelle eingetragen werden. Das klappt auch wunderbar. Nur soll auch die Listbox die aktuellen Werte anzeigen. Am besten bei einer Click-Methode.
Dazu habe ich dann das Array neu auf Set gesetzt und wieder eingelesen. Hier kommt ein Stapelspeicher fehler. Bei AfterUpdate() Prozeduren für die Anzeige in der Listbox kommt dieser nicht. Nur ist es nicht das was ich gern hätte. Meine Überlegung dazu wäre aus der UserForm_Initialize() das Array in die anderen Subs zu übergeben, hier könnte man ja jederzeit auf dieses eine Array zugreifen, Oder? Oder eine Funktion mit dem Array ausführen und dann über die anderen Subs auf dieses zugreifen.
Eine andere Überlegung wäre zu prüfen welcher Wert geändert ist und nur diesen im Array ändern und dann in der Tabelle und in der Listbox.
Hier mal der Code für die Comboboxen zur Änderung in der Tabelle/Array/Listbox.
Diesen Code habe ich dann noch 2 mal für alle Textboxen.

Private Sub cb_Art1_AfterUpdate()
'globale Variablen
iSpalte = 1 'Spalte + 4 für Celle auf Tabelle 1
cb_Name = 1
Call speichern_cb_Art_AfterUpdate
End Sub
Private Sub cb_Art2_AfterUpdate()
iSpalte = 4
cb_Name = 2
Call speichern_cb_Art_AfterUpdate
End Sub
Private Sub cb_Art3_AfterUpdate()
iSpalte = 7
cb_Name = 3
Call speichern_cb_Art_AfterUpdate
End Sub
Private Sub cb_Art4_AfterUpdate()
iSpalte = 10
cb_Name = 4
Call speichern_cb_Art_AfterUpdate
End Sub
Private Sub speichern_cb_Art_AfterUpdate()
Dim rng As Range
Dim arr As Variant
Dim Listindex As Integer
Dim i As Long
'globale Variable - makierte Zeile Listbox
iZeile = ListBox1.List(ListBox1.Listindex, 19)
If Controls("cb_Art" & cb_Name) = "" Then
Tabelle1.Cells(iZeile, iSpalte + 4) = Left(Controls("cb_Art" & cb_Name), 1)
Else
If Len(Left(Controls("cb_Art" & cb_Name), 2))  1 Or IsNumeric(Left(Controls("cb_Art" & cb_Name), 2)) = False Or Controls("cb_Art" & cb_Name).Value >= 4 Then
MsgBox "Die Eingabe sollte eine Zahl zwischen 1-3 sein!
With app.Controls("cb_Art" & cb_Name)
.Listindex = 0
.SetFocus
End With
Exit Sub
ElseIf IsNumeric(Left(Controls("cb_Art" & cb_Name), 4)) Then
Tabelle1.Cells(iZeile, iSpalte + 4) = Left(Controls("cb_Art" & cb_Name), 1)
Else
MsgBox "Die Eingabe sollte eine Zahl zwischen 1-3 sein!
With app.Controls("cb_Art" & cb_Name)
.Listindex = 0
.SetFocus
End With
Exit Sub
End If
End If
' Ab hier auch in UserForm_Initialize() vorhanden/ Dieser wird quasi immer neu gesetzt
Set rng = Range("tblDaten").SpecialCells(xlCellTypeVisible)
ReDim arr(1 To rng.Rows.Count, 1 To rng.Columns.Count) 'Zeile/Spalte
arr = rng.Value
'Format 1.Spalte in Listbox auf ddd und 0000 ändern
For i = 1 To rng.Rows.Count
arr(i, 1) = Format(arr(i, 1), "ddd")
arr(i, 5) = Format(arr(i, 5), "0000")
arr(i, 11) = Format(arr(i, 11), "0000")
arr(i, 14) = Format(arr(i, 14), "0000")
Next
Listindex = ListBox1.Listindex
'Listbox mit Array füllen
ListBox1.List = arr
ListBox1.Selected(Listindex) = True
End Sub
Vielleicht könnt ihr mir beim übergeben des Arrays in den "Sub speichern_cb_Art_AfterUpdate()" helfen oder habt eine andere Idee wie ich den Stapelspeicherfehler umgehe.
Grüße Oliver

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array / Stapelspeicherfehler
13.10.2022 17:31:54
ralf_b
der stapelfehler kommt von dem sich immer wiederholenden Aufrufen von "speichern_cb_Art_AfterUpdate" . Darin erzeugst du ein weiteres Afterupdate event und rufst es wieder auf bevor der erste Aufruf abgeschlossen ist.
Der Normalfall ist es das man den Datensatz speichert wenn alle Änderungen abgeschlossen sind und nicht bei jedem einzelnen Control.
AW: Array / Stapelspeicherfehler
13.10.2022 17:40:44
Oliver
Hallo Ralf,
der Stapelfehler kommt beim Click Event. Beim AfterUpdate Event geht es durch und funktioniert.
Ich habe ingesamt 4 Kombofelder von 1-4 und jeweils 2 Textfelder von 1-4. Kann man denn anders prüfen welches Steuerelement geändert wurde und dann über
eine z.B. Select Case einen bestimmte Wert an die speichern Sub übergeben?
"Der Normalfall ist es das man den Datensatz speichert wenn alle Änderungen abgeschlossen sind und nicht bei jedem einzelnen Control."
Ich würde aber gern sofort bei Änderung, egal ob bei den Komboboxen oder den Textboxen, dies sofort ändern.
Geht das vielleicht anders?
Grüße Oliver
Anzeige
AW: Array / Stapelspeicherfehler
13.10.2022 17:53:51
ralf_b
Ich würde aber gern sofort bei Änderung,
naja, das mußt du selber wissen. Früher dachte ich auch so.
Eine mögliche Lösung bzgl Stapelfehler hat dir Yal ja schon gezeigt.
AW: Array / Stapelspeicherfehler
13.10.2022 17:56:52
Oliver
Hallo Ralf,
das habe ich getestet, funktioniert aber leider nicht.
Grüße Oliver
AW: Array / Stapelspeicherfehler
13.10.2022 17:39:21
Yal
Hallo Oliver,
ein Klassiker: Du hast Ereignis-Procedure, die starten, wenn etwas sich geändert hat (AfterUpdate), dann stossen die Procedure eine Änderung im Objekt, was eine Ereignis-Procedure startet... Ein Hund, der hinter seinen Schwanz rennt.
Beim Start von "speichern_cb_Art_AfterUpdate" sollte einen
Application.EnableEvents = False
und am Ende einen
Application.EnableEvents = True
sein.
VG
Yal
Anzeige
AW: Array / Stapelspeicherfehler
13.10.2022 17:44:45
Oliver
Hallo Yal,
das teste ich mal mit Click Events.
Grüße Oliver
AW: Array / Stapelspeicherfehler
13.10.2022 17:51:44
Oliver
Hallo Yal,
habe im Sub speichern_cb_Art_AfterUpdate das mal eingefügt, es kommt trotzdem der Fehler.
Und zwar in der Zeile:
Set rng = Range("tblDaten").SpecialCells(xlCellTypeVisible)
Kann es sein da ich die Range in mehreren Sub setze es daran liegt? Kann ich die Range irgendwie übergeben?
Grüße Oliver
AW: Array / Stapelspeicherfehler
13.10.2022 18:18:56
Daniel
Hi
Ändert sich die Range während die Userform geöffnet ist?
Wenn nein, dann solltest du die Range-Variable und das Array als globale oder zumindes modulweit gültige Variable deklarieren. Dann reicht es aus, wenn du sie im Initialize-Event der Userform befüllst und kannst diese Variablen mit Inhalt in allen anderen Subs der Userform verwenden.
Das hast du ja an anderer Stelle schon gemacht.
Du solltest nur beachten, dass wenn die Range aus mehreren Teilen besteht, (specialCells(xlcelltypevisible)) es nicht so einfach möglich ist, diese Werte als ganzes in ein Array zu über nehmen, weil VBA in der Regel dann nur den ersten Block verwendet, aber nicht den Rest.
Gruß Daniel
Anzeige
AW: Array / Stapelspeicherfehler
13.10.2022 19:18:23
Oliver
Hallo Daniel,
also die Range ändert sich nur wenn man das Datum allgemein ändert.
Hier sollte das neue Array eingelesen werden.

Private Sub cb_Monat_Change()
Dim rng As Range
Dim arr As Variant
Dim i As Long
Call UpdateDatum
Set rng = Range("tblDaten").SpecialCells(xlCellTypeVisible)
ReDim arr(1 To rng.Rows.Count, 1 To rng.Columns.Count) 'Zeile/Spalte
arr = rng.Value
'Format 1.Spalte in Listbox auf ddd ändern
For i = 1 To rng.Rows.Count
arr(i, 1) = Format(arr(i, 1), "ddd")
Next
'Listbox mit Array füllen
ListBox1.List = arr
End Sub
Private Sub UpdateDatum()
Dim Dat As Date
On Error Resume Next
With Worksheets("Eingabe")
Dat = DateSerial(cb_Jahr, cb_Monat.Listindex + 1, 1)
.Range("S1") = Dat
.Range("S2") = Dat
End With
End Sub
Die Textboxen und Comboboxen ändern die Werte der Range also in der Listbox.
Wie ändere ich das ab das ich das Range-Variable und das Array als globale Variable mache? Obwohl ich das lieber über eine Funktion machen würde.
Habt ihr da einen Ansatz?
Grüße Oliver
Anzeige
AW: Array / Stapelspeicherfehler
13.10.2022 19:39:45
Daniel
Naja Variable in einem allgemeinen Modul mit Public direkt unter Option Expicit deklarieren und dann gilt die Variable in allen anderen Makros.
Innerhalb der Makros darf sie nicht mehr Deklariert werden.
Aber das hattest du doch schon bei den CB_Art_afterUpdate-makros uns sollte daher bekannt sein.
Gruß Daniel
AW: Array / Stapelspeicherfehler
13.10.2022 19:45:54
Oliver
Hallo Daniel,
ja das hatte ich bereits bei den anderen Makros, habe auch die range schonmal global deklariert aber das funktioniert nicht.
Ich schreibe das mal in ein Modul.
Vielleicht war das mein Fehler.
Grüße Oliver
AW: Array / Stapelspeicherfehler
13.10.2022 18:07:08
Daniel
Hi
Übergib doch das control und die Spaltennummer als Parameter an speichern_cb_Art_AfterUpdate()
Dann brauchst du keine Globalen Variablen und der Code wird einfacher.
Also:

Private Sub speichern_cb_Art_AfterUpdate(CB_Art as Control, iSpalte as long)
Im weiteren Code dieses Makros wird dann aus Controls("cb_Art" & cb_Name) nur noch CB_Art, was das ganze übersichtlicher macht.
Auch die Aufrufenden Makros werden kürzer:

Private Sub cb_Art1_AfterUpdate()
Call speichern_cb_Art_AfterUpdate(cb_Art1, 1)
End Sub
Wenn du in der Sub speichern_cb_Art_AfterUpdate eine Aktion ausführen musst, die das After_Update_Event auslöst und es somit zu einer Endlosschleife von Aufrufen kommt, dann kann man die so unterbrechen:
1. globale Variable anlegen: Public EventsAus as boolean
2. in den Eventmakros fragst du diese Variable zu Beginn ab:

Private Sub cb_Art1_AfterUpdate()
If EventsAus then Exit Sub
End Sub
3. im Aktionsmakro setzt du jetzt das EventsAus auf True bevor du eine Aktion ausführt, die das Event unerwünscht startet, und hinter wieder auf False, damit die Events hinterher für den Anwender wieder normal funktionieren
Das simuliert das Applications.EnableEvents = False für die Events der Tabellenblätter, welches es bei Userformen nicht gibt.
Das Event wird zwar gestartet, aber dann sofort abgebrochen, so dass die dazugehörige Aktion nicht ausgeführt wird und es nicht zur Endlosschleife kommt.
Gruß Daniel
Anzeige
AW: Array / Stapelspeicherfehler
13.10.2022 19:21:58
Oliver
Hallo Daniel,
das teste ich mal. Aber danke schonmal.
Grüße Oliver
AW: Array / Stapelspeicherfehler
13.10.2022 19:36:36
Oliver
Hallo Daniel,
das funktioniert super! Ich teste das morgen mal mit den Textboxen. Da kommen ja noch 8 Click Events dazu.

Private Sub cb_Art1_Click()
If EventsAus Then Exit Sub
Call speichern_cb_Art_Click(1, 1)
End Sub
Private Sub cb_Art2_Click()
If EventsAus Then Exit Sub
Call speichern_cb_Art_Click(2, 4)
End Sub
Private Sub cb_Art3_Click()
If EventsAus Then Exit Sub
Call speichern_cb_Art_Click(3, 7)
End Sub
Private Sub cb_Art4_Click()
If EventsAus Then Exit Sub
Call speichern_cb_Art_Click(4, 10)
End Sub
Private Sub speichern_cb_Art_Click(cb_Name As Long, iSpalte As Long)
Dim rng As Range
Dim arr As Variant
Dim Listindex As Integer
Dim i As Long
EventsAus = True
'Application.EnableEvents = False
iZeile = ListBox1.List(ListBox1.Listindex, 19)
Set rng = Range("tblDaten").SpecialCells(xlCellTypeVisible)
ReDim arr(1 To rng.Rows.Count, 1 To rng.Columns.Count) 'Zeile/Spalte
arr = rng.Value
'Format 1.Spalte in Listbox auf ddd ändern
For i = 1 To rng.Rows.Count
arr(i, 1) = Format(arr(i, 1), "ddd")
arr(i, 5) = Format(arr(i, 5), "0000")
arr(i, 11) = Format(arr(i, 11), "0000")
arr(i, 14) = Format(arr(i, 14), "0000")
Next
Listindex = ListBox1.Listindex
'Listbox mit Array füllen
ListBox1.List = arr
ListBox1.Selected(Listindex) = True
EventsAus = False
'Application.EnableEvents = True
End Sub
Grüße Oliver
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige