«VBA Excel ListBox Multiselect»
Legarea intervalului de date la lista.
Adăugarea, ștergerea elementelor din listă.
Sortați lista și selectați mai multe elemente.
Un ListBox sau o "casetă combo" este unul dintre comenzile care pot fi plasate pe formular pentru a permite utilizatorului să selecteze unul sau mai multe elemente din lista de opțiuni furnizate ...
-
VBA oferă două opțiuni pentru popularea listei ListBox ...
Plasați mai multe butoane radio pe formular, permițându-vă să încărcați liste din diferite coloane ale foii Excel în elementul ListBox1.
Activează abilitatea de a sorta listele descărcate în ListaBox1.
Oferiți posibilitatea selecției multiple a elementelor din listă și ieșirea rezultatului selecției în fereastra de mesaje MsgBox.
![Vba excel listbox multiselect - obligați o gamă de date în lista; adăugarea, ștergerea elementelor (listă) Vba excel listbox multiselect - obligați o gamă de date în lista; adăugarea, ștergerea elementelor](https://images-on-off.com/images/182/vbaexcellistboxmultiselectprivyazkadiapa-b4c19f45.jpg)
Legați la lista de valori de valori prin proprietatea Rowsource
Cred că pentru confortul lucrării reale cu listele din foile Excel (adăugarea de noi valori în celulele coloanelor corespunzătoare sau ștergerea celor existente), trebuie să utilizați funcția pentru a determina automat numărul ultimului rând umplut în coloana specificată ...
Metoda Găsirea obiectelor din clasa Range (Vă recomandăm să vă uitați la ajutorul ei) este foarte utilă în această chestiune ....
Și astfel, funcția poate arăta, de exemplu, după cum urmează ...
Funcție GetLastRowFromColumn (numColumn ca Integer) ca Integer
GetLastRowFromColumn = Coloane (numColumn) .Cells.Find ("*" .XlByRows, xlPrevious) .Row
Terminați funcția
După cum puteți vedea, singurul parametru care primește numărul coloanei (deși pentru simplitate am plecat de la o singură foaie din registrul de lucru, iar foaia de altfel ar, de asemenea, ar trebui să fie specificat ca parametru), și returnează șirul că numărul de celule al metodei returnate Găsiți ...
Apoi, managerii de evenimente pentru clicurile de mouse pe butoanele radio vor arăta astfel ...
Private Sub OptionButton1_Click ()
lastrow = GetLastRowFromColumn (1)
Dacă opțiunea OptionButton1 Apoi Me.ListBox1.RowSource = "= A1: A" lastrow
End Sub
Private Sub OptionButton2_Click ()
lastrow = GetLastRowFromColumn (2)
Dacă OptionButton2 Apoi Me.ListBox1.RowSource = "= B1: B" lastrow
End Sub
Private Sub OptionButton3_Click ()
lastrow = GetLastRowFromColumn (3)
Dacă OptionButton3 Apoi Me.ListBox1.RowSource = "= C1: C" lastrow
End Sub
De asemenea, ar putea fi simplificat (până la o linie în procedură),
Me.ListBox1.RowSource = "= A1: A" GetLastRowFromColumn (1)
dar cred că prezența ultimei variabile vă ajută să vedeți valoarea ei atunci când depanați, și acesta este timpul salvat .... care este mai scump decât reducerea cantității de cod ...
În general, primul buton radio plasează intervalul din coloana A (folosind proprietatea Rowsource) din listă, iar al doilea și al treilea, respectiv, din coloanele B și C ...
Mai multe opțiuni
Principala proprietate element de ListBox - Lista ... este o listă indexată de valori ... (Ca variantă) Prin urmare, orice element din lista pot fi accesate prin indexul ... cum ar fi Lista (IDX) ...
Și la fel de important este a doua proprietate indexată Selected (idx), care este o serie de valori booleene care indică dacă un anumit element de listă este evidențiat de utilizator sau nu ...
Astfel, butonul pentru mesajul "Mesaj" arată astfel ...
Private Sub CommandButton1_Click ()
Dim n ca întreg, s ca șir
s = ""
Pentru n = 0 Pentru a Me.ListBox1.ListCount - 1
Dacă Me.ListBox1.Selected (n) Apoi
s = s Me.ListBox1.List (n) vbLf
Sfârșit Dacă
Următorul n
Dacă s = "" Atunci
MsgBox "Nu s-au selectat elemente", 0, "Elemente listate selectate"
altfel
MsgBox s, 0, "Elemente de listă selectate"
Sfârșit Dacă
Formează sirul. numai din elementele selectate din listă și afișează un mesaj corespunzător ... VbLf-ul constant încorporat înseamnă un salt la o linie nouă ...
Lista de sortare
Dar pentru a sorta lista trebuie să abandonăm proprietatea RowSource. deoarece Schimbarea în ordinea articolelor din listă va contrazice intervalul limitat. VBA va abuza doar ...
Iată procedura de sortare a unui obiect ListBox (care este trecut ca parametru As Object)
Sub mySort (aL ca obiect)
Dim locList () ca varianta, siz As Long
'Sorts a ListBox (proprietatea .List este o matrice de Variant)
Dim j cât de lung
siz = UBound (aL.List)
ReDim locList (UBound (aL.List))
Pentru j = 0 Pentru siz
locList (j) = .List (j)
Următorul j
RowSource = ""
.clar
mySortArray locList
Pentru j = 0 Pentru siz
.AddItem (locList (j))
Următorul j
Sfârșit cu
End Sub
După cum puteți vedea, creați mai întâi matricea locList () a dimensiunii cerute și completați-o cu elementele din listă ...
Apoi dezactivați lista din intervalul (aL.RowSource = "") și ștergeți-o (aL.Clear) ...
Și matricea rezultată este sortată în mod obișnuit (prin orice algoritm de sortare).
Asta e tot. Rămâne să încărcați matricele sortate în listă utilizând metoda AddItem. desigur, într-un ciclu ...
Pentru a putea selecta mai multe elemente din listă, nu uitați să setați proprietatea
ListBox1.MultiSelect = fmMultiSelectMulti
...
...
Toate ...
Descărcați fișierul pentru testare
Condiții pentru obținerea codului? Arată?
Alte exemple pe tema "Automatizarea documentelor Microsoft Office Excel, Word, Access"
Alte exemple în limba "Visual Basic"
Alte exemple în limba "Visual Basic for Application - VBA"