[VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Moderator: ModerationP

[VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon MadMax2k8 » 12. Sep 2021, 09:42

Hallo zusammen.

ich bin mit meinem aktuellen Projekt fast fertig, aber eine letzte Kleinigkeit bereitet mir unerwartet Probleme auf der Zielgeraden...

Ich habe eine "Userform1", diese enthält u.a. "Listbox1" und "Listbox2" (beide Listboxen sind MultiSelect = 1; ListStyle =1)

Beide werden per Schleife mit den gleichen Items befüllt aus einem Namensbereich via Rowsource (...sind also nach Userform1_initialize immer gleich lang)

Ich möchte gern berhindern, dass der Benutzer einen Eintrag in beiden Listboxen auswählt versehentlich.

Mein Gedanke war, nach dem change-event eine schleife durch die einträge laufen zu lassen und alles was aktiviert ist (in der jeweils anderen) listbox zu deaktivieren
das habe ich dann für beide Listboxen gebaut.
Noch eleganter wäre natürlich wenn ich diese mechanik ohne schleife nur für den zuletzt geklickten Eintrag machen könnte - aber wie erfahre ich welcher eintrag geklickt wurde?

Code: Alles auswählen
'Teilnehmereintrag (Veggie) wird aktiviert
Private Sub ListBox1_Change()
   Dim g As Integer 'Zähler Listboxeinträge
   
   'Wenn der aktuelle Eintrag (Listbox1) aktiviert wird, dann...
   If ListBox1.Selected(g) = True Then
      'deaktiviere den aktuellen Eintrag (Listbox2)
        ListBox2.Selected(g) = False
    Else
    End If
   
    'Nächster Listboxeintrag
   Next g

End Sub


ich verstehe nicht, warum bei anklicken eines listbox-items nichts passiert.?

Habe auch schon mit _AfterUpdate und mit _Click probiert..... ohne Erfolg.

Ebenfalls diese vielversprechende Idee hat leider nichts gebracht : https://stackoverflow.com/questions/26517300/ms-access-determine-the-listbox-item-clicked-on-click-event
Es ist gar nichts passiert, wenn ich Einträge aktiviere.

Wo liegt der Denkfehler?

Welches Event ist denn das richtige das ich brauche und wie wird es korrekt verwendet so dass ich es nach jeder änderung einer listboxauswahl als trigger nutzen kann?


Vielen lieben Dank vorab.
MaxMad2k8
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
[Hinweis] Hier könnte IHRE Werbung stehen... [/Hinweis]
Benutzeravatar
MadMax2k8
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 31
Registriert: 06. Feb 2020, 08:59

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon slowboarder » 12. Sep 2021, 11:01

Hi

Das MouseUp-Event wäre hier passend.
Die Schleife lässt sich nicht vermeiden, weil es - je nach multiselect-Typ - ja möglich ist, mehrere Einträge gleichzeitig auszuwählen, so dass es "den einen" angeklickten Eintrag nicht gibt.
Wenn du wissen willst, für welche Einträge sich das.Selectverändert hat, müsstest du dir diesen Zustand im MouseDown- Event in einer modulweit gültigen Array-Variable sichern und dann im MouseUp-Event den Zustand mit der Variable vergleichen.
Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28453
Registriert: 18. Apr 2009, 13:33

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon MadMax2k8 » 12. Sep 2021, 13:25

Danke schon mal für die Info.

leider kenne ich dieses event bisher noch gar nicht bzw. seine korrekte verwendung.

bei überprüfung meines codes fiel mir auf dass durch copy-paste wohl eine wichtige zeile gefehlt hat.

es wurde gar keine (for-next) schleife durchlaufen, da die Zeile
Code: Alles auswählen
'Schleife durch alle Listbox-Einträge
   For g = 0 To ListBox1.ListCount - 1

fehlte.

das habe ich aus neugier nachgebessert -> nun wird das Listbox-"_Change"-Event auch erkannt. :D
allerdings führt das aus irgendwelchen Gründen immer zu Excel-abstürzen wenn ich das für beide listboxen so implementiere: :(

Code: Alles auswählen
Private Sub ListBox1_Change()
   Dim g As Integer 'Zähler Listboxeinträge
   
   'Schleife durch alle Listbox-Einträge
   For g = 0 To ListBox1.ListCount - 1
   
   'Wenn der aktuelle Eintrag (Listbox1) aktiviert wird, dann...
   If ListBox1.Selected(g) = True Then
      'deaktiviere den aktuellen Eintrag (Listbox2)
        ListBox2.Selected(g) = False
    Else
    End If
   
    'Nächster Listboxeintrag
   Next g

End Sub

Private Sub ListBox2_Change()
   Dim v As Integer 'Zähler Listboxeinträge
   
   'Schleife durch alle Listbox-Einträge
   For v = 0 To ListBox2.ListCount - 1
   
   'Wenn der aktuelle Eintrag (Listbox1) aktiviert wird, dann...
   If ListBox2.Selected(v) = True Then
      'deaktiviere den aktuellen Eintrag (Listbox2)
        ListBox1.Selected(v) = False
    Else
    End If
   
    'Nächster Listboxeintrag
   Next v

End Sub


Kann mir wer sagen woran das liegt?
(1-2 mal haut es hin wenn ich den gleichen eintrag wechselweise in listbox1 und listbox 2 anklicke....aber nach ner weile ist ende und nichts geht mehr.
Wenn ich das behoben kriege dass es robust läuft, werde ich es noch mal entsprechend anpassen.


Bis dahin habe ich mich temporär dazu entschieden die Prüfung auf Dopplungen vorerst mit in den code für button "speichern" zu integrieren.

das ganze sieht jetzt so aus: (eine fehlermeldung wird gezeigt welcher Teilnehmer bei beiden Varianten eingetragen ist...)

Code: Alles auswählen
'Button Speichern wird geklickt
Private Sub CommandButton1_Click()


If ComboBox1.Value = "" Then
MsgBox "Es wurde kein Tag ausgewählt. Bitte korrigieren."
Exit Sub
Else
End If


   Dim TeilnehmerG, TeilnehmerV As String   'Strings Teilnehmerlisten (Gericht und Veggie)
   Dim c As Integer 'Zähler Listboxeinträge
   
   'Schleife durch alle Listbox-Einträge
   For c = 0 To ListBox1.ListCount - 1
   
   'Wenn der aktuelle TeilnehmerG (Gericht) aktiviert ist, dann...
   If ListBox1.Selected(c) = True Then
     
      'Wenn der gleiche Eintrag in Listbox2 deaktiviert ist
      If ListBox2.Selected(c) = False Then
       
        'Falls Teilnehmerliste noch leer ist
        If TeilnehmerG = "" Then
          TeilnehmerG = ListBox1.List(c)
        Else
          'Teilnehmerliste = Teilnehmerliste , Aktueller TeilnehmerG
          TeilnehmerG = TeilnehmerG & " , " & ListBox1.List(c)
        End If
     
      'Wenn der gleiche Eintrag in Listbox 2 auch aktiviert ist
      Else
    MsgBox "Teilnehmer """ & ListBox1.List(c) & """ wurde für beide Gerichte eingetragen." & vbLf & "Bitte korrigieren."
    TeilnehmerG = ""
    'Abbruch
    Exit Sub
    End If
       
   
   
   End If
   
    'Wenn der aktuelle TeilnehmerV (Veggie) aktiviert ist, dann...
   If ListBox2.Selected(c) = True Then
      'Falls Teilnehmerliste noch leer ist
      If TeilnehmerV = "" Then
        TeilnehmerV = ListBox2.List(c)
      Else
        'Teilnehmerliste = Teilnehmerliste , Aktueller TeilnehmerV
        TeilnehmerV = TeilnehmerV & " , " & ListBox2.List(c)
      End If
   End If
   
    'Nächster Listboxeintrag
   Next c
   
   'Teilnehmerliste Gericht in Zelle schreiben
   Tabelle1.Cells(intAuswahl, 6).Value = TeilnehmerG
   'Teilnehmerliste Veggie in Zelle schreiben
   Tabelle1.Cells(intAuswahl, 8).Value = TeilnehmerV
   
   
   'Userform schließen
   Unload Me

End Sub
[Hinweis] Hier könnte IHRE Werbung stehen... [/Hinweis]
Benutzeravatar
MadMax2k8
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 31
Registriert: 06. Feb 2020, 08:59

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon slowboarder » 12. Sep 2021, 14:23

Hi

MouseUp und MouseDown werden ausgelöst, wenn der Anwender auf die Listbox klickt und dort eine Aktion ausführt.
Dabei bekommst du mit MouseDown den Zustand vor der Aktion, also noch den alten Zustand (den, wenn sich der Finger noch nach unten bewegt) und mit MouseUp den Zustand nach der Aktion, also wenn sich der Finger wieder nach oben bewegt.

Change ist hier ungünstig, weil es bei jeder Änderung reagiert egal was du an der Listbox änderst und egal, wer diese Änderung ausführt, dh egal ob Anwender oder ein Makro.
Du willst hier aber per Makro Änderungen an der Listbox durchführen und dann sollten diese Events nicht ausgelöst werden, sondern nur, wenn der Anwender klickt.
Daher dann MouseUp (oder MouseDown) und nicht Change.

Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28453
Registriert: 18. Apr 2009, 13:33

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon snb » 12. Sep 2021, 16:03

Kann alles viel einfachter.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8725
Registriert: 25. Sep 2014, 16:37

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon MadMax2k8 » 13. Sep 2021, 05:18

oh, erstmal vielen Dank für den Vorschlag.
ist auf jeden Fall deutlich schlanker

habe ein paar fragen dazu:

-kannst du mir den code für ComboBox1_Change grob erklären? - den verstehe ich nicht wirklich bisher.

-was mir direkt beim ausprobieren auffiel.... wen ich in listbox1 einen teilnehmer wähle, werden direkt alle anderen in listbox 2 ausgewählt.
und wenn ich in listbox 1 jemand aktiviert habe kann ich dennoch in listbox 2 den gleichen aktivieren (und genau diesen Fall will ich ja verhindern)

-es ist nicht festgelegt dass immer alle am essen teilnehmen. (freiwillig, da selbst bezahlt wird...), es kann also auch sein dass z.B. mal nur 3 von 43 Leuten
mitessen insgesamt. (und da wäre es dann von Nachteil wenn man alle anderen wieder händisch deaktivieren müsste)

ließen sich diese punkte noch irgendwie anpassen?
das wäre mega gut und schlank gelöst dann :)
[Hinweis] Hier könnte IHRE Werbung stehen... [/Hinweis]
Benutzeravatar
MadMax2k8
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 31
Registriert: 06. Feb 2020, 08:59

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon snb » 13. Sep 2021, 09:23

So geht das....
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8725
Registriert: 25. Sep 2014, 16:37

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon MadMax2k8 » 13. Sep 2021, 11:17

scheint perfekt zu funktionieren nach nem ersten test.

kannst du mir erklären was es mit
Code: Alles auswählen
Tag = ""

auf sich hat?

denn grundlegend war mein makro für die listboxen ja so ähnlich wie das von dir (wirkt für mich so)....

werd den ansatz mal komplett einarbeiten und schauen obs noch irgendwo klemmt.
aber bin sehr zuversichtlich gerad :D

VIelen Dank!
[Hinweis] Hier könnte IHRE Werbung stehen... [/Hinweis]
Benutzeravatar
MadMax2k8
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 31
Registriert: 06. Feb 2020, 08:59

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon slowboarder » 13. Sep 2021, 11:47

das mit dem TAG hängt damit zuammen, was ich dir geschrieben habe:
CHANGE wird immer ausgeführt, wenn ich an der Listbox was ändert.
hier soll das Makro aber nur laufen, wenn der Anwender was ändert und nicht, wenn du per Code die Selektierung zurücksetzt.
Verhindern lässt sich dieser automatische Aufruf jedoch nicht.

was man machen kann, ist an irgendeiner Stelle zu kennzeichnen, dass jetzt die Listboxänderung vom Makro ausgeführt wird und nicht vom Anwender, so dass das Change-Eventmakro dann einfach gleich zu beginn abgebrochen wird, so dass nichts weiter passiert.
SNB nutzt für diese Kennzeichnung die TAG-Eigenschaft der Listboxen.
TAG ist eine Eigenschaft, die jedes Userform-Steuerelement hat und die eigentlich keine weitere Bedeutung hat.
Der Programmierer kann in TAG einen beliebigen Text reinschreiben und somit diese Eigenschaft für seine Zwecke nutzen.

wie gesagt, die Verwendung von MOUSEUP anstelle von CHANGE hatte dieses unnötig gemacht, weil MOUSEUP automatisch nur dann ausgeführt wird, wenn der Anwender auf die Listbox klickt und nicht, wenn das Makro was ändert.

Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28453
Registriert: 18. Apr 2009, 13:33

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon MadMax2k8 » 13. Sep 2021, 12:38

Super, wieder was gelernt :) Vielen dank für die erklärung.

also habe das ganze jetzt soweit zusammengefügt und sehe (bislang) keine Fehler mehr beim testen :)

Dickes Danke noch mal an alle die mir Tips und Hilfe gegeben haben.
Ich weiß das sehr zu schätzen!

Gruß,
MadMax
[Hinweis] Hier könnte IHRE Werbung stehen... [/Hinweis]
Benutzeravatar
MadMax2k8
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 31
Registriert: 06. Feb 2020, 08:59

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon snb » 13. Sep 2021, 12:59

SNB nutzt für diese Kennzeichnung die TAG-Eigenschaft der Listboxen.


Korrektur:
SNB nutzt für diese Kennzeichnung die TAG-Eigenschaft des Userforms.
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8725
Registriert: 25. Sep 2014, 16:37

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon slowboarder » 13. Sep 2021, 13:04

so genau hab ich mir das nicht angeschaut.
irgendein TAG halt, ist ja wurscht welches
andere nehmen dafür dafür nicht TAG, sondern eine Variable, was den Vorteil hätte, dass man die so benennen könnte, dass man auch ohne Erklärung versteht was da passiert.
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28453
Registriert: 18. Apr 2009, 13:33

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon Kuwe » 14. Sep 2021, 00:37

Hallo,

wirklich einfach ohne Schleifen und Zustand merken bei Verwendung des von Daniel vorgeschlagenen MouseUp-Ereignisses:

Code: Alles auswählen
Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   ListBox2.Selected(ListBox1.ListIndex) = False
End Sub

Private Sub ListBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   ListBox1.Selected(ListBox2.ListIndex) = False
End Sub
Gruß Uwe
Benutzeravatar
Kuwe
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 6642
Registriert: 30. Dez 2003, 18:37

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon Gast » 14. Sep 2021, 05:34

Das haut tatsächlich genauso gut hin. Vielen Dank dafür! :)

Da die Listboxen aber wie gesagt ca. 50 Namen enthalten werden, habe ich (für meinen speziellen Fall) einen kleinen Vorteil in der TAG-Variante festgestellt.

Dort kann ich sowohl mit Maus als auch Tastatur ratzfatz die Personen markieren (Cursor + Space)
Hat den Vorteil dass ich mit Maus nicht scrollen muss bei längeren Listen.....das spart Zeit.


Hatte erst überlegt, zusätzlich noch eine Lösung zu finden wie man per Mausrad dann in den Listboxen scrollen kann - aber nach dem was ich im Netz gefunden habe, wäre das wohl ein riesen Aufwand....
Insofern ist die bisherige Lösung schon ganz gut denke ich.

...und ich hab wieder einiges dazugelernt 8-)
Gast
 

Re: [VBA] Welches Listbox-Item wurde gerde geklickt (Event?)

Beitragvon slowboarder » 14. Sep 2021, 08:01

Bei Tastaturbenutzung braucht man dann neben dem MouseUp auch das KeyUp-Event
Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 28453
Registriert: 18. Apr 2009, 13:33

Nächste

Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: DaPeif, snb und 23 Gäste