14.8k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo zusammen

Ich möchte eine Dropdownliste erstellen, in welcher ich nach Eingabe der
Anfangsbuchstaben eines Wortes aus einer Liste das gewünschte Wort mit Enter
auswählen kann.

Ich habe bereits zwei Ansätze probiert, die nicht das gewünschte Ziel ergeben:

1. Via Datenüberprüfung und der Formel
(=BEREICH.VERSCHIEBEN(Liste;VERGLEICH(Zelle&"*";Liste;0)-1;;ZÄHLENWENN
(Liste;Zelle&"*")) wird die Dropdownliste kleiner, wenn ich die Anfangsbuchstaben
eintippe.
--> Das Problem liegt hier, dass ich jedes Mal manuell den gewünschten Wert aus
der Dropdownliste anwählenl muss.

2. Mit Hilfe von Steuerelement-X --> Hier kann ich unter Eigentschaften/LinkCell nur
eine Zelle auswählen. Ich möchte aber, dass die Dropdownfunktion für mehrere
hundert Zeilen funktioniert.

Kennt jemand eine Lösung, mit welchen ich beide dieser Optionen abdecken kann?

Vielen Dank schon mal für eure Hilfe!

Gruss
Protonemura

8 Antworten

0 Punkte
Beantwortet von
Hallo Protonemura,

Ich nehme an, Du meinst so was Ähnliches wie eine Matchcode Auswahl.

Dazu ein Beispiel:

Die Liste befindet sich in Spalte A (A1 bis A5000)

Die Formel in C4:

=HYPERLINK("#" & ADRESSE(VERGLEICH(D4&"*";A:A;0);1;1))

Eingabe der Buchstabenfolge (Anfangsbuchstaben) in D4

Ausgabe des Wortes in D5 bei Doppelklick auf C4


Der Code im Tabellenblatt 4 lautet:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("A1:A5000")) Is Nothing Then 'Wirkungsbereich auf A1:A
5000

Cancel = True 'Cursor nicht in angeklickte Zelle stellen
Worksheets("Tabelle4").Range("D5").Value = Target.Value 'Wert übertragen
End If
End Sub

Die Zellbezüge wären deinerseits noch anzupassen.

Habe diese Lösung im Archiv gefunden und ist nicht auf meinem Mist gewachsen, da ich kein VBA-Experte bin.

Gruß
Paul1

[sub]Excel > Access > MS-Office
MS Windows 10 Professional 64 Bit
MS Windows 7 Professional 64 Bit
ECDL-Syllabus Version 4.0
FIBU/KORE/PV/KA/AB[/sub]
0 Punkte
Beantwortet von
Hi All,

@Paul_1: Coole Funktion. Kannte ich auch noch nicht. Kann mir evtl. irgendwann nützlich sein. Ich hab die Frage aber etwas anders verstanden. Nämlich, dass nach Eingabe der ersten Buchstaben an gleicher Stelle das erstbeste Wort gezogen wird, das mit diesen Buchstaben beginnt und gleichzeitig die Auswahlliste auf alle Worte gefiltert wird, die mit den Buchstaben beginnen. Und das ganze in einem Dropdownfeld.

@Protonemura: Wie du vielleicht inzwischen bemerkt hast bringt dich deine erste Option nicht weiter. Die Liste wird zwar verkleinert, wenn die Werte aber nicht in sortierter Reihenfolge vorliegen, kann es u.U. sein dass falsche Werte zurückgegeben werden. Option 2 ist also die bessere Wahl:

- Füge eine ActiveX-Combobox (nicht die von MSForms verwenden) in dein Tabellenblatt ein.
- Mit Rechtsklick öffnest du im Kontextmenü den Menüpunkt Eigenschaften.
- LinkedCell ist lediglich die Adresse der Zelle, die deine Auswahl im Tabellenblatt ausgiebt. z.B. B4. Zum Setzen der Liste musst du den Bereich in der Eigenschaft ListFillRange angeben. Hier A1:A5000
- Außerdem sollte die Eigenschaft MatchEntry auf fmMatchEntryComplete stehen.
Wenn du nun per Klick auf das Symbol mit dem Zeichendreieck den Entwurfsmodus aufhebst kannst du deine Dropdownliste verwenden
- wie du siehst, wird nach Eingabe der ersten Buchstaben das erstbeste Wort gesucht und die Eingabe automatisch vervollständigt.
- Wenn du mit Druck auf Enter dieses Wort übernehmen und die Markierung löschen willst, musst du deinem Tabellenblattmodul des VBA-Editors folgenden kleinen Code schreiben:

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Application.EnableEvents = False

If KeyCode = vbKeyReturn Then
ComboBox1.SelLength = 0
ComboBox1.SelStart = Len(ComboBox1.Value)
end if

Application.EnableEvents = True

End Sub

Soweit so gut. Wenn du nun aber auf die Dropdownliste klickst siehst du noch immer Alle Werte. Diese zu filtern ist etwas kompliziert und bedarf einiger Erklärungen. Das geht nur über VBA.

Ersetze den genannten Code im Tabellenmodul durch diesen hier:
Option Compare Text

'legt fest ob nach jeder Eingabe die Dropdownliste sichtbar aktualisiert wird
Const MitDropDown As Boolean = False

Dim x As String
Dim y As Variant
Dim WshShell As Object
Dim Autoenter As Boolean


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Application.EnableEvents = False

If KeyCode = vbKeyBack Then
ComboBox1.Value = Left(ComboBox1.Value, ComboBox1.SelStart)
End If

If KeyCode = vbKeyBack Or KeyCode = vbKeyDelete Then
If x <> "" Then ComboBox1.ListFillRange = x
End If

Application.EnableEvents = True
End Sub

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Set WshShell = CreateObject("WScript.Shell")

Application.EnableEvents = False

With ComboBox1

If KeyCode = vbKeyReturn Then
If Autoenter = False Then
DoEvents
ComboBox1.SelLength = 0
ComboBox1.SelStart = Len(ComboBox1.Value)
End If
Autoenter = False
ElseIf KeyCode > vbKeyDown Or KeyCode < vbKeyLeft Then
If .Value <> "" Then
If .ListFillRange <> "" Then
v = .Value
s1 = .SelStart
s2 = .SelLength

x = .ListFillRange
y = Range(x)
.ListFillRange = ""
.List = y
.Value = v
.SelStart = s1
.SelLength = s2
End If

If .ListCount > 0 Then

c = .ListCount

For i = 1 To c
If i > c Then Exit For
If Len(.SelText) > 0 And Len(.Value) > Len(.SelText) Then
If Not .List(i - 1) Like Left(.Value, .SelStart) & "*" Then
.RemoveItem i - 1
i = i - 1
c = c - 1
End If
ElseIf Len(.Value) > 0 Then
If Not .List(i - 1) Like .Value & "*" Then
.RemoveItem i - 1
i = i - 1
c = c - 1
End If
End If
Next i
End If
Else
If x <> "" Then .ListFillRange = x
End If

If MitDropDown Then
Autoenter = True
WshShell.SendKeys "{ENTER}"
DoEvents
ComboBox1.DropDown
End If

End If

End With

Application.EnableEvents = True

End Sub

Wenn du nun Eingaben in der Combobox machst und vor Übernahme des Werts mit Klick auf den Dropdownpfeil die Liste aufklappst siehst du nur die für dich interessanten Werte. Du möchstest stattdessen die Liste aufgeklappt lassen und nach jeder Eingabe sehen, wie sich die Werte verändern? Dann setze ganz oben die Variable MitDropDown auf True.

Einen kleinen Haken hat die Sache allerdings. Um die Liste der Combobox filtern zu können, muss der Code leider die Eigenschaft ListFillRange löschen und die Werte anders in die Combobox importieren. Normalerweise wird die Eigenschaft wieder gesetzt sobald du deine Dateneingabe löschst. Allerdings kann es sein, dass im Fall eines Bugs oder nach Änderung am Code Excel vergisst, welcher Bereich hinterlegt war. Um das zu umgehen solltest du noch im Modul DieseArbeitsmappe diesen Code einfügen. Damit wird beim Öffnen der Datei die Liste neu zugewiesen.
Private Sub Workbook_Open()

Application.EnableEvents = False
ComboBox1.Value = ""
ComboBox1.ListFillRange = "A1:A5000"
Application.EnableEvents = True

End Sub
Ersetze natürlich überall Combobox1 durch den Namen deines Objekts. Am besten mit STRG+H.

So genug geschwafelt. Ich hoffe, ich hab hier keinen Bug mehr drin. Wenn du Fragen oder Probleme hast, einfach melden.

Gruß Mr. K.
0 Punkte
Beantwortet von
Falls es nicht unbedingt ein Dropdownfeld sein muss, kannst du das ganze auch über
Spezialfilter lösen. Das ist dann nicht ganz so kompliziert:

- Angenommen deine Liste steht in A5:A5000, in Zelle A4 muss sich eine Überschrift befinden.
Die gleiche Überschrift muss sich auch in A1 befinden.
- Weiterhin nehme ich an, dass du deine Eingabe z.B. in D4 machst und dort vervollständigt
haben möchtest. Gebe nun in A2 folgende Formel ein: ="="&D4&"*"
- Die Werte in A1 und A2 sowie die Leerzelle in A3 sind wichtig, damit das auch funktioniert. Die
Liste darf erst in A4 mit einer Überschrift beginnen.

gib nun im Tabellenmodul des VBA-Editors den folgenden Code ein:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("A4:A5000")) Is Nothing Then
Application.EnableEvents = False
Range("D4") = Target
Application.EnableEvents = True
End If
Cancel = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
'Alternative über Spezialfilter so wie hier:
If Target.Address = "$D$4" Then
If Range("D4") = "" Then
ActiveSheet.ShowAllData
Else
Range("A4:A5004").AdvancedFilter _
Action:=xlFilterInPlace, CriteriaRange:=Range("A1:A2"), Unique:=False
Application.EnableEvents = False
Target = Application.WorksheetFunction.VLookup(Target & "*", Range("A4:A5000"), 1, 0)
Application.EnableEvents = True
End If
End If
End Sub

Evtl. solltest du auch hier die Bezüge anpassen, falls deine Liste oder dein Eingabefeld doch
woanders stehen. Haupsache oberhalb der Liste befinden sich nochmal die
Tabellenüberschrift sowie die genannte Formel, die sich auf das Eingabefeld bezieht.

Wenn du nun eine Eingabe in das angegebene Feld (hier D4) machst wird die Liste wie
gewünscht gefiltert und der erste Wert per SVERWEIS in das Eingabefeld geschrieben.

Wenn du weiterhin in der gefilterten Liste auf einen anderen Wert doppelklickst, wird dieser in
das Eingabefeld kopiert.

Vielleicht kommt das deinem eigentlichen Wunsch näher als die Variante über Combobox.

Gruß Mr. K.
0 Punkte
Beantwortet von
in meiner ersten Antwort hab ich doch noch einen kleinen Bug drin. Solltest du das nutzen wollen,
muss das letzte Makro im Modul Diese Arbeitsmappe so lauten
Private Sub Workbook_Open()

Application.EnableEvents = False
Tabelle1.ComboBox1.Value = ""
Tabelle1.ComboBox1.ListFillRange = "A1:A5000"
Application.EnableEvents = True

End Sub

Statt Tabelle1 musst du natürlich dein Tabellenmodul verwenden. Gleiches gilt für den Namen der
Combobox

Sorry
Mr. K.
0 Punkte
Beantwortet von
Hallo Mr. K.,

zum Ersten freut es mich, dass Du die Zeit gefunden hast, Dich mit dieser Anfrage zu beschäftigen, da ich bei Rückfragen des Fragestellers in Verlegenheit gekommen wäre, besonders wenn es um VBA gegangen wäre.

Was die Auswahl über Matchcode in einem DropDown-Feld betrifft, hatte ich in der herkömmlichen Form für nicht möglich gehalten.
Wenn es doch möglich wäre (VBA) bei Eingabe von 3 Anfangsbuchstaben, das nicht nur der erstbeste Suchbegriff erscheint, sondern alle Suchbegriffe mit dem gleichen 3 Anfangsbuchstaben dropdownmäßig zur Auswahl aufgelistet werden, wäre das für mich ein Hit.

Vielleicht kann sich diesbezüglich auch der Fragesteller zu Wort melden.

schönen Tag noch

Gruß
Paul1
0 Punkte
Beantwortet von
hi pauk1 ^^

das ist doch eine tolle Übungsaufgabe fuer Dich
und leiht zu loesen uebrigens
programmiere schritt fuer schritt und lege deine Konzentration auf 1 schritt

gruss nighty
0 Punkte
Beantwortet von
hi paul1

dein Ergebnis,schick an oberley@t-online.de
ich werde dann drueber schauen :-)

gruss nighty
0 Punkte
Beantwortet von
Hallo nighty,

besten Dank, aber in den Sommermonaten komme ich einfach nicht dazu, das hebe ich mir für den Winter auf, da gibt es keine Gartenarbeit, Arbeiten am und im Haus etc.

schönen Tag noch

Gruß
Paul1
...