2012-06-08 20 views
28

Gibt es eine einfache (Einzeiler-) Suche nach einer Zeichenfolge in einem Array in VBA? Oder muss ich jedes Element durchlaufen und es mit der Zielzeichenfolge vergleichen?So suchen Sie nach einer Zeichenfolge in einem Array

EDIT: Es ist ein eindimensionales Array. Ich muss nur wissen IF eine Zeichenfolge ist irgendwo im Array.

IE:

names(JOHN, BOB, JAMES, PHLLIP) 

Wie ich heraus finde, wenn „JOHN“ im Array ist, muss es minimal sein, wie es etwa 5000-mal wiederholt wird, und ich möchte nicht, die Funktion zu verlangsamen der Gesamtprozess ist down.

+1

Wie viele Dimensionen? – Fionnuala

+1

Möchten Sie nur wissen, ob die Zeichenfolge eines der Array-Elemente ist? Oder möchten Sie den Index des passenden Elements? – JimmyPena

Antwort

3

Es gibt eine Funktion, die ein Array aller gefundenen Strings zurückgibt.

Filter(sourcesrray, match[, include[, compare]])
source muss sein 1 dimensionale
Die Funktion wird alle Strings im Array zurück, das die match Zeichenfolge in ihnen

43

Wenn Sie wissen wollen, ob die Zeichenfolge im Array bei gefunden alle, versuchen Sie diese Funktion:

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 

Als Sean Cheshire weist darauf hin, dies muss ein 1-D-Array sein.

Beispiel:

Sub Test() 
    Dim arr As Variant 
    arr = Split("abc,def,ghi,jkl", ",") 
    Debug.Print IsInArray("ghi", arr) 
End Sub 

(Im Folgenden Code aktualisiert, basierend auf Kommentar von HansUp)

Wenn Sie den Index des Anpassungselement in dem Array wollen, versuchen Sie dies:

Function IsInArray(stringToBeFound As String, arr As Variant) As Long 
    Dim i As Long 
    ' default return value if value not found in array 
    IsInArray = -1 

    For i = LBound(arr) To UBound(arr) 
    If StrComp(stringToBeFound, arr(i), vbTextCompare) = 0 Then 
     IsInArray = i 
     Exit For 
    End If 
    Next i 
End Function 

Dies setzt auch ein 1-D-Array voraus. Beachten Sie, dass LBound und UBound nullbasiert sind, also bedeutet ein Index von 2 das dritte Element, nicht das zweite.

Beispiel:

Sub Test() 
    Dim arr As Variant 
    arr = Split("abc,def,ghi,jkl", ",") 
    Debug.Print (IsInArray("ghi", arr) > -1) 
End Sub 

Wenn Sie ein konkretes Beispiel im Sinn haben, aktualisieren Sie bitte Ihre Frage damit, sonst Codebeispiel möglicherweise nicht auf Ihre Situation zutreffen.

+1

Die zweite Version von 'IsInArray' gibt 0 zurück, wenn' stringToBeFound' nicht in 'arr' gefunden wird. – HansUp

+0

@HansUp Ich weiß, aber was schlägst du vor? – JimmyPena

+1

Ich würde einen Wert wie -1 zuweisen, der von 'UBound()' eines nicht leeren Arrays nicht zurückgegeben werden konnte. 'Dim lngReturn As Long; lngReturn = -1' Wenn 'stringToBeFound' gefunden wird:' lngReturn = i' Schließlich, 'IsInArray = lngReturn' – HansUp

18

Eine andere Möglichkeit wäre, ein Wörterbuch anstelle eines Arrays verwenden:

Dim oNames As Object 
Set oNames = CreateObject("Scripting.Dictionary") 
'You could if need be create this automatically from an existing Array 
'The 1 is just a dummy value, we just want the names as keys 
oNames.Add "JOHN", 1 
oNames.Add "BOB", 1 
oNames.Add "JAMES", 1 
oNames.Add "PHILIP", 1 

Wie dies dann Sie eine exakte Anpassung

oNames.Exists("JOHN") 

Der Vorteil ein Wörterbuch bietet Einzeiler von

bekommen würde, ist über teilweise Anpassung von Filter. Sagen Sie, wenn Sie die ursprüngliche Liste der Namen in einem Array haben, aber nach "JO" oder "PHIL" gesucht haben, die eigentlich zwei neue Leute zusätzlich zu den vier waren, mit denen wir angefangen haben. In diesem Fall wird Filter(oNAMES, "JO") mit "JOHN" übereinstimmen, was kann nicht gewünscht werden. Mit einem Wörterbuch wird es nicht.

10

Eine weitere Möglichkeit, die exakte Anpassung (dh keine Teilübereinstimmung) wäre erzwingt:

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0)) 
End Function 

Sie mehr über die Match-Methode und ihre Argumente bei http://msdn.microsoft.com/en-us/library/office/ff835873(v=office.15).aspx

4

einfacher Funktion Rechenblatt arbeitet an lesen Apple OS auch:

Function isInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean 
For Each element In arr 
    If element = stringToBeFound Then 
     isInArray = True 
     Exit Function 
    End If 
Next element 
End Function 
1

Hier ist eine andere Antwort. Es arbeitet schnell, zuverlässig (atomicules' Antwort sehen) und hat kompakte Telefonvorwahl:

' Returns true if item is in the array; false otherwise. 
Function IsInArray(ar, item$) As Boolean 
    Dim delimiter$, list$ 

    ' Chr(7) is the ASCII 'Bell' Character. 
    ' It was chosen for being unlikely to be found in a normal array. 
    delimiter = Chr(7) 

    ' Create a list string containing all the items in the array separated by the delimiter. 
    list = delimiter & Join(ar, delimiter) & delimiter 

    IsInArray = InStr(list, delimiter & item & delimiter) > 0 
End Function 

Verwendungsbeispiel:

Sub test() 
    Debug.Print "Is 'A' in the list?", IsInArray(Split("A,B", ","), "A") 
End Sub 
1

Wenn es eine Liste von Konstanten, dann können Sie Select Case wie folgt verwenden :

Dim Item$: Item = "A" 

Select Case Item 
    Case "A", "B", "C" 
    ' If 'Item' is in the list then do something. 
    Case Else 
    ' Otherwise do something else. 
End Select 
0

Eine Case Aussage könnte einige Anwendungen mehr passen einfach:

select case var 
case "a string", "another string", sVar 
    'do something 
case else 
    'do something else 
end select 
Verwandte Themen