Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1560to1564
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

Reihenfolge von Ereignissen

Reihenfolge von Ereignissen
09.06.2017 08:41:50
Ereignissen
Hallo,
da ich leider noch nicht fündig geworden bin, hier eine Frage zur Reihenfolge von Ereignissen.
In meiner Mappe werden verschiedene Ereignisse abgefragt, jedoch wäre es wichtig bei "Worksheet_SelectionChange" zu wissen, ob dies durch Drücken der rechten Maustaste ausgelöst wurde.
Nehme ich "Worksheet_BeforeRightClick" wird dies jedoch immer erst als zweites durchlaufen.

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
MsgBox "1"
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "2"
End Sub

Es kommt also immer erst die Meldung 2 und dann 1.
Gibt es eine Variante die Reihenfolge zu beeinflussen oder auch bei Worksheet_SelectionChange zu prüfen, ob die rechte Maustase gedrückt wurde?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If "rechte Maustaste gedrückt" then
Msgbox "1"
else
MsgBox "2"
end if
End Sub

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Reihenfolge von Ereignissen
09.06.2017 09:00:06
Ereignissen
Hallo,
1. Nein, die Ereignis-Reihenfolge kann nicht beeinflusst werden.
2. Nein, im Selection-Change kannst du nicht prüfen ob er mit Right-Click stattgefunden hat.
Was du anstrebst, könntest du ggf. mit folgender Kombination der beiden Ereignisse erreichen:
Option Explicit
Dim ChangeAddress As String
Dim RightAddress As String
Dim ChangeAndRightHappened As Boolean
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
RightAddress = Target.Address
ChangeAndRightHappened = ChangeAddress = RightAddress
If ChangeAndRightHappened Then MsgBox "Selection with RightClick"
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ChangeAddress = Target.Address
ChangeAndRightHappened = ChangeAddress = RightAddress
If ChangeAndRightHappened Then MsgBox "Selection with RightClick"
End Sub
Gruess Hansueli
Anzeige
AW: Reihenfolge von Ereignissen
09.06.2017 09:40:31
Ereignissen
Das Problem ist aber, dass er beim ersten Durchlauf von SelectionChange noch gar nicht weiß ob gerade rechts geklickt wurde oder nicht.
Man müsste erst den Change und (so es ihn denn gibt) den Rechtsklick abfragen und anschließend auswerten, ob beides oder nur eins geschehen ist.
Mit RightAddress in SelectionChange wertet er ja die irgendwann vorher rechts angeklickte Zelle aus und nicht die Aktuelle. Die wird erst eingeschrieben nachdem SelectionChange schon durch ist...
Und was willst du mir damit sagen? (owT)
09.06.2017 09:50:03
EtoPHG

AW: Und was willst du mir damit sagen? (owT)
09.06.2017 09:57:15
Chris
..., dass es so wie du es beschrieben hast, noch nicht funktioniert...
Alternativ wäre es auch lösbar, wenn man einen Linksklick in eine Zelle nicht per SelectionChange ermitteln müsste. Das Ergeigniss "beforeLeftKlick" gibts es ja aber leider auch nicht...
Hat man da noch eine andere Alternative?
Anzeige
Deine Fehlerbeschreibung sagt mir nichts! (owT)
09.06.2017 10:00:54
EtoPHG

AW: Deine Fehlerbeschreibung sagt mir nichts! (owT)
09.06.2017 10:20:09
Chris
Bei deinem Code startet immer erst

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ChangeAddress = Target.Address
ChangeAndRightHappened = ChangeAddress = RightAddress
If ChangeAndRightHappened Then MsgBox "Selection with RightClick"
End Sub
EGAL ob rechts oder links geklickt wurde.
Im Falle eines Rechtsklicks steht zu dem Zeitpunkt in "RightAddress" aber entweder nichts,
oder die irgendwann mal zuletzt rechts angeklickte Zelle. Erst danach wird im Falle eines Rechtsklicks die Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
RightAddress = Target.Address
ChangeAndRightHappened = ChangeAddress = RightAddress
If ChangeAndRightHappened Then MsgBox "Selection with RightClick"
End Sub
aufgerufen. Diese wertet dann richtig aus, nur ist es da eben schon zu spät.
Der Code erkennt also erst im Zweiten Schritt einen Rechtsklick, entscheidet aber schon vorher.
Die MSGbox aus sub "Worksheet_SelectionChange" erscheint aber immer dann, wenn zufällig mit rechts oder links in eine Zelle gedrückt wird, in die zuvor als letztes rechts gedrückt wurde. Egal ob dies mit der linken oder rechten Maustaste geschehen ist...
Anzeige
AW: Reihenfolge von Ereignissen
09.06.2017 10:18:44
Ereignissen
Hallo Chris,
teste mal:
Option Explicit

Private Declare PtrSafe Function GetAsyncKeyState Lib "user32.dll" ( _
    ByVal vKey As Long) As Integer

Private Const VK_RBUTTON As Long = &H2

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If GetAsyncKeyState(VK_RBUTTON) And 1 = 1 Then Call MsgBox("Rechts")
End Sub

Gruß
Nepumuk
Anzeige
AW: Reihenfolge von Ereignissen
09.06.2017 10:32:13
Ereignissen
Ja, das klappt schon gut.
Ich habe noch etwas ergänzt:
Option Explicit
Private Declare PtrSafe Function GetAsyncKeyState Lib "user32.dll" ( _
ByVal vKey As Long) As Integer
Private Const VK_RBUTTON As Long = &H2
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If GetAsyncKeyState(VK_RBUTTON) And 1 = 1 Then
Call MsgBox("Rechts")
Else
Call MsgBox("links")
End If
End Sub

Gibt es noch die Möglichkeit die Meldung "links" auf einen Mausklick zu beschränken. So plott es auch bei einem Zellenwechsel per Pfeiltasten auf...
Anzeige
AW: Reihenfolge von Ereignissen
09.06.2017 10:41:07
Ereignissen
Hallo Chris,
dann so:
Option Explicit

Private Declare PtrSafe Function GetAsyncKeyState Lib "user32.dll" ( _
    ByVal vKey As Long) As Integer

Private Const VK_LBUTTON As Long = &H1
Private Const VK_RBUTTON As Long = &H2

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If GetAsyncKeyState(VK_RBUTTON) And 1 = 1 Then
        Call MsgBox("Rechts")
    ElseIf GetAsyncKeyState(VK_LBUTTON) And 1 = 1 Then
        Call MsgBox("links")
    End If
End Sub

Beachte, wenn du die MsgBox mit der Maus bestätigst, wird beim nächsten Zellwechsel mit der Tab/Pfeil/Enter-Taste der Mausklick auf die MsgBox ausgewertet. Also, die MsgBox mit der Enter-Taste schließen !!!
Gruß
Nepumuk
Anzeige
AW: Reihenfolge von Ereignissen
09.06.2017 10:51:43
Ereignissen
Ja, den Code hatte ich auch schon so gebastelt, bin dann aber in die Falle deines Hinweises getappt...
Da ich damit aber keine msgbox auslösen will, sollte das am Ende nicht problematisch sein.
Kannst du mir noch erklären wozu das "And 1 = 1" da ist, 1 ist doch immer 1, oder?
AW: Reihenfolge von Ereignissen
09.06.2017 10:58:25
Ereignissen
Hallo,
die Funktion gibt ein Bitmuster zurück. Für die linke Taste 1 für die rechts Taste -32767. Daraus folgt:
1 And 1 = 1
-32767 And 1 = 1
Natürlich könnte ich die Werte auch direkt abfragen, aber so ist es eleganter.
Gruß
Nepumuk
AW: Reihenfolge von Ereignissen
09.06.2017 11:26:46
Ereignissen
Binärarithmetik?
Na an der Stelle steige ich dann aus und freue mich einfach, dass es funktioniert. ;)
Vielen Dank und bis zum nächsten Problemchen!
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige