fbpx

Lista wielokrotnego wyboru (odsłona 1)

02.01.2018 | ECP3, Makra VBA

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:

  1. komórki docelowej, w której mają wylądować wartości z listy
  2. listy wielokrotnego wyboru
  3. 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 :).

Wstawianie listy

Wstawianie listy

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ą):

Podpinanie źródła do listy

Podpinanie źródła do listy

U mnie zakres wejściowy jest tabelą w arkuszu Lista:

Źródło do listy

Źródło do listy

Wstawienia przycisku jest bardzo podobne do wstawiania listy. Dokładny opis wstawiania przycisku znajdziesz tutaj. Po wszystkim powstaje nam taka formatka:

Gotowa formatka

Gotowa 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:

 

I plik do pobrania (pamiętaj o włączeniu makr):
MalinowyExcel Lista wielokrotnego wyboru dw.xlsm

 

Jeżeli chcesz lepiej poznać makra i VBA zapisz się na listę zainteresowanych kursem Excel w codziennej pracy cz. 3! Podczas oczekiwania na kurs będę Ci wysyłała informacje, ciekawostki i excelowe triki. Bezpłatnie! 

Pomogłam Ci? Postaw mi wirtualną kawę! →

Przeczytaj podobne wpisy

Kategorie

13 komentarzy

  1. temat jak na moje zamówienie…., bardzo dziękuję przesyłam pozdrowienia z Wrocławia 🙂
    Wiesław

    Odpowiedz
    • Ooo, cudownie! :). Bardzo się cieszę 🙂

      Odpowiedz
  2. Super tutorial , Warto zrobić uzupełnienie jak wyniki wpisywać w kolejne komórki.

    Odpowiedz
    • Cieszę się, że Ci się podoba 🙂

      Odpowiedz
    • Dokładnie czegoś takiego potrzebuje, aby dane były w oddzielnych komórkach a nie w jednej, jakaś podpowiedź?

      Odpowiedz
      • 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 🙂

        Odpowiedz
  3. Super!
    A jak zrobić makro żeby kolejno wybrane pozycje z listy były wpisywane w kolejne komórki a nie tylko do jednej?

    Odpowiedz
    • 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ć.

      Odpowiedz
  4. Super, lista działa.
    Ale zastanawiam się czy jest opcja zastąpienia listy check-boxami?

    Odpowiedz
    • Można dodać checkboxy do wiersza (w arkuszu). Potem jednak trzeba byłoby to łączyć funkcją, aby wstawić połączone do komórki.

      Odpowiedz
  5. I znów rozwiązanie swojego problemu znalazłem na malinowyexcel.
    Pozdrawiam

    Odpowiedz
    • Super, bardzo się cieszę 🙂

      Odpowiedz
  6. 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ę

    Odpowiedz

Wyślij komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *