Excel VBA – obsługa elementów ListBox’a
Chcąc – nie chcąc, czasem trzeba. Jak widać, wpisy zostały zdominowane przez VBA, ale lepiej mieć content, niż nie mieć, więc dokładam znowu coś od siebie.
W dzisiejszym odcinku dowiemy się, jak wyciągnąć liczbę zaznaczonych elementów listy ListBox
, jak wyciągnąć te elementy, jak dodać gotowy element do listy i na dokładkę – otrzymamy pierwszy zaznaczony element.
DISCLAIMER: (cokolwiek to znaczy) jestem świadomy, że przedstawiane tu rzeczy są trywialne aż do mdłości, ale skoro działają, mogę komuś ułatwić życie, przedstawiając je w formie krótkich snippetów.
Ilość zaznaczonych elementów listy
Dotyczy list o wlaściwości
MultiSelect
równejfmMultiSelectMulti
lubfmMultiSelectExtended
, przy single-select też zadziała, ale oczywiście zwróci 1.
1 2 3 4 5 6 7 8 | Public Function countSelected(myList As MSForms.ListBox) As Integer countSelected = 0 For a = 0 To myList.ListCount - 1 If myList.Selected(a) Then countSelected = countSelected + 1 End If Next End Function |
Pierwszy zaznaczony element listy
1 2 3 4 5 6 7 8 9 10 11 | 'jesli nic nie zaznaczono, zwroci -1, jesli zaznaczono, zwraca 'indeks zaznaczonego elementu Public Function firstSelected(myList As MSForms.ListBox) As Integer firstSelected = -1 For a = 0 To myList.ListCount - 1 If myList.Selected(a) Then firstSelected = a Exit For 'po co sie meczyc dalej End If Next End Function |
Wszystkie zaznaczone elementy listy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 'zwraca tablice indeksow zaznaczonych elementow Public Function allSelected(myList As MSForms.ListBox) As Integer() Dim returnArray() As Integer counter = 0 For a = 0 To myList.ListCount - 1 If myList.Selected(a) Then ReDim Preserve returnArray(counter) returnArray(UBound(returnArray)) = a counter = counter + 1 End If Next allSelected = returnArray() End Function |
Dodawanie tablicy do listy
Ta funkcja jest ułatwieniem wyłącznie w przypadku wielokolumnowych list
1 2 3 4 5 6 7 8 9 10 11 12 | Public Sub addToList(myList As MSForms.ListBox, element() As String) 'jesli liczba kolumn nie zgadza sie z liczba pol tablicy: If UBound(element) - LBound(element) + 1 <> myList.ColumnCount Then MsgBox "Niepoprawne wywołanie, zastrzel programistę...", vbCritical + vbExclamation Exit Sub End If myList.AddItem (element(LBound(element))) For a = LBound(element) + 1 To UBound(element) myList.List(myList.ListCount - 1, a - LBound(element)) = element(a) Next End Sub |
Mam nadzieję, że Excelowo – VisualBasicowy cykl szybko się skończy, bo szlag mnie trafia, kiedy muszę pisać w języku, który za błąd uznaje średnik na końcu wiersza… :)
Normalnie za ten kod :
”
myList.AddItem (element(LBound(element)))
For a = LBound(element) + 1 To UBound(element)
myList.List(myList.ListCount – 1, a – LBound(element)) = element(a)
Next
”
Masz u mnie browara , dzięki.
@BigKoma:
Masz do mnie chyba kawałek, sądząc po IP, ale zapraszam :) Cieszę się, że mogłem pomóc.
Witam
ciekawa strona kursu VBA,
lecz poszukuję więcej informacji na temat funkcji Check Box i Option Button, przede wszystkim do jakich celów je używać.
Generalnie nie jest to strona kursu VBA, ale może w przyszłości pojawi się coś o wspomnianych rzeczach.