Spis treści
W zależności od okoliczności możesz potrzebować wybrać wiele wartości w ramach listy rozwijanej. W tym samouczku pokażemy, jak dokonać wielokrotnego wyboru na liście rozwijanej. Do tej sesji używamy programu Excel 2019, nie krępuj się użyć preferowanej wersji.
Zanim zanurkujemy w sesję, poznajmy zbiór danych, który jest podstawą naszych przykładów.
Mamy tutaj kilka elementów stacjonarki, za ich pomocą stworzymy listę rozwijaną i wybierzemy tam wiele pozycji.
Zauważ, że jest to prosty zestaw danych, aby zachować prostotę. W praktycznym scenariuszu możesz napotkać znacznie większy i złożony zestaw danych.
Zeszyt ćwiczeń
Zapraszamy do pobrania zeszytu ćwiczeń z poniższego linku.
Dokonywanie wielokrotnego wyboru z listy rozwijanej.xlsm
Wybór wielokrotny w liście rozwijanej
Przede wszystkim musimy stworzyć listę rozwijaną na podstawie naszych stationeries. Stwórzmy ją szybko, nie wahaj się odwiedzić artykułu dotyczącego tworzenia listy rozwijanej.
W Walidacja danych w oknie dialogowym wybierz LIST typ danych i wstawić zakres komórek z elementami.
B4:B11 to zakres, w którym znajdują się elementy papeterii. Teraz znajdziesz listę rozwijaną.
Czytaj więcej: Lista rozwijana w Excelu w zależności od wyboru
1. zaznacz wiele elementów (pozwala na dwukrotne zaznaczenie)
W konwencjonalnej liście rozwijanej zawsze wybieramy jeden element. Tutaj widać, że wybraliśmy Pióro z listy (obrazek poniżej).
Teraz, jeśli wybierzemy inny element, powiedzmy Ołówek
to zastąpi ona poprzednią wartość. tylko Ołówek pozostanie wybrany.
Aby wybrać wiele elementów, musimy użyć VBA Kod. Otwórz Microsoft Visual Basic for Applications okno (naciśnij ALT + F11 aby go otworzyć).
Teraz kliknij dwukrotnie nazwę lub numer arkusza, w którym chcesz wybrać wiele pozycji w ramach listy rozwijanej. Znajdziesz okno kodu dla tego konkretnego arkusza.
Tutaj jest okno kodu dla Plansza2 w naszym skoroszycie (w tym arkuszu mamy listę rozwijaną).
Po otwarciu okna z kodem wstawiamy tam następujący kod
Private Sub Worksheet_Change(ByVal Target As Range) Dim Oldvalue As String Dim Newvalue As String On Error GoTo Exitsub If Target.Address = "$D$4" Then If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then GoTo Exitsub Else: If Target.Value = "" Then GoTo Exitsub Else Application.EnableEvents = False Newvalue = Target.Value Application.UndoOldvalue = Target.Value If Oldvalue = "" Then Target.Value = Newvalue Else Target.Value = Oldvalue & ", " & Newvalue End If End If End If Application.EnableEvents = True Exitsub: Application.EnableEvents = True End Sub
Zapisz kod, a teraz spróbuj wybrać wartości na liście rozwijanej.
Po wybraniu Ołówek wybierzemy kolejny element. Notebook I widzisz, znaleźliśmy oba przedmioty (obrazek poniżej).
Ten kod pozwoli nam powtórzyć wybór. Powiedzmy, że jeśli wybierzemy Ołówek ponownie,
ponownie znajdziemy ten element w polu wyboru.
Kod Objaśnienie
Zadeklarowaliśmy dwa ciągi znaków Oldvalue oraz Newvalue .
Możesz zobaczyć, że zrobiliśmy listę rozwijaną w D4 komórka, dlatego nasz adres docelowy to. D4 Dodatkowo sprawdziliśmy, czy komórka korzysta z walidacji danych czy nie, używając Target.SpecialCells .
Po wybraniu wartości, wyłączyliśmy zdarzenia ( Application.EnableEvents = False
), aby zmiany nie wywoływały ponownie zdarzenia. Następnie zapisujemy wybrany element do Newvalue .
Po cofnięciu zmiany, ustawiliśmy wartość w Oldvalue Następnie należy sprawdzić, czy Oldvalue jest pusta lub nie. Jeśli jest pusta (czyli wybrana jest tylko jedna wartość), to zwrócimy Newvalue . W przeciwnym razie należy dokonać konkatenacji Oldvalue oraz Newvalue .
Przed zakończeniem reset wydarzenia, abyśmy mogli zmienić w razie potrzeby.
Czytaj więcej: Wielokrotnie zależna lista rozwijana Excel VBA
Wybierz kilka pozycji z listy rozwijanej (tylko unikalny wybór)
We wcześniejszej sekcji widzieliśmy wielokrotne selekcje, w których dozwolone było powtarzanie. Jeśli nie chcesz tego, to postępuj zgodnie z tą sekcją.
Dla wygody, do tej demonstracji użyliśmy osobnego arkusza. Tym razem znajdujemy się w Arkuszu3. W oknie kodu tego arkusza napisz następujący kod.
Private Sub Worksheet_Change(ByVal Target As Range) Dim Oldvalue As String Dim Newvalue As String Application.EnableEvents = True On Error GoTo Exitsub If Target.Address = "$D$4" Then If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then GoTo Exitsub Else: If Target.Value = "" Then GoTo Exitsub Else Application.EnableEvents = False Newvalue = Target.ValueApplication.Undo Oldvalue = Target.Value If Oldvalue = "" Then Target.Value = Newvalue Else If InStr(1, Oldvalue, Newvalue) = 0 Then Target.Value = Oldvalue & ", " & Newvalue Else: Target.Value = Oldvalue End If End If End If End If Application.EnableEvents = True Exitsub: Application.EnableEvents = True End Sub
Czy jest jakaś różnica w porównaniu z wcześniejszym kodem! Przyjrzyj się bliżej, będziesz w stanie dostrzec niewielką różnicę.
Tutaj użyliśmy VBA funkcja zwana INSTR . INSTR Funkcja zwraca pozycję pierwszego wystąpienia podłańcucha w łańcuchu. Więcej informacji na ten temat można znaleźć w artykule INSTR.
Używając tej operacji logicznej z InStr(1, Oldvalue, Newvalue) = 0, sprawdziliśmy czy wartości zostały znalezione czy nie. Jeśli operacja logiczna zwraca TRUE (nie znaleziono wcześniej) to pozwala wybrać element i konkatenować z wcześniejszą wartością.
Zapisz kod i teraz spróbuj wybrać element, który został już wybrany.
Tutaj mamy już wybrane Ołówek Jeśli chcemy wybrać to ponownie, nie możemy. Nie pozwala na duplikowanie wartości.
Czytaj więcej: Jak utworzyć listę rozwijaną z innego arkusza w programie Excel
3. wybierz elementy w nowej linii
Do tej pory stwierdziliśmy, że elementy są oddzielone przecinkiem. W tym rozdziale ułożymy wybrane elementy w nowe linie.
Dla uproszczenia, łączymy kilka komórek z D4 Aby to zrobić, zaznacz komórki, które chcesz połączyć i kliknij Merge & Center od Dostosowanie sekcja Strona główna tab.
Komórka zyska większą wysokość.
Teraz przyjrzyjmy się kodowi do oddzielania elementów przez nową linię. Użyj następującego kodu
Private Sub Worksheet_Change(ByVal Target As Range) Dim Oldvalue As String Dim Newvalue As String Application.EnableEvents = True On Error GoTo Exitsub If Target.Address = "$D$4" Then If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then GoTo Exitsub Else: If Target.Value = "" Then GoTo Exitsub Else Application.EnableEvents = False Newvalue = Target.ValueApplication.Undo Oldvalue = Target.Value If Oldvalue = "" Then Target.Value = Newvalue Else If InStr(1, Oldvalue, Newvalue) = 0 Then Target.Value = Oldvalue & vbNewLine & Newvalue Else: Target.Value = Oldvalue End If End If End If End If Application.EnableEvents = True Exitsub: Application.EnableEvents = True End Sub
Jedyną różnicą w stosunku do poprzedniego kodu jest to, że tym razem użyliśmy vbNewLine pomiędzy OldValue oraz NewValue .
vbNewLine zapewnia nową linię pomiędzy elementami.
Teraz wybierz elementy.
Wybieramy pozycję Pióro który jest widoczny na powyższym obrazku. Teraz wybierz inny element.
Przekonasz się, że te dwie pozycje są w różnych liniach.
Tutaj mamy dwie wartości, które znajdują się w dwóch różnych liniach. Wybranie innej wartości spowoduje dodanie jej do innej linii. Każda wartość będzie w nowej linii.
Zauważ, że jeśli chcesz, aby inny delimiter oddzielał elementy, użyj go w cudzysłowie zamiast vbNewline .
Wniosek
To wszystko na dziś, wymieniliśmy kilka podejść do dokonywania wielokrotnego wyboru na liście rozwijanej. Mamy nadzieję, że uznasz to za pomocne. Zapraszamy do komentowania, jeśli coś wydaje się trudne do zrozumienia. Daj nam znać o innych metodach, które tutaj pominęliśmy.