• Zapisz się do newslettera, aby otrzymywać powiadomienia o nowościach na blogu
    Zapisując się, wyrażasz zgodę na przesyłanie Ci informacji o nowościach na tym blogu. Zgodę możesz w każdej chwili wycofać (szczegóły).

Lista wielokrotnego wyboru (odsłona 1)

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!

Szkolenie on-line z Excela - więcej informacji...

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

 

Spodobał Ci się ten artykuł?

Jeśli TAK, zapisz się na newsletter, aby otrzymywać powiadomienia
o o nowościach na blogu.

Zapisując się, wyrażasz zgodę na przesyłanie Ci informacji o nowościach na tym blogu. Zgodę możesz w każdej chwili wycofać (szczegóły).

Tagi , , , , , , , .Dodaj do zakładek Link.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *