Czyli wybieranie z listy więcej niż jednej pozycji
Wiele razy korzystałam z list w formie formantów formularza, aby pobrać z nich wartość i wpisać do komórki. Nigdy jednak nie potrzebowałam wybrać z takiej listy kilku wartości i wpisać ich do komórki. Z taką potrzebą zgłosił się do mnie Wojtek. Temat mega mnie zaciekawił i pomyślałam, że Was też może.
Czyli sytuacja jest taka, że z listy rozwijanej chcemy wybrać kilka wartości i chcemy wpisać je do komórki tak, żeby każda pozycja listy była w nowym wierszu tej samej komórki. Nie jest to może zgodne ze „sztuką”, natomiast życie jest życiem i tak czasem chcemy albo jesteśmy zmuszeni. BTW: i tak cała trudność będzie w pobraniu wartości z listy, a samo wpisanie ich to już pikuś ;).
Całość będzie miała taki efekt:
Oczywiście bez VBA się tutaj nie obędzie, więc bez zbędnego przedłużania… do dzieła!
Tworzenie formatki
Formatka tutaj składa się z 3 elementów:
- komórki docelowej, w której mają wylądować wartości z listy
- listy wielokrotnego wyboru
- przycisku
U mnie komórka docelowa to komórka C3 i nazwałam ją Wynik. Żeby nazwać komórkę należy ją zaznaczyć i w polu nazwy (po lewej stronie obok paska formuły) wpisać wybraną nazwę: Wynik. Całość zatwierdzić Enterem.
Listę natomiast wstawimy sobie jako formant formularza. Czyli ze wstążki wybieramy kartę Deweloper (jeśli jej nie masz – tutaj pokazuję jak ją dodać), a w niej, w sekcji Formanty, klikamy ikonkę Wstaw i wybieramy formant Pole listy. Jest to kontrolka listy, która umożliwia zaznaczanie więcej niż jednej opcji. Niestety nie jest rozwijana, ale o takiej napiszę w innym wpisie :).
Kolejny krok to rysowanie jej – tak, jak każdy autokształt. Ja jeszcze lubię zmieniać domyślne nazwy wstawianych obiektów. Robimy to tak samo, jak zmiana nazwy komórki, czyli zaznaczamy naszą świeżo wstawioną listę, idziemy do pola nazwy i wpisujemy nazwę ListaDane (takiej potem używam w kodzie).
Teraz jeszcze tylko podpięcie źródła listy. Źródłem będzie u mnie tabela, która znajduje się w arkuszu Lista. Aby podpiąć źródło do formantu lista, należy kliknąć na niego prawym przyciskiem myszy. Z menu kontekstowego wybrać następnie Formatuj formant. Tam, w zakładce Formant zaznaczamy zakres wejściowy (po prostu wskazujemy go myszką):
U mnie zakres wejściowy jest tabelą w arkuszu Lista:
Wstawienia przycisku jest bardzo podobne do wstawiania listy. Dokładny opis wstawiania przycisku znajdziesz tutaj. Po wszystkim powstaje nam taka formatka:
Możemy więc brać się za wymyślanie logiki, a potem samego kodu.
Logika zadania
Logika naszego zadania jest taka, że najpierw przelecimy pętlą po wszystkich elementach listy i sprawdzimy, czy są zaznaczone. Jeśli tak – zapiszemy te elementy w zmiennej tekstowej. Po zakończeniu pętli wartość zmiennej wpiszemy do komórki.
Po drodze będzie jeszcze zmienna robocza, która sprawdzi, czy wybrano więcej niż jedną wartość – jeśli tak, będzie doklejała do wyniku „enter”, czyli znak końca linii.
Kod VBA
Teraz zostało nam już „tylko” oprogramowanie tego wszystkiego.
Wyszłam z założenia, że najlepszym i najmniej irytującym rozwiązaniem będzie, jak wartości z listy będą wpisywane do komórki dopiero po naciśnięciu przycisku. To ze względu na fakt, że tych wartości może być kilka i niekoniecznie użytkownik je wszystkie zna od razu, przez co chce się chwilę zastanowić. Z tego powodu makro będzie pdpięte do przycisku, czyli będzie najzwyczajniejszą w świecie procedurą.
Dlatego wstawmy sobie nowy moduł (tutaj opisywałam jak to zrobić), a w nim stwórzmy procedurę PobierzDane.
Zacznijmy od deklaracji zmiennych. Potrzebujemy licznika do pętli, naszą listę, wyniku, arkusza, w którym pracujemy oraz zmiennej roboczej. Tak wyglądają wiersze deklaracji:
Sub PobierzDane() 'opracowanie: malinowyexcel.pl Dim Licznik As Long, ListaDane As ListBox, Wynik As String Dim Ile As Long, Ark As Worksheet End Sub
Teraz przypiszmy wartości do zmiennych obiektowych, czyli ustalmy co ma być arkuszem (Ark) i listą (ListaDane):
Sub PobierzDane() 'opracowanie: malinowyexcel.pl Dim Licznik As Long, ListaDane As ListBox, Wynik As String Dim Ile As Long, Ark As Worksheet Set Ark = ThisWorkbook.Sheets("Formularz") Set ListaDane = Ark.ListBoxes("ListaDane") End Sub
Zauważ, że nasza lista jest elementem kolekcji ListBoxes w konkretnym arkuszu i odwołujemy się do niej po nazwie (po to ją zmienialiśmy przy tworzeniu formatki).
A teraz już tylko pętla i wpisanie wyniku do komórki:
Sub PobierzDane() 'opracowanie: malinowyexcel.pl Dim Licznik As Long, ListaDane As ListBox, Wynik As String Dim Ile As Long, Ark As Worksheet Set Ark = ThisWorkbook.Sheets("Formularz") Set ListaDane = Ark.ListBoxes("ListaDane") For Licznik = 1 To ListaDane.ListCount If ListaDane.Selected(Licznik) Then Ile = Ile + 1 If Ile > 1 Then Wynik = Wynik & vbNewLine Wynik = Wynik & ListaDane.List(Licznik) End If Next Ark.Range("Wynik").Value = Wynik End Sub
Makro gotowe. Teraz tylko zostało podpięcie makra do przycisku (tutaj opisuję, jak to zrobić), zapisanie pliku jako .xlsm (plik z obsługą makr) i voila! Wszystko!
Mam nadzieję, że sposób opisany tutaj Ci się przyda i będzie do wykorzystania od zaraz 🙂
A teraz wersja wideo:
MalinowyExcel Lista wielokrotnego wyboru dw.xlsm
temat jak na moje zamówienie…., bardzo dziękuję przesyłam pozdrowienia z Wrocławia 🙂
Wiesław
Ooo, cudownie! :). Bardzo się cieszę 🙂
Super tutorial , Warto zrobić uzupełnienie jak wyniki wpisywać w kolejne komórki.
Cieszę się, że Ci się podoba 🙂
Dokładnie czegoś takiego potrzebuje, aby dane były w oddzielnych komórkach a nie w jednej, jakaś podpowiedź?
Trzeba w pętli za każdym razem określać miejsce docelowe: Ark.Range(ustalone_miejsce).Value = Wynik
Zapisałam sobie taką potrzebę na liście pomysłów na artykuły 🙂
Super!
A jak zrobić makro żeby kolejno wybrane pozycje z listy były wpisywane w kolejne komórki a nie tylko do jednej?
Można wpisywać np. do ActiveCell, czyli np. ActiveCell.Value = Wynik. Tylko wtedy, przed uruchomieniem makra, trzeba zaznaczyć komórkę, do której chcemy wpisywać.
Super, lista działa.
Ale zastanawiam się czy jest opcja zastąpienia listy check-boxami?
Można dodać checkboxy do wiersza (w arkuszu). Potem jednak trzeba byłoby to łączyć funkcją, aby wstawić połączone do komórki.
I znów rozwiązanie swojego problemu znalazłem na malinowyexcel.
Pozdrawiam
Super, bardzo się cieszę 🙂
Dzień dobry 😉
Czy jest możliwa lista wielokrotnego wybory, gdy arkusz jest chroniony na hasło? Za każdym razem pyta mnie o hasło, które znam, bo są to ustaiwenia bezpieczeństwa pliku, aby przyadkiem nie zmienić żadnych danych.. jednak pytając mnie o hasło lista jakby się „resetuje” i moge wybrac tylko jedną opcję