VBA – Wert in Array suchen (finden)
In this Article
In diesem Tutorial wird gezeigt, wie man in VBA nach einem Wert in einem Array sucht (findet).
Es gibt mehrere Möglichkeiten, in einem Array nach einer Zeichenkette zu suchen, je nachdem, ob es sich um ein eindimensionales oder mehrdimensionales Array handelt.
Suche in einem eindimensionalen Array
Um nach einem Wert in einem eindimensionalen Array zu suchen, können Sie die Filterfunktion verwenden.
Dim z As Variant
'das ursprüngliche Array filtern
z = Filter(Array, String, True, vbCompareBinary)
Die Syntax der Option Filter lautet folgendermaßen:
Filter(Quell-Array, Match as String, [Include as Boolean], [Compare as vbCompareMethod])
Die Angaben Source Array und Match as String sind erforderlich, während Include as Boolean und Compare as vbCompareMethod optional sind. Wenn diese nicht enthalten sind, werden sie auf True und vbCompareBinary gesetzt.
Werte finden, die dem Filter entsprechen
Sub BobFinden()
'Array erstellen
Dim strName() As Variant
strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'ein Variant deklarieren, in dem die Filterdaten gespeichert werden
Dim strSubNames As Variant
'das ursprüngliche Array filtern
strSubNames = Filter(strName, "Bob")
'wenn die Untergrenze größer als -1 ist, dann wurde der Wert gefunden
If LBound(strSubNames ) > -1 Then MsgBox ("Ich habe Bob gefunden")
End Sub
Das zweite Array enthält die vom Filter gefundenen Werte. Wenn Ihre Die Werte der Unter- und Obergrenze nicht gleich -1 sind, hat das Array den Wert gefunden, nach dem Sie gesucht haben.
Sie können auch sehen, wie oft der Text im ursprünglichen Array vorkommt.
Sub NamenZaehlen()
'Array erstellen
Dim strName() As Variant
strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'ein Array deklarieren, in dem die Filterdaten gespeichert werden
Dim strSubNames As Variant
'das ursprüngliche Array filtern
strSubNames = Filter(strName, "Bob")
'Wenn Sie die Untergrenze (LBound) von der Obergrenze(UBound) abziehen und 1 dazu addieren, erhalten Sie die Anzahl, wie oft der Text erscheint
Msgbox UBound(strSubNames) - LBound(strSubNames) + 1 & " Namen gefunden."
End Sub
Werte finden, die NICHT mit dem Filter übereinstimmen
Mit der Option [Include as Boolean] können Sie herausfinden, wie viele Werte in Ihrem Array sind, die NICHT mit Ihrem Filter übereinstimmen
Sub ExtraNamenZaehlen()
'Array erstellen
Dim strName() As Variant
strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
'ein Array deklarieren, in dem die Filterdaten gespeichert werden
Dim strSubNames As Variant
'das ursprüngliche Array filtern
strSubNames = Filter(strName, "Bob", False)
'Wenn Sie die Untergrenze von der Obergrenze abziehen und 1 dazu addieren, erhalten Sie die Anzahl, wie oft der Text erscheint
Msgbox UBound(strSubNames ) - LBound(strSubNames ) + 1 & " Namen gefunden."
End Sub
wir haben also diese Zeile ersetzt:
strSubNames = Filter(strName, "Bob")
Durch diese Zeile:
strSubNames = Filter(strName, "Bob", False)
Die Verwendung dieser Zeile im Code würde alle Namen zurückgeben, die NICHT mit „Bob“ übereinstimmen.
Filter, die die Groß-/Kleinschreibung berücksichtigen
Sie werden feststellen, dass der Filter standardmäßig zwischen Groß- und Kleinschreibung unterscheidet. Dies gilt für alle VBA-Funktionen. Wenn Sie nach Text suchen möchten, bei dem die Groß- und Kleinschreibung nicht beachtet wird, müssen Sie Ihren Code leicht abändern.
z = Filter(strName, "bob",, vbTextCompare)
Wenn Sie vbTextCompare zu Ihrer Filterzeile hinzufügen, kann Ihr Code „bob“ oder „Bob“ finden. Wenn dies weggelassen wird, verwendet VBA standardmäßig vbBinaryCompare, das nur nach Daten sucht, die EXAKT übereinstimmen. Beachten Sie, dass wir im obigen Beispiel das Argument [Include as Boolean] weggelassen haben, so dass True angenommen wird.
Option Compare Text
Alternativ können Sie den Text Option Compare Text am Anfang Ihres Moduls hinzufügen. Dadurch wird bei allen Funktionen, die Sie in diesem Modul schreiben, die Groß-/Kleinschreibung nicht berücksichtigt.
Verwenden einer Schleife zum Durchsuchen eines Arrays
Die Verwendung einer Schleife ist ein wenig komplizierter als die Verwendung der Funktion Filter. Wir können eine Funktion erstellen, die in einer Schleife alle Werte im Array durchsucht.
Sub FeldDurchlaufen()
'Array erstellen
Dim strName() As Variant
strName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")
Dim strFind as string
strFind = "Bob"
Dim i As Long
'Das Array mit einer Schleife durchlaufen
For i = LBound(strName, 1) To UBound(strName, 1)
If InStr(strName(i), strFind) > 0 Then
MsgBox "Bob wurde gefunden!"
Exit For
End If
Next i
End Sub
Um einen Teil der Zeichenkette zu finden, d.h. „Bob“ anstelle von „Bob Smith“ oder „Bob Williams“, mussten wir die Funktion InStr in der If-Anweisung verwenden. Diese suchte in der Zeichenkette, die von der Schleife aus dem Array zurückgegeben wurde, um zu sehen, ob „Bob“ in der Zeichenkette war, und wenn es in der Zeichenkette war, würde sie ein Nachrichtenfeld zurückgeben und dann die Schleife beenden.
Suche in einem mehrdimensionalen Array
Wir verwenden die Schleife auch, um ein mehrdimensionales Array zu durchsuchen. Auch hier müssen wir eine Funktion erstellen, die es uns ermöglicht, alle Werte im Array mit einer Schleife zu durchlaufen, aber dieses Mal müssen wir auch eine Schleife durch jede Dimension des Arrays durchlaufen lassen.
Function FeldDurchlaufen()
Dim varArray() As Variant
Dim strFind As String
strFind = "Arzt"
'Die Größe des Arrays definieren
ReDim varArray(1, 2)
'das Array initialisieren
varArray(0, 0) = "Mel Smith"
varArray(0, 1) = "Fred Buckle"
varArray(0, 2) = "Jane Eyre"
varArray(1, 0) = "Buchhalter"
varArray(1, 1) = "Sekretärin"
varArray(1, 2) = "Arzt"
'Variablen für die Schleife deklarieren
Dim i As Long, j As Long
'Schleife für die erste Dimension
For i = LBound(varArray, 1) To UBound(varArray, 1)
'Schleife für die zweite Dimension
For j = LBound(varArray, 2) To UBound(varArray, 2)
'wenn wir den Wert finden, dann msgbox anzeigen, um zu sagen, dass wir den Wert haben und die Funktion verlassen
If varArray(i, j) = strFind Then
MsgBox "Der Arzt wurde gefunden!"
Exit Function
End If
Next j
Next i
End Function