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

worksheet_change nicht immer ausführen

Forumthread: worksheet_change nicht immer ausführen

worksheet_change nicht immer ausführen
26.03.2021 14:30:27
Dennis
Hallo Zusammen,
mit Excel und VBA habe ich mir ein Formular erstellt, bei dem durch die Eingabe von bestimmten Werten in unterschiedliche Zellen Zeile/Passagen vom Formular ein- und ausgeblendet werden können.
Realisiert habe ich das mit "worksheet_change" und unterschiedlichen if, elseif - Abfragen. D.h. pro Zelle zum Ein-/Ausblenden eine If-Bedingung mit dazugehörigen elseIf-Bedingungen. Das Funktioniert auch.
Mein Problem ist, dass "worksheet_change" jedes mal aufgerufen wird, wenn etwas in einer beliebigen anderen Zelle eingetragen wurde.
Aufgrund von 17 if-Abfragen ist hier die Ladezeit relativ lange.
Nun ist meine Frage, ob eine Möglichkeit existiert, "worksheet_change" nur dann auszuführen, wenn die Ein-/Ausblend-Zellen ausgewählt wurden oder ein alternativer Ansatz.
z. B. etwas in Richtung:
Sub Befehl_...(...)
if 1.RelevanteZelle OR ... OR LetzeRelevanteZelle then
worksheet_change
end if
End Sub

Vielen Dank im Voraus!
Dennis

Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: worksheet_change nicht immer ausführen
26.03.2021 14:35:01
Werner
Hallo,
eine erste Alternative wäre, dass du hier mal dein Makro zeigst.
Gruß Werner

AW: worksheet_change nicht immer ausführen
26.03.2021 14:44:47
Dennis
Anbei ein Auszug des Codes
Sub Worksheet_Change(ByVal Target As Range)
If Range("C155").Value = "1" Then
Range("157:162").EntireRow.Hidden = False
Range("163:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "2" Then
Range("157:169").EntireRow.Hidden = False
Range("170:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "3" Then
Range("157:176").EntireRow.Hidden = False
Range("177:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "4" Then
Range("157:183").EntireRow.Hidden = False
Range("184:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "5" Then
Range("157:190").EntireRow.Hidden = False
Range("191:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "6" Then
Range("157:197").EntireRow.Hidden = False
Range("198:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "7" Then
Range("157:204").EntireRow.Hidden = False
Range("205:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "8" Then
Range("157:210").EntireRow.Hidden = False
Range("211:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "9" Then
Range("157:218").EntireRow.Hidden = False
Range("219:225").EntireRow.Hidden = True
ElseIf Range("C155").Value = "10" Then
Range("157:225").EntireRow.Hidden = False
Else
Range("156:225").EntireRow.Hidden = True
End If
If Range("C283").Value = "1" Then
Range("285:355").EntireRow.Hidden = False
Range("356:639").EntireRow.Hidden = True
Range("296:315").EntireRow.Hidden = True
Range("330:354").EntireRow.Hidden = True
ElseIf Range("C283").Value = "2" Then
Range("285:426").EntireRow.Hidden = False
Range("427:639").EntireRow.Hidden = True
Range("296:315").EntireRow.Hidden = True
Range("330:354").EntireRow.Hidden = True
Range("367:386").EntireRow.Hidden = True
Range("401:425").EntireRow.Hidden = True
ElseIf Range("C283").Value = "3" Then
Range("285:497").EntireRow.Hidden = False
Range("498:639").EntireRow.Hidden = True
Range("296:315").EntireRow.Hidden = True
Range("330:354").EntireRow.Hidden = True
Range("367:386").EntireRow.Hidden = True
Range("401:425").EntireRow.Hidden = True
Range("438:457").EntireRow.Hidden = True
Range("472:496").EntireRow.Hidden = True
ElseIf Range("c283").Value = "4" Then
Range("498:568").EntireRow.Hidden = False
Range("569:639").EntireRow.Hidden = True
Range("296:315").EntireRow.Hidden = True
Range("330:354").EntireRow.Hidden = True
Range("367:386").EntireRow.Hidden = True
Range("401:425").EntireRow.Hidden = True
Range("438:457").EntireRow.Hidden = True
Range("472:496").EntireRow.Hidden = True
Range("509:528").EntireRow.Hidden = True
Range("543:567").EntireRow.Hidden = True
ElseIf Range("C283").Value = "5" Then
Range("285:639").EntireRow.Hidden = False
Range("296:315").EntireRow.Hidden = True
Range("330:354").EntireRow.Hidden = True
Range("367:386").EntireRow.Hidden = True
Range("401:425").EntireRow.Hidden = True
Range("438:457").EntireRow.Hidden = True
Range("472:496").EntireRow.Hidden = True
Range("509:528").EntireRow.Hidden = True
Range("543:567").EntireRow.Hidden = True
Range("580:599").EntireRow.Hidden = True
Range("614:638").EntireRow.Hidden = True
Else
Range("285:639").EntireRow.Hidden = True
End If
End Sub


Anzeige
AW: worksheet_change nicht immer ausführen
26.03.2021 16:19:18
Hajo_Zi
kürze den code es reicht eine Zeile für die Zeile
Range("157:162").EntireRow.Hidden = Range("C155").Value = "1"
Bild
Homepage

Anzeige
AW: worksheet_change nicht immer ausführen
26.03.2021 16:39:13
Daniel
Hi
das macht man so:
man bildet die Schnittmenge aus Target und den Relevanten Zellen, und wenn das ein Ergebnis bringt, dann führt man das Makro aus, sonst nicht:
Sub Worksheet_Change(ByVal Target As Range)
if not intersect(Target, Range("C155,C283")) is nothing then
und hier dann dein bisheriger Code
end if
end Sub

dann wird der Code im inneren des IFs nur ausgeführt, wenn eine der anführten Zellen geändert wurde
Gruß Daniel

Anzeige
AW: worksheet_change nicht immer ausführen
26.03.2021 21:25:43
Dennis
Hat geklappt :)
Vielen Dank für die Hilfe :)
;
Anzeige
Anzeige

Infobox / Tutorial

Optimierung von worksheet_change in Excel VBA


Schritt-für-Schritt-Anleitung

Um die worksheet_change-Ereignisprozedur effizienter zu gestalten, kannst du die Ausführung des Codes auf bestimmte Zellen beschränken. Folge diesen Schritten:

  1. Öffne deinen Excel-Arbeitsblatt und gehe zum Visual Basic for Applications (VBA)-Editor (ALT + F11).

  2. Wähle das entsprechende Arbeitsblatt aus, in dem du den Code anpassen möchtest.

  3. Ersetze den bestehenden Worksheet_Change-Code durch folgenden optimierten Code:

    Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("C155,C283")) Is Nothing Then
            ' Dein vorheriger Code hier
            If Range("C155").Value = "1" Then
                Range("157:162").EntireRow.Hidden = False
                Range("163:225").EntireRow.Hidden = True
            ' Weitere Bedingungen hier...
            End If
        End If
    End Sub
  4. Speichere deine Änderungen und teste die Funktionalität.


Häufige Fehler und Lösungen

  • Fehler: Worksheet_Change wird bei jeder Änderung aufgerufen

    • Lösung: Stelle sicher, dass du die Intersect-Funktion verwendest, um nur bei Änderungen in den relevanten Zellen den Code auszuführen.
  • Fehler: Lange Ladezeiten

    • Lösung: Reduziere die Anzahl der If-Bedingungen. Nutze stattdessen ein Array oder eine Select Case-Anweisung, um den Code übersichtlicher und schneller zu gestalten.

Alternative Methoden

Eine weitere Möglichkeit, die Effizienz des worksheet_change-Ereignisses zu erhöhen, besteht darin, die Sichtbarkeit von Zeilen mit einer einzigen Zeile zu ändern:

Range("157:162").EntireRow.Hidden = (Range("C155").Value <> "1")

Diese Methode reduziert den Code und erhöht die Lesbarkeit.


Praktische Beispiele

Hier ist ein Beispiel, wie du mit worksheet_change nur bestimmte Zellen verwalten kannst:

Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C155,C283")) Is Nothing Then
        Dim i As Integer
        For i = 1 To 10
            Range("157:" & (156 + i * 7)).EntireRow.Hidden = (Range("C155").Value <> i)
        Next i
    End If
End Sub

Dieses Beispiel blendet die Zeilen basierend auf dem Wert in C155 ein oder aus und ist effizienter als mehrere If-Bedingungen.


Tipps für Profis

  • Verwende Application.EnableEvents = False und Application.EnableEvents = True, um zu verhindern, dass das worksheet_change-Ereignis während der Ausführung des Codes erneut ausgelöst wird.

  • Halte deinen Code modular, indem du Funktionen für wiederkehrende Aufgaben erstellst. Dies verbessert die Wartbarkeit und Übersichtlichkeit.

  • Überlege, ob du Application.ScreenUpdating = False und Application.ScreenUpdating = True verwenden möchtest, um die Bildschirmaktualisierung während der Ausführung zu deaktivieren. Dies kann die Performance ebenfalls verbessern.


FAQ: Häufige Fragen

1. Warum wird mein worksheet_change-Code nicht wie erwartet ausgeführt? Wenn dein Code nicht wie erwartet ausgeführt wird, überprüfe, ob du die richtigen Zellreferenzen in der Intersect-Funktion verwendest.

2. Kann ich mehrere Zellen gleichzeitig überwachen? Ja, du kannst mehrere Zellen überwachen, indem du sie in der Range-Funktion durch Kommas trennst, z. B. Range("C155,C283").

3. Wie kann ich die Ladezeit meines Makros verringern? Reduziere die Anzahl der Bedingungen und nutze effizientere Programmierstrukturen wie Arrays oder Schleifen, wie in den obigen Beispielen gezeigt.

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