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

Forumthread: VBA: nicht genügend stapelspeicher Fehler 28

VBA: nicht genügend stapelspeicher Fehler 28
05.01.2018 11:36:12
Balduris
Guten Morgen,
ich bin relativ unerfahren was VBA / Markos angeht, weiss mir aber auf Grund der Umstände nicht anders zu helfen. Die Zirkelbezuglösung die ich ursprünglich genutzt hatte, führte zu Fehlbedienungen durch andere Nutzer, daher die VBA Lösung.
Durch meine Unkenntnis hat sich allerdings auf schwächeren Rechnern ein Fehler eingeschlichen, den ich nicht allein behoben bekomme.
Was soll passieren: wenn z.B. in Zelle B15 ein Betrag eingegeben wird, soll in Zelle C15 der Betrag mit 1,19 multipliziert automatisch eingetragen werden (und umgekehrt, einfache brutto / netto Berechnung, bei der der Nutzer die Wahl hat ob er B oder C mit Daten füttert).
Funktioniert so weit auch, allerdings habe ich wohl eine Endlosschleife produziert, die bei einigen Rechnern zu dem angesprochenen Fehler führt.
Der von mir verwendete Code:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$12" Then Range("C12") = Range("B12") * 1.19
If Target.Address = "$C$12" Then Range("B12") = Range("C12") / 1.19
If Target.Address = "$B$13" Then Range("C13") = Range("B13") * 1.19
If Target.Address = "$C$13" Then Range("B13") = Range("C13") / 1.19
If Target.Address = "$B$15" Then Range("C15") = Range("B15") * 1.19
If Target.Address = "$C$15" Then Range("B15") = Range("C15") / 1.19
If Target.Address = "$B$16" Then Range("C16") = Range("B16") * 1.19
If Target.Address = "$C$16" Then Range("B16") = Range("C16") / 1.19
If Target.Address = "$B$17" Then Range("C17") = Range("B17") * 1.19
If Target.Address = "$C$17" Then Range("B17") = Range("C17") / 1.19
If Target.Address = "$B$18" Then Range("C18") = Range("B18") * 1.19
If Target.Address = "$C$18" Then Range("B18") = Range("C18") / 1.19
If Target.Address = "$B$19" Then Range("C19") = Range("B19") * 1.19
If Target.Address = "$C$19" Then Range("B19") = Range("C19") / 1.19
If Target.Address = "$B$20" Then Range("C20") = Range("B20") * 1.19
If Target.Address = "$C$20" Then Range("B20") = Range("C20") / 1.19
If Target.Address = "$B$21" Then Range("C21") = Range("B21") * 1.19
If Target.Address = "$C$21" Then Range("B21") = Range("C21") / 1.19
End Sub
Kann mir jemand verraten, wie ich die vermutete Endlosschleife loswerde?
Besten Dank im Voraus
VG Balduris
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: nicht genügend stapelspeicher Fehler 28
05.01.2018 11:47:37
UweD
Hallo
da du per Makro wieder eine Zelländerung vornimmst, wird das Event immer wieder aufgerufen.
Also vorher ausschalten. und am Ende wieder ein.
Im Fehlerfall würde das schiefgehen, deshalb noch eine Fehlerbehandlung drumherumbauen.
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fehler
    Application.EnableEvents = False
    
    If Target.Address = "$B$12" Then Range("C12") = Range("B12") * 1.19
    If Target.Address = "$C$12" Then Range("B12") = Range("C12") / 1.19
    If Target.Address = "$B$13" Then Range("C13") = Range("B13") * 1.19
    If Target.Address = "$C$13" Then Range("B13") = Range("C13") / 1.19
    If Target.Address = "$B$15" Then Range("C15") = Range("B15") * 1.19
    If Target.Address = "$C$15" Then Range("B15") = Range("C15") / 1.19
    If Target.Address = "$B$16" Then Range("C16") = Range("B16") * 1.19
    If Target.Address = "$C$16" Then Range("B16") = Range("C16") / 1.19
    If Target.Address = "$B$17" Then Range("C17") = Range("B17") * 1.19
    If Target.Address = "$C$17" Then Range("B17") = Range("C17") / 1.19
    If Target.Address = "$B$18" Then Range("C18") = Range("B18") * 1.19
    If Target.Address = "$C$18" Then Range("B18") = Range("C18") / 1.19
    If Target.Address = "$B$19" Then Range("C19") = Range("B19") * 1.19
    If Target.Address = "$C$19" Then Range("B19") = Range("C19") / 1.19
    If Target.Address = "$B$20" Then Range("C20") = Range("B20") * 1.19
    If Target.Address = "$C$20" Then Range("B20") = Range("C20") / 1.19
    If Target.Address = "$B$21" Then Range("C21") = Range("B21") * 1.19
    If Target.Address = "$C$21" Then Range("B21") = Range("C21") / 1.19
    '*** Fehlerbehandlung 
    Err.Clear
Fehler:
    Application.EnableEvents = True
    If Err.Number <> 0 Then MsgBox "Fehler: " & _
        Err.Number & vbLf & Err.Description: Err.Clear
End Sub

LG UweD
Anzeige
eleganter
05.01.2018 12:02:00
UweD
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fehler
    Dim Z
    If Target.Row >= 12 And Target.Row <= 21 Then
    
        Application.EnableEvents = False
        For Each Z In Target
            Select Case Z.Column
                Case 2
                    Z.Offset(0, 1) = Z * 1.19
                Case 3
                    Z.Offset(0, -1) = Z / 1.19
                Case Else
                    GoTo Fehler
            End Select
        Next
        
    End If
    '*** Fehlerbehandlung 
    Err.Clear
Fehler:
    Application.EnableEvents = True
    If Err.Number <> 0 Then MsgBox "Fehler: " & _
        Err.Number & vbLf & Err.Description: Err.Clear
End Sub

LG UweD
Anzeige
AW: VBA: nicht genügend stapelspeicher Fehler 28
05.01.2018 12:12:43
Balduris
Hallo Uwe,
vielen Dank für deine schnelle Hilfe. Das funktioniert einwandfrei!
Ich sehe schon: Wenn ich VBA in Zukunft nutzen möchte, habe ich noch einen laaangen Weg vor mir :)
Danke und LG zurück
Balduris aka Alex
AW: VBA: nicht genügend stapelspeicher Fehler 28
05.01.2018 11:57:17
Werner
Hallo Bladuris,
das würde ich mit Select Case angehen. Application.Enableevents hat Uwe ja schon angesprochen.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Or Target.Column = 3 Then
If Target.Count > 1 Then
MsgBox "Mehrfachauswahl unzulässig"
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
If Target.Row >= 12 And Target 
Gruß Werner
Anzeige
@ Werner
05.01.2018 12:04:18
UweD
hab nicht abgeschrieben, hatte den gleichen Gedanken
LG UweD
AW: @ Uwe
05.01.2018 12:07:05
Werner
Hallo Uwe,
kann ja jeder sagen.;-D
Ist doch kein Problem, zwei Personen, ein Gedanke.
Gruß Werner
AW: VBA: nicht genügend stapelspeicher Fehler 28
05.01.2018 12:17:28
Balduris
Hallo Uwe, hallo Werner,
ich werde mich bei Gelegenheit damit beschäftigen und das probieren.
Erstmal bin ich heilfroh, das es jetzt geht!
Wie bereits erwähnt: ... noch ein langer Weg liegt vor mir.
Danke euch!
VG
Anzeige
Gerne u. Danke für die Rückmeldung. o.w.T.
05.01.2018 12:35:53
Werner
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA Fehler 28: Nicht genügend Stapelspeicher beheben


Schritt-für-Schritt-Anleitung

Um den Fehler "nicht genügend Stapelspeicher" in Excel VBA zu beheben, kannst du folgende Schritte befolgen:

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Finde das entsprechende Arbeitsblatt: Doppelklicke auf das Arbeitsblatt, in dem du den Code hast.
  3. Aktualisiere den Code:
    • Setze Application.EnableEvents = False am Anfang des Codes und Application.EnableEvents = True am Ende.
    • Füge eine Fehlerbehandlung hinzu, um sicherzustellen, dass die Ereignisse auch bei einem Fehler wieder aktiviert werden.

Hier ist ein Beispiel für den aktualisierten Code:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fehler
    Application.EnableEvents = False

    ' Deine Logik hier
    If Target.Address = "$B$12" Then Range("C12") = Range("B12") * 1.19
    ' Füge hier weitere Bedingungen hinzu...

Fehler:
    Application.EnableEvents = True
    If Err.Number <> 0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description
    Err.Clear
End Sub

Häufige Fehler und Lösungen

  • Endlosschleife: Der häufigste Grund für den Fehler "nicht genügend Stapelspeicher" ist eine Endlosschleife in der Worksheet_Change-Routine. Dies geschieht, wenn du durch das Makro eine Zelländerung auslöst, die wiederum das Ereignis erneut auslöst. Die oben genannten Anpassungen mit Application.EnableEvents helfen, dieses Problem zu lösen.

  • Fehler 28: Wenn du "Fehler 28" siehst, liegt das in der Regel daran, dass dein Code zu viele verschachtelte oder sich wiederholende Aufrufe hat. Reduziere die Komplexität deines Codes, indem du z.B. eine Schleife oder Select Case verwendest, um ähnliche Bedingungen zusammenzufassen.


Alternative Methoden

Eine alternative Methode, um den Fehler "nicht genügend Stapelspeicher" zu vermeiden, ist die Verwendung von Select Case. Dies vereinfacht den Code und reduziert die Wahrscheinlichkeit von Fehlern:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fehler
    Application.EnableEvents = False

    Select Case Target.Column
        Case 2 ' B-Spalte
            Target.Offset(0, 1) = Target.Value * 1.19
        Case 3 ' C-Spalte
            Target.Offset(0, -1) = Target.Value / 1.19
    End Select

Fehler:
    Application.EnableEvents = True
    If Err.Number <> 0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description
    Err.Clear
End Sub

Praktische Beispiele

Hier sind einige praktische Beispiele, wie du den Fehler "nicht genügend Stapelspeicher" in Excel VBA vermeiden kannst:

  • Beispiel 1: Einfache Umsatzsteuerberechnung zwischen zwei Zellen.
  • Beispiel 2: Validierung der Eingabe, um sicherzustellen, dass nur eine Zelle gleichzeitig bearbeitet werden kann.
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then
        MsgBox "Mehrfachauswahl unzulässig"
        Application.EnableEvents = False
        Application.Undo
        Application.EnableEvents = True
        Exit Sub
    End If
    ' Weitere Logik hier...
End Sub

Tipps für Profis

  • Verwende Application.Undo: Dies kann nützlich sein, um unerwünschte Änderungen rückgängig zu machen, falls ein Fehler auftritt.
  • Fehlerbehandlung verbessern: Stelle sicher, dass deine Fehlerbehandlung immer Application.EnableEvents = True aufruft, auch wenn ein Fehler auftritt. So wird verhindert, dass Excel in einen Zustand gelangt, in dem Ereignisse nicht mehr ausgelöst werden.
  • Testen auf verschiedenen Rechnern: Manchmal kann der Fehler "nicht genügend Stapelspeicher" nur auf bestimmten Rechnern auftreten. Teste deinen Code auf verschiedenen Systemen, um sicherzustellen, dass er überall funktioniert.

FAQ: Häufige Fragen

1. Was ist Fehler 28?
Fehler 28 in Excel VBA tritt auf, wenn der Stapelspeicher erschöpft ist, oft verursacht durch rekursive Aufrufe oder Endlosschleifen.

2. Wie kann ich den Fehler "nicht genügend Stapelspeicher" vermeiden?
Aktiviere und deaktiviere die Ereignisse in deinem Code mit Application.EnableEvents, um zu verhindern, dass Änderungen durch dein Makro erneut das Ereignis auslösen.

3. Welche Excel-Version benötige ich für VBA?
VBA ist in Microsoft Excel 2010 und späteren Versionen verfügbar. Stelle sicher, dass deine Version das Arbeiten mit Makros unterstützt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige