![Benutzerdefinierte Autovervollständigung in Excel](https://rvso.com/image/1415055/Benutzerdefinierte%20Autovervollst%C3%A4ndigung%20in%20Excel.png)
Ich habe eine lange Liste in einem Blatt in meiner Excel-Datei:
Number Value
123 Text 123
127 Another text
131 Yet another text
... ...
Auf einem anderen Blatt muss ich diese Zahlen eingeben. Da ich mir aber nicht merken kann, welche Zahl zu welchem Text gehört, hätte ich gern eine Art Autovervollständigungsfunktion, die mir zeigt, welcher Wert zu welcher Zahl gehört. Wenn ich beispielsweise eingebe, möchte ich 12
einen Tooltip sehen, der mir Folgendes anzeigt:
123 - Text 123
127 - Another text
weil sowohl als auch 123
mit 127
beginnen 12
.
Ist so etwas möglich? Dabei spielt es keine Rolle, ob es mit integrierter Funktionalität oder durch die Erstellung eines Add-Ins oder VBA-Skripts möglich ist.
Antwort1
Ergebnisse
Dies ist mit VBA möglich (nicht mit VBScript!). Der Kommentar wird automatisch erstellt, wenn der Zellenwert geändert wird.
Code
Quellbereich
Damit der Code funktioniert, müssen Sie einbenannter Bereich Source
für Ihre Quelldaten.
Standardcodemodul
Für die beiden hierfür erforderlichen Funktionen müssen Sie im Visual Basic-Editor ( Alt+ ) ein Standardcodemodul erstellen . Außerdem muss ein Verweis auf gesetzt werden.F11Microsoft Scripting Runtime
Fügen Sie den folgenden Code in Ihr Standardcodemodul ein.
Option Explicit
Function GetMatches(strInput As String) As String
Dim dict As Scripting.Dictionary
Dim key As Variant
Dim strOutput As String
strOutput = "Matches found:" & vbCrLf
Set dict = GenerateDictionary()
For Each key In dict.Keys
If key Like strInput & "*" Then strOutput = _
strOutput & vbCrLf & key & " - " & dict(key)
Next
GetMatches = strOutput
Set dict = Nothing
End Function
Private Function GenerateDictionary() As Scripting.Dictionary
Dim source As Range
Dim cell As Range
Dim dict As New Scripting.Dictionary
Dim number As Integer
Dim value As String
Set source = Range("Source").SpecialCells(xlCellTypeConstants)
For Each cell In source
If cell.Row < 2 Then GoTo PassRow
If cell.Column = 1 Then number = cell.value
If cell.Column = 2 Then value = cell.value
If number <> 0 And value <> "" And cell.Column = 2 Then _
dict.Add number, value
PassRow:
Next
Set GenerateDictionary = dict
Set dict = Nothing
End Function
Dieser Code geht davon aus, dass die Zahlen in Spalte 1 und die Werte in Spalte 2 zu finden sind. Er überspringt auch die erste Zeile. Sie können ihn Ihren Anforderungen entsprechend anpassen.
Arbeitsblattcode
Fügen Sie den folgenden Code in Ihren Arbeitsblattcode ein
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim strInput As String
If Not Intersect(Target, Me.Range("D1")) Is Nothing Then
strInput = Target.value
Target.ClearComments
Target.AddComment (GetMatches(strInput))
Target.Comment.Shape.TextFrame.AutoSize = True
End If
End Sub
Me.Range
Sie können es in jede gewünschte einzelne Zelle ändern .
Verwendung
Geben Sie einfach einen Wert in die von Ihnen angegebene Zelle ein und der Kommentar mit allen Übereinstimmungen wird automatisch hinzugefügt.
Anliegen
Dieser Code erstellt das Wörterbuch jedes Mal, wenn er nach Übereinstimmungen sucht. Bei kleinen bis mittelgroßen Source
Bereichen ist das kein großes Problem (ich habe es bis 10.000 getestet und es wurde trotzdem in wenigen Millisekunden ausgeführt).
Bei vielen Übereinstimmungen verschwindet der Kommentar tendenziell vom Bildschirm. Dies lässt sich nur durch die Eingabe eines spezifischeren Wertes beheben.
Leere Zellen im Source
Bereich werden durch die Verwendung ignoriert xlCellTypeConstants
. Dies funktioniert nicht für Formeln – Sie müssen entweder zu wechseln xlCellTypeFormulas
oder eine andere Möglichkeit finden, um nur die Zellen mit Werten auszuwählen.