Dropdown-Feld nutzen um mehrere Zellen zu füllen
Problem:
Ich möchte in Tabelle1 ein Auswahlfeld erstellen, das mehrere Werte zur Auswahl aus Tabelle2 anbietet.
1. Lösung: Liste des Drop-Down-Feldes kommt aus anderen Tabellenblatt
In Excel 2007 bzw. Excel 2010 gehen Sie wie folgt vor:
- Alle Zellen auswählen, für die das Dropdown-Feld erstellt werden soll.
- Registerkarte Daten, Gruppe: Datentools, Befehl: Datenüberprüfung
- Registerkarte: Einstellungen
- Befehl: Zulassen = Liste
- Befehl: Quelle = hier den Quellbereich für die Daten auswählen
- Mit „OK“ bestätigen
2. Lösung: Liste des Drop-Down-Feldes wird direkt hinterlegt
In Excel 2007 bzw. Excel 2010 gehen Sie wie folgt vor:
- Alle Zellen auswählen, für die das Dropdown-Feld erstellt werden soll.
- Registerkarte Daten, Gruppe: Datentools, Befehl: Datenüberprüfung
- Registerkarte: Einstellungen
- Befehl: Zulassen = Liste
- Befehl: Quelle = ErsterWert;ZweiterWert;DritterWert … (die eingegebenen Werte müssen also mit Semikolon getrennt werden!)
- Mit „OK“ bestätigen
3. Lösung: VBA-Lösung die ein Drop-Down-Feld (Kombinationsfeld) nutzt, um mehrere Zellen zu füllen
Eine Lösung findet sich in folgendem Artikel:
https://www.ms-office-forum.net/forum/showthread.php?t=300957
Bereiten Sie eine Excel-Datei wie folgt vor:
Füllen Sie im Tabellenblatt „Tabelle1“ die Zellen A3 bis A22 mit einer Liste von Obstsorten (Apfel, Banane, Kiwi, etc.)
Legen Sie folgenden Quellcode für das Tabellenblatt „Tabelle1“ an:
Option Explicit ' Variablendeklaration erforderlich Private Sub Worksheet_SelectionChange(ByVal Target As Range) '************************************************** '* 24.12.10 * '* erstellt von Karin (Beverly), http://Excel-Inn.de* '* Beverly_Forums@web.de * '************************************************** Dim oobElement As OLEObject ' Variable für das Steuerelement als OLEObject On Error Resume Next ActiveSheet.OLEObjects("DropDownZoom").Delete On Error GoTo 0 If Not Intersect(Target, Range("C5:C35")) Is Nothing Then ' Bildschirmaktualisierung aus Application.ScreenUpdating = False ' ComboBox erstellen Set oobElement = OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=0, Top:=0, Width:=0, Height:=0) With oobElement .Top = ActiveCell.Top ' Position oben .Left = ActiveCell.Left ' Position links .Width = Range(ActiveCell, ActiveCell.Offset(0, 1)).Width ' Breite .Height = Range(ActiveCell, ActiveCell.Offset(1, 0)).Height ' Höhe .ListFillRange = "Liste" ' Quellbereich, per Name "Liste" definiert .Name = "DropDownZoom" ' Name zuweisen .Object.MatchRequired = True ' nur vorhandene Einträge .Object.ListRows = 14 ' Zeilenanzahl der Liste .Object.Font.Size = 12 ' Schriftgröße .Object.DropDown ' DropDown öffnen .Object.ListIndex = 0 ' 1. Eintrag auswählen ' Umwandeln in ein Datum - nur erforderlich wenn die Auswahl aus Datumswerten besteht If IsDate(Range(.ListFillRange).Cells(1)) Then .Object = CStr(CDate(.Object)) .Activate ' aktivieren ' erforderlich, da andernfalls der 1. Eintrag nicht in die Zelle eingetragen werden kann, ' weil seine Auswahl kein Change-Ereignis auslöst da er bereits ausgwählt ist ' mit dem Makro "Eintrag" wird der 1. Eintrag in die Zelle geschrieben Application.OnTime Now + TimeValue("00:00:00"), "Eintrag" End With ' Bildschirmaktualisierung ein Application.ScreenUpdating = True End If End Sub Private Sub DropDownZoom_Change() '************************************************** '* 24.12.10 * '* erstellt von Karin (Beverly), http://Excel-Inn.de* '* Beverly_Forums@web.de * '************************************************** ' Wert aus der Liste wurde gewählt If DropDownZoom.MatchFound Then ' Umwandeln in ein Datum If IsDate(Range(DropDownZoom.ListFillRange).Cells(1)) Then _ DropDownZoom = CStr(CDate(DropDownZoom)) ' Wert nicht in Liste vorhanden Else ' leeren DropDownZoom = "" End If ' Wert aus der betreffenden Zelle des Quellbereichs in aktuelle Zelle eintragen ' ListIndex beginnt bei 0, deshalb + 1 Range(DropDownZoom.TopLeftCell.Address) = _ Range(DropDownZoom.ListFillRange).Cells(DropDownZoom.ListIndex + 1) ' aktuelle Zelle wie Ausgangszelle formatieren Range(DropDownZoom.TopLeftCell.Address).NumberFormat = _ Range(DropDownZoom.ListFillRange).Cells(DropDownZoom.ListIndex + 1).NumberFormat End Sub ' Makro nur zu Programmierzwecken erforderlich falls die Reaktion auf die Eingabe ' nicht mehr erfolgt Sub bbbb() Application.EnableEvents = True End Sub
Legen Sie ein Modul mit dem Bezeichnung „mdlAllgemein“ mit folgendem Quellcode an:
Option Explicit Option Private Module Sub Eintrag() '************************************************** '* 24.12.10 * '* erstellt von Karin (Beverly), http://Excel-Inn.de* '* Beverly_Forums@web.de * '************************************************** If Not Intersect(Range(ActiveSheet.DropDownZoom.TopLeftCell.Address), Range("C5:C35")) Is Nothing Then ' Eintrag des 1. Wertes (ListIndex = 0) der ComboBox Range(ActiveSheet.DropDownZoom.TopLeftCell.Address) = _ Range(ActiveSheet.DropDownZoom.ListFillRange).Cells(1) Range(ActiveSheet.DropDownZoom.TopLeftCell.Address).NumberFormat = _ Range(ActiveSheet.DropDownZoom.ListFillRange).Cells(1).NumberFormat End If End Sub
Weiterführende Hinweise:
- die Schriftgröße sowie die Anzahl der Einträge der Liste eines DropDown-Listenfeldes aus Daten Gültigkeit lassen sich nicht verändern dies wird mithilfe einer ComboBox aus der Steuerelemente-Toolbox simuliert, ohne dass die betreffende Zelle mit einer Gültigkeit formatiert wurde
- bei Klick auf eine Zelle im Bereich C5:C35 wird die ComboBox eingefügt und dabei Schriftgröße 12 und Zeilenanzahl 14 festgelegt die Größe ist auf Breite der Spalten C:D, Höhe auf der aktiven + nächstfolgende Zeilen sowie Position auf linke obere Ecke activen Zelleim Code eingestellt
- ListIndex wird auf 0 gesetzt, sodass der erste Wert ausgewählt ist - wird kein ListIndex gesetzt, entsteht ein Laufzeitfehler
- Da jedoch in diesem Fall eine Auswahl des 1. Eintrages kein Change_Ereignis auslöst, wird durch ein zusätzliches Makro beim Erstellen der CombBox (gestartet mit Application.OnTime, da bei zur Laufzeit erstellen Steuerelementen anders nicht möglich), der 1. Eintrag in die Zelle geschrieben
- bei Auswahl eines Wertes wird dieser in die Zelle eingetragen und die ComboBox wieder gelöscht
- handelt es sich um Datumswerte, müssen diese in der ComboBox entsprechend formatiert werden, da andernfalls statt des Datums sein Zahlenwert angezeigt wird dies muss sowohl beim Erstellen der ComboBox als auch bei Änderung der Auswahl erfolgen
- erstellte ComboBox erhält den Namen DropDownZoom, da für diesen Namen der weitere Code vorgegeben ist
- Quellbereich für die ComboBox ist durch einen definierten Namen dynamisch festgelegt Name Liste: =BEREICH.VERSCHIEBEN(Tabelle1!$A$1;2;;ANZAHL2(Tabelle1!$A:$A);1)