Rückkehr in VBA-Code-Beispiele

VBA – Wert in Array suchen (finden)

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.

vba array finden meldungsbox

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.

array finden gross kleinschreibung ignorieren

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