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

Forumthread: SelectionChange Ereignis löst nicht aus

SelectionChange Ereignis löst nicht aus
17.05.2018 12:20:34
Raphi
Hallo zusammen.
Ich habe folgendes Problem:
Prinzipiell funktioniert mein VBA-Code einwandfrei. Allerdings habe ich in den Optionen eingestellt, dass die Zelle unter der bearbeiteten markiert wird, wenn ich diese mit ENTER bestätige. Das hat allerdings zur Folge, dass das Ereignis nicht ausgelöst wird und die Änderung in der Zelle erst erkannt wird, wenn ich die bearbeitete Zelle nochmals manuell anwähle. Erkennbar ist dies an den Zellen, die die Berechnung ausgeben und den Wert der geänderten Zelle verarbeiten.
Gibt es eine Möglichkeit diesen Fall ebenfalls zu integrieren? Ist diese Option in den Exceleinstellungen deaktiviert funktioniert alles.
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: SelectionChange Ereignis löst nicht aus
17.05.2018 12:58:02
ChrisL
Hi Raphi
Wenn du diese Option meinst:
Userbild
Bei mir hat dies keinen Einfluss darauf, ob ein SelectionChange Ereignis ausgelöst wird oder nicht.
Lade eine Beispieldatei und erkläre, was das Ziel von der Ereignisroutine sein soll.
cu
Chris
Anzeige
AW: SelectionChange Ereignis löst nicht aus
20.05.2018 12:37:32
Raphi
Hallo Chris,
danke für die schnelle Antwort und entschuldige bitte die verspätete Rückmeldung.
Genau diese Option meine ich.
Mein Ziel ist es einen gewissen Zellbereich auf Änderungen überwachen zu lassen und bei Änderungen die Berechnung laufen zu lassen. Ich weiß, dass mein Vorhaben eigentlich leicht mit den Excelfunktionen umzusetzen ist, aber ich will meine VBA-Kenntnisse aus der Uni nicht vollständig einrosten lassen, was sie eh schon getan haben...

Option Explicit
Dim x As Double
Dim y As Double
Dim A As Double
Dim C As Double
Dim Q As Double
Dim Qnot As Double
Dim i As Integer
Dim j As Integer
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("A5:B20")) Is Nothing Then Exit Sub
Call berechnung
End Sub
Private Sub berechnung()
'~~~ einlesen der fixen Werte
x = Cells(1, 2)
y = Cells(2, 2)
'~~~ einlesen der variablen Werte
i = ActiveCell.Row                  'Legt i auf die aktuell markierte Zeile fest
j = ActiveCell.Column
A = Cells(i, 1)                     'einlesen von A aus der Zeile
C = Cells(i, 2)                     'einlesen von c aus der Zeile
'~~~ Eigentliche Berechnung
Q = x * C * A * 1 / 10000
Qnot = (y - x * C) * A / 10000
'~~~ Ausgabe
Cells(i, 3) = Q
Cells(i, 4) = Qnot
End Sub
Hier ist die Exceldatei als Beispiel.
https://www.herber.de/bbs/user/121715.xlsm
Anzeige
AW: SelectionChange Ereignis löst nicht aus
20.05.2018 12:42:11
Raphi
Bin noch neu im Forum und hab leider vergessen das Häkchen zu setzen.
AW: SelectionChange Ereignis löst nicht aus
21.05.2018 00:46:05
fcs
Hallo Raphi,
Worksheet_SelectionChange(ByVal Target As Range)

ist in deinem Fall nicht das geeignete Ereignis-Makro, denn dieses Ereignis-Makro wenn eine andere Zelle/anderer Zellbereich selektiert wird.
Du musst arbeiten mit
Worksheet_Change(ByVal Target As Range)

Diese Ereignis-Makro wird gestartet, wenn der Inhalt einer Zelle/eines Zellbereichs manuel oder per Makro geändert wird.
Der Variablen Target wird bei diesen beiden Ereignis-Makros die Zelle bzw. der Zellbereich zugewiesen der selektiert (bei Worksheet_SelectionChange) bzw. geändert (bei Worksheet_Change) wurde.
Des sollte/muss man in diesen Makros meistens mit der Variablen Target arbeiten und nicht mit ActiveCell, damit die Informationen korrekt verarbeitet werden.
In deinem Fall muss dazu Target als Parameter an das Makro Berechnung übergeben werden.
Weitere Punkte die zu Beachten sind:
  • Target kann auch mehrere Zellen beinhalten
    Dies muss ggf. im Makro berücksichtigt werden, indem man z.B. alle Zellen in einer Schleife abarbeitet.

  • nicht erwünschter wiederholter Aufruf des Ereignis-Makros
    Wenn ein Ereignis-Makro Aktionen ausführt (z.B. Werte in ein Tabellenblatt einträgt) dann ist es oft unerwünscht, dass diese Aktionen das Ereignis-Makro wiederholt auslösen.
    Denn es verlängert sich die Makroausführung, im Extremfall gerät das Makro in eine Endlosschleife.
    Dies kann man verhindern, indem man vorrübergehend die Ereignismakros deaktiviert.

  • Berechnungsmodus
    Werden durch die Aktionen des Makros viele Berechnungsformel betroffen, sollte der Berechnungsmodus
    vorrübergehend auf "manuelle Berechng" gesetzt werden, um sehr lange Ausführungszeiten eines Makros zu verhindern.

  • Nachfolgend der Code des T%abellenblatts angepasst.
    Gruß
    Franz
    Option Explicit
    Dim x As Double
    Dim y As Double
    Dim A As Double
    Dim C As Double
    Dim Q As Double
    Dim Qnot As Double
    Dim i As Integer
    Dim j As Integer
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A5:B20")) Is Nothing Then Exit Sub
    Application.EnableEvents = False 'Ereignismakros deaktivieren
    Call berechnung(Bereich:=Target)
    Application.EnableEvents = True 'Ereignismakros wieder aktivieren
    End Sub
    Private Sub berechnung(Bereich As Range)
    Dim Zelle As Range
    For Each Zelle In Bereich.Cells
    '~~~ einlesen der fixen Werte
    x = Cells(1, 2)
    y = Cells(2, 2)
    '~~~ einlesen der variablen Werte
    i = Zelle.Row             'Legt i auf die aktuell markierte Zeile fest
    j = Zelle.Column
    A = Cells(i, 1)           'einlesen von A aus der Zeile
    C = Cells(i, 2)           'einlesen von c aus der Zeile
    '~~~ Eigentliche Berechnung
    Q = x * C * A * 1 / 10000
    Qnot = (y - x * C) * A / 10000
    '~~~ Ausgabe
    Cells(i, 3) = Q
    Cells(i, 4) = Qnot
    Next Zelle
    End Sub
    

    Anzeige
    ;
    Anzeige
    Anzeige

    Infobox / Tutorial

    SelectionChange Ereignis in Excel VBA effektiv nutzen


    Schritt-für-Schritt-Anleitung

    Um das SelectionChange Ereignis in Excel VBA korrekt zu nutzen, folge diesen Schritten:

    1. Öffne den VBA-Editor:

      • Drücke ALT + F11, um den VBA-Editor zu starten.
    2. Wähle das entsprechende Arbeitsblatt:

      • Doppelklicke auf das Arbeitsblatt, in dem du das Makro verwenden möchtest.
    3. Füge den Code für das Ereignis ein:

      • Kopiere den folgenden Code in das Codefenster:
      Option Explicit
      Dim x As Double
      Dim y As Double
      Dim A As Double
      Dim C As Double
      Dim Q As Double
      Dim Qnot As Double
      Dim i As Integer
      
      Private Sub Worksheet_Change(ByVal Target As Range)
         If Intersect(Target, Range("A5:B20")) Is Nothing Then Exit Sub
         Application.EnableEvents = False 'Ereignismakros deaktivieren
         Call berechnung(Bereich:=Target)
         Application.EnableEvents = True 'Ereignismakros wieder aktivieren
      End Sub
      
      Private Sub berechnung(Bereich As Range)
         Dim Zelle As Range
         For Each Zelle In Bereich.Cells
             '~~~ einlesen der fixen Werte
             x = Cells(1, 2)
             y = Cells(2, 2)
             '~~~ einlesen der variablen Werte
             i = Zelle.Row
             A = Cells(i, 1)
             C = Cells(i, 2)
             '~~~ Eigentliche Berechnung
             Q = x * C * A * 1 / 10000
             Qnot = (y - x * C) * A / 10000
             '~~~ Ausgabe
             Cells(i, 3) = Q
             Cells(i, 4) = Qnot
         Next Zelle
      End Sub
    4. Speichere deine Arbeit und teste das Makro, indem du Werte in den Zellen A5:B20 änderst.


    Häufige Fehler und Lösungen

    1. Ereignis wird nicht ausgelöst:

      • Vergewissere dich, dass das richtige Ereignis verwendet wird. Das Worksheet_Change Ereignis sollte genutzt werden, wenn du Änderungen an den Zellen überwachen möchtest.
    2. Makro läuft in einer Endlosschleife:

      • Stelle sicher, dass du Application.EnableEvents = False verwendest, bevor du Änderungen vornimmst, und es anschließend wieder aktivierst.
    3. Keine Berechnung nach Änderung:

      • Überprüfe, ob der Zellbereich korrekt definiert ist und ob deine Berechnung in der berechnung-Subroutine korrekt implementiert ist.

    Alternative Methoden

    Wenn das SelectionChange Ereignis nicht die gewünschten Ergebnisse liefert, kannst du auch folgende Methoden in Betracht ziehen:

    • Worksheet_SelectionChange: Nutze dieses Ereignis, um Aktionen auszuführen, wenn eine Zelle ausgewählt wird. Dies ist nützlich, wenn du auf Änderungen in der Auswahl reagieren möchtest.

    • Verwendung von Timer: Wenn du regelmäßig einen Bereich überwachen möchtest, kannst du einen Timer einrichten, der in bestimmten Intervallen die Zellen überprüft.


    Praktische Beispiele

    Hier sind einige Anwendungsfälle für das excel vba selectionchange:

    • Dynamische Datenanalysen: Nutze SelectionChange, um bei der Auswahl einer Zelle sofortige Berechnungen oder Datenvisualisierungen durchzuführen.

    • Formularsteuerung: Setze das SelectionChange-Ereignis ein, um Formularelemente dynamisch zu aktualisieren, basierend auf der Auswahl des Benutzers.


    Tipps für Profis

    • Verwende Target anstelle von ActiveCell: Dies sorgt dafür, dass dein Code robuster ist, besonders wenn mehrere Zellen auf einmal geändert werden.

    • Verwende With-Blöcke: Dies kann die Lesbarkeit und Effizienz deines Codes verbessern, besonders wenn du oft auf dieselben Objekte zugreifst.

    • Ereignisprozeduren optimieren: Überlege, ob es notwendig ist, alle Zellen zu überprüfen oder ob du nur spezifische Zellen oder Bereiche ansprechen kannst.


    FAQ: Häufige Fragen

    1. Was ist der Unterschied zwischen Worksheet_Change und Worksheet_SelectionChange?
    Worksheet_Change wird ausgelöst, wenn der Inhalt einer Zelle geändert wird, während Worksheet_SelectionChange reagiert, wenn der Benutzer eine andere Zelle auswählt.

    2. Wie kann ich mehrere Zellen gleichzeitig überwachen?
    Du kannst die Target-Variable in deinem Worksheet_Change Ereignis verwenden, um alle geänderten Zellen zu durchlaufen und entsprechende Aktionen auszuführen.

    3. Was tun, wenn das Makro nicht funktioniert?
    Überprüfe, ob die Makros aktiviert sind und ob der richtige Zellbereich im Code angegeben ist. Stelle sicher, dass du die richtige Excel-Version verwendest, die VBA unterstützt.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige