ComboBox – Lista rozwijana w UserForm

Jak wygląda nasz formularz użytkownika?

W pierwszym wpisie stworzyłem formularz użytkownika, który zawierał wyłącznie pole tekstowe do wprowadzania nazwy firmy, oraz przyciski Wstaw i Anuluj. Przyszła pora na dodanie nowego pola tzw. ComboBox’a.

UserForm bez Combobox

ComboBox, czyli lista rozwijana

Z wielu dostępnych w UserForm formantów znajduje się ComboBox, z którego użytkownik może wybrać wartość.

ToolBox

Dodałem listę rozwijaną, oraz etykietę do formularza, a także zwiększyłem wielkość czcionki do 18. Nadałem też nazwę temu elementowi cbxKraj. Jeśli nie wiesz jak to zrobić, to przejdź do pierwszego wpisu UserForm – własny formularz w Excelu.

ComboBox dla wyboru kraju

Teraz przyszła pora na przypisanie źródła danych tej listy i mogę zastosować tutaj dwie metody. Jedna z nich to wprowadzenie do komórek Excela listy i odwołanie się do niej w polu RowSource własności ComboBox’a.

tabela jako źródło danych Combobox
rozwinięta lista ComboBox

Dzięki zastosowaniu tabeli, po dodaniu nowej pozycji lista będzie się aktualizować. Inną metodą jest zastosowanie tablicy wartości, która w momencie uruchomienia formularza zostanie załadowana do ComboBox’a.

Będąc w kodzie UserForm’a z listy po lewej stronie wybieram UserForm, a z prawej strony zdarzenie Initialize (jeśli nie orientujesz się czym są zdarzenia, to przeczytaj wpis Śledzenie zmian za pomocą Eventu).

Initialize to zdarzenie, które towarzyszy uruchomieniu formularza. W procedurze tego zdarzenia należy odwołać się do nazwy obiektu, i za pomocą funkcji Array podać elementy tablicy.

źródło listy ComboBox w kodzie

Jeśli nie usunę teraz nazwy tabeli z własności RowSource, to przy próbie uruchomienia formularza nastąpi konflikt. Usuwam więc przed pierwszym uruchomieniem nazwę tabeli z tego pola.

Pozostaje mi dopisać kawałek kodu, który wprowadzi do kolumny C wartość z ComboBox’a, oraz wyczyści go po załadowaniu danych do Excela.

wprowadzanie danych

Walidacja danych

W aktualnej formie UserForm pozwala na to, aby użytkownik nie uzupełnił pól danymi, co może spowodować wprowadzenie pustego rekordu. Aby zabezpieczyć formularz przed taką sytuacją można wyłączyć przycisk Wstaw do czasu, aż oba pola zostaną uzupełnione.

Za działanie przycisku odpowiedzialna jest własność Enabled, która przyjmując wartość False, powoduje, że nie da się go użyć. Dlatego też w pierwszym kroku wyłączę przycisk w momencie uruchomienia się formularza.

wyłaczenie przyciski Wstaw

Teraz pora na wykorzystanie zdarzeń TextBox’a, oraz ComboBox’a. Z listy po lewej stronie pola kodu formularza wybieram tbNazwa i pojawia się domyślny event Change. Wprowadzam warunek, który sprawdza, czy oba pola nie są puste.

walidacja danych

Taki sam warunek dodaję dla zdarzenia Change listy rozwijanej. Teraz przycisk Wstaw nie będzie aktywny, aż do momentu uzupełnienia obu pól.

wyłączony przycisk wstaw

Jeśli tekst do Ciebie nie trafia to zapraszam do obejrzenia nagrania na YT:

Spodobał Ci się artykuł ? Udostępnij go znajomym.

Share on facebook
Share on linkedin
Share on twitter

13 thoughts on “ComboBox – Lista rozwijana w UserForm”

  1. Dzień dobry art. w porządku tylko nie ma możliwości pobrania pliku lub Ja nie potrafię tego dokonać.Po prostu zonk

    1. Dariusz Skórniewski

      Faktycznie nie zwróciłem uwagi, że pliki xlsm są blokowane. Spakowałem jako zip. Teraz działa. Dzięki Darku za informację.

  2. Panie Dariuszu,
    Jak stworzyć dwa ComboBoxy od siebie zależne? Mam na myśli, że wybieram przykładowo w pierwszym markę samochodu, a w drugim wyświetlają mi się tylko modele do wybranej wyżej marki auta. Nie mogę sobie w ogóle z taką zależnością poradzić…

  3. Dzień dobry,jak poinformować użytkownika aby wybrał pozycję z listy rozwijanej , w przypadku gdy w komórkę „kraj” wpisze coś innego?

  4. Dzień dobry,
    czy jest możliwość wprowadzenia komunikatu informującego użytkownika o tym, że:
    podał zupełnie inną wartość niż wskazana w polu z krajem?
    Pozdrawiam

  5. Pingback: UserForm - wartości w ComboBox zależne od innego ComboBox'a

  6. Witam.
    Taka mała uwaga do danych wprowadzanych z formularzy. Przy formie
    Sheets(„Arkusz1”).Cells(NowyWiersz, 2).Value = tbNazwa
    wpisywania danych z pól formularza, Excel nie wiem czemu zapisuje wszystkie wartości jako tekst. By zapisywał poprawnie liczby jako liczby, a tekst jako tekst powinno być:
    Sheets(„Arkusz1”).Cells(NowyWiersz, 2).Value = tbNazwa.Value
    Tak samo użycie właściwości UsedRange jako licznika komórek jest trochę wadliwe jeśli ktoś używa tej konstrukcji w arkuszu z sformatowanymi komórkami(np. format daty, waluty). Lepiej działa funkcja Cells.Find, a dokładnie konstrukcja
    NowyWiersz = Cells.Find(„*”, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 1.
    Pozdrawiam

    1. Dariusz Skórniewski

      Cześć Arku,
      Dziękują za komentarz. Faktycznie wartość z TextBox zwracana do komórki Excela jest zawsze traktowana jako tekst. Użycie Value tak jak to zrobiłeś daje lepszy efekt. Można też kombinować z konwertowaniem ( przydaje się przy wprowadzaniu wartości zmiennoprzecinkowych ).
      Co do UsedRange, że liczy też sformatowane komórki to mnie zupełnie zaskoczyłeś. Raczej używam CurrentRegion.Rows.Count, ale Twoja metoda z Find mi się podoba. Nigdy wcześniej nie używałem, ale zdecydowanie będę miał ją na uwadze. Super rozwiązanie. Jeszcze raz dziękuję, tym razem za cenne wskazówki.

  7. Cześć,

    A istnieje możliwość, w formularzu użytkownika zrobić listę rozwijalną z możliwością dopisania własnego tekstu?

    1. Dariusz Skórniewski

      Cześć Aniu,
      ComboBox pozwala na wprowadzanie własnej treści, chyba, że to zablokujesz. Także spokojnie możesz wpisywać własny tekst.

  8. ” w polu RowSource ” trzeba to podkreślić koniecznie , jeśli ktoś chce utworzyć tylko 1 podkreślam 1….pole rozwijalne dla :Kraj , Dział .. do czegokolwiek potrzebujemy. Ponieważ ja początkujący użytkownik przez godzinę walczyłam , aby przypomnieć sobie jak to zrobiłam wspólnie z Pana nagraniami i dopiero tutaj po przeczytaniu tego hasła mnie oświeciło 🙂

    Szacunek za te filmy z działu VBA.

    1. Dariusz Skórniewski

      Hej,
      Dzięki za dobre słowo 🙂 Faktycznie czasem coś tak oczywistego wypada z głowy i trudno sobie przypomnieć.

Leave a Comment

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