2012-06-08 23 views
28

¿Existe una herramienta fácil (una línea) para buscar una cadena dentro de una matriz en VBA? ¿O tendré que recorrer cada elemento y compararlo con la cadena objetivo?Cómo buscar una cadena en una matriz

EDITAR: Es una matriz unidimensional. Solo necesito saber IF una cadena está en algún lugar de la matriz.

IE:

names(JOHN, BOB, JAMES, PHLLIP) 

¿Cómo puedo saber si "John" se encuentra en la matriz, tiene que ser mínimo ya que se repite alrededor de 5000 veces y no quiero que la función de reducir la velocidad el proceso general hacia abajo.

+1

¿Cuántas dimensiones? – Fionnuala

+1

¿Simplemente desea saber si la cadena es uno de los elementos de la matriz? ¿O quieres el índice del elemento coincidente? – JimmyPena

Respuesta

3

hay una función que devolverá una matriz de todas las cadenas encontradas.

Filter(sourcesrray, match[, include[, compare]])
El sourceArray tiene que ser 1 dimensiones
la función devolverá todas las cadenas en la matriz que tienen la cadena match en ellos

43

Si usted quiere saber si la cadena se encuentra en la matriz en todo, probar esta función:

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

Como Sean Cheshire señala, esto debe ser una matriz 1-D.

Ejemplo:

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

(continuación código actualizado basado en el comentario de HansUp)

Si desea que el índice del elemento coincidente en la matriz, intente esto:

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 

Esto también asume una matriz 1-D. Tenga en cuenta que LBound y UBound tienen una base cero, por lo que un índice de 2 significa el tercer elemento, no el segundo.

Ejemplo:

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

Si tienes un ejemplo específico en mente, por favor, actualice su pregunta con él, de lo contrario código de ejemplo podría no aplicarse a su situación.

+1

La segunda versión de 'IsInArray' devuelve 0 si' stringtoBeFound' no se encuentra en 'arr'. – HansUp

+0

@HansUp Lo sé, pero ¿qué sugieres? – JimmyPena

+1

Asignaría un valor, como -1, que no podría ser devuelto por 'UBound()' de una matriz no vacía. 'Dim lngReturn As Long; lngReturn = -1' Si se encuentra 'stringToBeFound':' lngReturn = i' Finalmente, 'IsInArray = lngReturn' – HansUp

18

Otra opción sería usar un diccionario en lugar de una matriz:

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 

Como esto, entonces usted tendría una sola línea de

oNames.Exists("JOHN") 

La ventaja de un diccionario ofrece es la coincidencia exacta sobre la coincidencia parcial de Filter. Diga si tiene la lista original de nombres en una matriz, pero estaba buscando "JO" o "PHIL" que en realidad eran dos personas nuevas además de las cuatro con las que empezamos. En este caso, Filter(oNAMES, "JO") coincidirá con "JOHN" que puede no se desea. Con un diccionario, no lo hará.

10

Otra opción que hace cumplir la coincidencia exacta (es decir, sin coincidencia parcial) sería:

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

Usted puede leer más sobre el método de ajuste y sus argumentos en http://msdn.microsoft.com/en-us/library/office/ff835873(v=office.15).aspx

4

más sencilla función demostrada que trabaja en Apple OS también:

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

Aquí hay otra respuesta. Se trabaja rápido, fiable (véase la respuesta atomicules') y tiene código de llamada compacta: el uso

' 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 

muestra:

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

Si se trata de una lista de constantes, puede utilizar Select Case de la siguiente :

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

Una declaración Case podría satisfacer algunas aplicaciones más simplemente:

select case var 
case "a string", "another string", sVar 
    'do something 
case else 
    'do something else 
end select 
Cuestiones relacionadas