Rozbalovací seznam s vícenásobným výběrem

Klasický rozevírací seznam v listu Excelu je skvělý, ale umožňuje vybrat pouze jednu možnost z prezentované sady. Někdy je to přesně to, co chcete, ale jsou situace, kdy si uživatel musí umět vybrat nějaký prvky ze seznamu.

Podívejme se na několik typických implementací takového vícevýběrového seznamu.

Možnost 1. Horizontální

Uživatel vybere položky z rozevíracího seznamu jednu po druhé a zobrazí se vpravo od měněné buňky a automaticky se zobrazí vodorovně:

Rozbalovací seznamy v buňkách C2:C5 jsou v tomto příkladu vytvořeny standardním způsobem, tzn

  1. vyberte buňky C2:C5
  2. kartu nebo nabídku Data vybrat tým Ověření dat
  3. v okně, které se otevře, vyberte možnost Seznam a zadejte jako rozsah Zdroj buňky se zdrojovými daty pro seznam A1:A8

Poté musíte do modulu listu přidat makro, které provede veškerou hlavní práci, tj. přidá vybrané hodnoty napravo od zelených buněk. Chcete-li to provést, klepněte pravým tlačítkem myši na kartu listu s rozevíracími seznamy a vyberte příkaz Zdrojový kód. Vložte následující kód do okna editoru jazyka Visual Basic, které se otevře:

Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Not Intersect(Target, Range("C2:C5")) Is Nothing And Target.Cells.Count = 1 Then Application.EnableEvents = False If Len(Target.Offset) (0, 1)) = 0 Then Target.Offset(0, 1) = Target Else Target.End(xlToRight).Offset(0, 1) = Target End If Target.ClearContents Application.EnableEvents = True End If End Sub  

V případě potřeby nahraďte citlivý rozsah rozevíracích seznamů C2:C5 na druhém řádku tohoto kódu svým vlastním.

Možnost 2. Vertikální

Stejné jako v předchozí verzi, ale nové vybrané hodnoty nejsou přidány vpravo, ale dolů:

Provádí se přesně stejným způsobem, ale kód makra obslužného programu se mírně změní:

Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Not Intersect(Target, Range("C2:F2")) Is Nothing And Target.Cells.Count = 1 Then Application.EnableEvents = False If Len(Target.Offset) (1, 0)) = 0 Then Target.Offset(1, 0) = Target Else Target.End(xlDown).Offset(1, 0) = Target End If Target.ClearContents Application.EnableEvents = True End If End Sub  

Opět, pokud je to nutné, nahraďte citlivý rozsah rozbalovacích seznamů C2:F2 svým vlastním na druhém řádku tohoto kódu.

Možnost 3. S akumulací ve stejné buňce

V této možnosti se akumulace vyskytuje ve stejné buňce, kde je umístěn rozevírací seznam. Vybrané prvky jsou odděleny libovolným daným znakem (například čárkou):

Rozbalovací seznamy v zelených buňkách se vytvářejí zcela standardním způsobem jako v předchozích metodách. Veškerou práci provádí opět makro v modulu list:

Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Not Intersect(Target, Range("C2:C5")) Is Nothing And Target.Cells.Count = 1 Then Application.EnableEvents = False newVal = Target Application.Undo oldval = Target If Len(oldval) <> 0 And oldval <> newVal Then Target = Target & "," & newVal Else Target = newVal End If Len(newVal) = 0 Then Target.ClearContents Application.EnableEvents = True End If End Sub  

V případě potřeby můžete nahradit oddělovací znak (čárku) na 9. řádku kódu svým vlastním (například mezerou nebo středníkem).

  • Jak vytvořit jednoduchý rozevírací seznam v buňce listu Excel
  • Rozbalovací seznam s obsahem
  • Rozbalovací seznam s přidanými chybějícími možnostmi
  • Co jsou makra, jak je používat, kam vložit kód makra ve Visual Basicu

Napsat komentář