Compruebe si una cadena contiene otra cadena

233

Quiero encontrar si una cadena contiene un "," (coma) en ella. ¿Tenemos alguna otra opción que no sea leer char-by-char?

Krishna
fuente
14
¿ INSTRFunciona para ti?
Stephen Quan

Respuestas:

386

Use la función Instr

Dim pos As Integer

pos = InStr("find the comma, in the string", ",")

devolverá 15 en pos

Si no se encuentra, devolverá 0

Si necesita encontrar la coma con una fórmula de Excel, puede usar la =FIND(",";A1)función.

Tenga en cuenta que si desea usar Instrpara encontrar la posición de una cadena que no distingue entre mayúsculas y minúsculas, use el tercer parámetro de Instr y dele la constante vbTextCompare(o solo 1 para troqueles).

Dim posOf_A As Integer

posOf_A = InStr(1, "find the comma, in the string", "A", vbTextCompare)

le dará un valor de 14.

Tenga en cuenta que debe especificar la posición de inicio en este caso como se indica en la especificación que vinculé: el argumento de inicio es obligatorio si se especifica la comparación.

René
fuente
44
Pero, ¿qué pasa si la cadena encontrada está en la posición 0? ¿Cómo distingue entre "encontrado en el índice 0" y "no encontrado (0)"?
gEdringer
10
@gEdringer. Cuando la cadena que se encuentra está al principio, devuelve 1.
rene
69

También puedes usar la palabra especial like:

Public Sub Search()
  If "My Big String with, in the middle" Like "*,*" Then
    Debug.Print ("Found ','")
  End If
End Sub
Makah
fuente
3
Enlace al formato del patrón msdn.microsoft.com/en-us/library/…
Matthew Lock
23

También existe la función InStrRev que hace el mismo tipo de cosas, pero comienza a buscar desde el final del texto hasta el principio.

La respuesta de Per @ rene ...

Dim pos As Integer
pos = InStrRev("find the comma, in the string", ",")

... aún devolvería 15 a pos, pero si la cadena tiene más de una de la cadena de búsqueda, como la palabra "the", entonces:

Dim pos As Integer
pos = InStrRev("find the comma, in the string", "the")

... devolvería 20 a pos, en lugar de 6.

LimaNocheHawk
fuente
17

Sobre la base de la respuesta de Rene, también podría escribir una función que devolviera VERDADERO si la subcadena estaba presente o FALSO si no fuera así:

Public Function Contains(strBaseString As String, strSearchTerm As String) As Boolean
'Purpose: Returns TRUE if one string exists within another
On Error GoTo ErrorMessage
    Contains = InStr(strBaseString, strSearchTerm)
Exit Function
ErrorMessage:
MsgBox "The database has generated an error. Please contact the database administrator, quoting the following error message: '" & Err.Description & "'", vbCritical, "Database Error"
End
End Function
Barba siniestra
fuente
3
¿Qué tipo de error de base de datos esperamos en esta función? La captura de error y el mensaje de error parecen ser completamente inútiles.
Roobie Nuby
11
@RoobieNuby Ese es solo mi manejo de errores predeterminado. Lo puse en todas mis funciones porque si algo sale mal, quiero que el personal me llame, no intente arreglarlo por sí mismo.
Sinister Beard