ListBox mit SpinButton durchscrollen

Moderator: ModerationP

ListBox mit SpinButton durchscrollen

Beitragvon MaggieIstDa » 24. Sep 2021, 09:13

Hallo liebe VBA'ler, 8-)

ich habe eine UserForm mit einer Listbox, die ich gerne mit einem SpinButton durchscrollen würde...
Ich möchte die normale Scrollbar nicht nutzen, da die Userform auf einem Tablet aufgerufen wird und die kleinen Pfeile per Touch nicht vernünftig nutzbar sind. :roll:
Im Netz habe ich auch Lösungsvorschläge gefunden aber irgendwie klappt das bei mir nicht, vermutlich bin ich zu doof :oops:

Naja, lange Rede kurzer Sinn.
Ich würde das Ganze gerne dynamisch nutzen können um das eventuell später auf andere Projekte zu übernehmen, sprich ich möchte eigentlich nicht vorher festlegen müssen, wie viele sichtbaren Zeilen die ListBox hat.
Wenn das aber nicht anders möglich ist, wäre das natürlich auch kein Weltuntergang. :D
Vorstellen würde ich mir das so. Ich drücke auf den Pfeil runter und dann wird bei zb 23 Zeilen insgesamt und 7 Zeilen die sichtbar sind dann bei einmaligen klick Zeile 8 bis 14 angezeigt, beim zweiten klick dann 15 bis 21 und bei weiterem klick sind ja nur noch 2 Zeilen übrig also dann Zeilen 17-23...
Bei einem Klick auf Pfeil hoch dann natürlich in die andere Richtung.

Ist sowas machbar ? :?:

Viele liebe Grüße und besten Dank vorab für Euren Input
Maggie
MaggieIstDa
 

Re: ListBox mit SpinButton durchscrollen

Beitragvon slowboarder » 24. Sep 2021, 09:31

Hi
einfach im Change-Event des SpinButtons die Eigenschaft .TopIndex der Listbox auf den gewünschten Wert setzen.
.TopIndex ist die Indexnummer des Eintrags, der an oberster Stelle der Listbox angezeigt wird.
durch die Veränderung dieses Wertes kann man durch die Listbox scrollen.

wenn du keine Einstellungen an den Spinbuttons vornehmen willst, nimm diesen Code:
Code: Alles auswählen
Private Sub SpinButton1_SpinDown()
With ListBox1
    .TopIndex = WorksheetFunction.Min(.TopIndex + 1, .ListCount - 1)
End With
End Sub

Private Sub SpinButton1_SpinUp()
With ListBox1
    .TopIndex = WorksheetFunction.Max(.TopIndex - 1, 0)
End With
End Sub


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

Re: ListBox mit SpinButton durchscrollen

Beitragvon Gast » 24. Sep 2021, 10:09

Hallo Daniel,

mit Deinem Code bin ich jetzt nicht so ganz klar gekommen, aber der Hinweis auf die Eigenschaft .TopIndex war Gold wert.
Habe es jetzt so gelöst:

Code: Alles auswählen
Private Sub SpinButton1_SpinDown()
    With ListBox2
        VisibleArea = 17
        oldIndex = .TopIndex
            .TopIndex = .TopIndex + VisibleArea
            If oldIndex <> .TopIndex Then .Selected(.TopIndex) = True
    End With
End Sub

Private Sub SpinButton1_SpinUp()
    With ListBox2
        VisibleArea = 17
        oldIndex = .TopIndex
            If .TopIndex > 0 Then .TopIndex = .TopIndex - VisibleArea
            If oldIndex <> .TopIndex Then .Selected(.TopIndex) = True
    End With
End Sub


Ich habe es meiner Meinung nach ausreichend getestet und das hat alles geklappt oder seht ihr hier noch einen Fehler den ich vielleicht nicht sehe ?
Gast
 

Re: ListBox mit SpinButton durchscrollen

Beitragvon Gast » 24. Sep 2021, 10:10

Achso... Allerdings ging das nur mit festgelegtem sichtbaren Bereich, kann man denn auch dynamisch ermitteln ?
Gast
 

Re: ListBox mit SpinButton durchscrollen

Beitragvon slowboarder » 24. Sep 2021, 10:27

was ist dir an meinem Code nicht klar geworden?
ich scrolle halt nur um 1, nicht um den ganzen Anzeigebereich.
um das überschreiten der Grenzen zu vermeiden, benutze ich anstelle der IF-Abfrage die MIN- und MAX-Funktion.
(wobei man das nicht braucht, wie du gleich sehen wirst)

die Frage, wieviele Zeilen im sichtbaren Bereich sind, wird von mehreren Faktoren beeinflusst, hauptsächlich von der Höhe der Listbox und von der gewählten Schrift und dem Schriftgrad, mit der vereinfachten Formel:
Anzahl Zeilen = Höhe_Box / Höhe_Zeile

es geht aber auch einfacher:
man setzt den TopIndex auf einen sehr hohen Wert, höher als möglich.
dieser wird dann automatsich auf den maximal möglichen TopIndex zurückgesetz.
diesen Wert fragt man dann ab und ermittelt die Differenz zur Anzahl der Werte in der Listbox:

Code: Alles auswählen
With Listbox1
.TopIndex = .ListCount
Anzeigebereich = .Listcount - .TopIndex
End with


herauszufinden ob man jetzt zum Ergebnis noch 1 hinzuaddieren oder abziehen oder nichts tun muss, überlasse ich dir

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


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 40 Gäste