vba - simples - Encuentra todas las cadenas dentro de una cadena
vba comillas entre comillas (3)
Al usar Reemplazar y Dividir , esto se logró fácilmente.
Option Explicit
Public Sub StringInString()
Dim myString As String: myString = "This is my string. {This is another string.} How do I go about searching through this?"
Dim findString As String: findString = "this"
Dim var As Variant, mySplit As Variant
Dim matchCount As Integer: matchCount = 0
'' Remove any characters that aren''t pure text, but leave spaces so we can split on those.
Dim removeChars: removeChars = Array(".", ",", "/", "/", "|", "{", "}", "[", "]", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "-", "+", "=", ":", ";", """", "''", "<", ">", "?", "`", "~")
For Each var In removeChars
myString = Replace(myString, var, vbNullString)
Next
mySplit = Split(myString, " ")
For Each var In mySplit
If (LCase(findString) = LCase(var)) Then matchCount = matchCount + 1
Next
End Sub
No sé muy bien qué es lo que espera como resultado, así que modifíquelo según sea necesario.
EDITAR:
Incluso solución más simple, usando expresiones regulares (referencia requerida a Micrsoft VBScript Regular Expressions 5.5):
Public Sub StringInStringRegex()
Dim myString As String: myString = "This is my string. {This is another string.} How do I go about searching through this?"
Dim reg As New RegExp
reg.Pattern = "(this)"
reg.Global = True
reg.IgnoreCase = True
reg.MultiLine = True
Dim Matches As MatchCollection
Set Matches = reg.Execute(myString)
Dim matchCount As Integer: matchCount = Matches.Count
End Sub
Fuentes: cómo usar expresiones regulares (Regex) en Microsoft Excel tanto en celdas como en bucles y recuento de coincidencias de patrones en excel (regex y vba)
Obtengo StrTxt como cadena html mediante el texto de respuesta de solicitud http. Quiero encontrar todas las apariciones de ''"cadena"'' en StrTxt.
Algo como esto.
for each string in StrTxt
StrTxt = "all matched strings from StrTxt"
do something StrTxt.
Editar Esto está etiquetado como posible duplicado pero no lo es. Cómo recorrer cada palabra en un documento de Word: VBA Macro explica cómo encontrar la secuencia en el documento y no en la cadena.
Es simplemente simple. ¿Cómo encontrar todas las cadenas dentro de cadenas? ¿No es mi título lo explica todo?
Editar 2
De la respuesta de Ansgar Wiechers intenté seguir.
Do
i = InStr(strtxt, "startstring")
If i > 0 Then
strtxt = Mid(strtxt, i, Len(strtxt) - i)
i = InStr(InStr(strtxt, "midstring") + 1, strtxt, "endstring")
If i > 0 Then
strtxt = Left(strtxt, i + Len(endstring)) '' I am using i+4 as I know the length
WScript.Echo strtxt
End If
End If
Loop While i > 0
Da solo una ocurrencia. Cómo hacer un bucle correctamente?
Pruebe este ejemplo comentado usando una matriz dinámica y la función InStr
:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Find a string in a sentence
''Recherche d''une chaine de caractère dans une phrase
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Instruction Option Explicit: Force explicit declaration of all variables in a script
''Instruction Option Explicit: Force la déclaration explicite de toutes les variables dans un script
Option Explicit
Dim Texte,sChaine
Texte = "This is my string. {This is another string.} How do I go about searching through this?"
sChaine = "this" ''chaine recherchée
''Instruction Dim: Declares variables and allocates storage space
''Instruction Dim: Déclare des variables et alloue l''espace de stockage
Dim aPos() , iPos
''ReDim Statement: Declares the dynamic array of variables and attribute or
''Reallocates storage space at the procedure
''Table where positions are stored
''Instruction ReDim: Déclare les variables de tableau dynamique et attribue ou
''réattribue l''espace de stockage au niveau de la procédure
''Tableau ou sont stockées les positions
ReDim aPos(0)
''InStr Function: Returns the position of the first occurrence of a string
''In the interior of another
''Fonction InStr: Renvoie la position de la première occurrence d''une chaîne
''à l''intérieur d''une autre
iPos = InStr(1, Texte, sChaine, vbTextCompare)
''Instruction While ... Wend: Run a set of instructions as long as a given condition is True
''Instruction While...Wend: Exécute une série d''instructions tant qu''une condition donnée est True
While iPos <> 0
''UBound Function: Returns the largest available subscript for the indicated dimension of an array
''Fonction UBound: Renvoie le plus grand indice disponible pour la dimension indiquée d''un tableau
ReDim Preserve aPos(UBound(aPos) + 1)
aPos(UBound(aPos)) = iPos
iPos = InStr(iPos + 1, Texte, sChaine, vbTextCompare)
Wend
''If ... Then ... Else Instruction: Executes a group of statements subject to a condition,
''In dependence of the value of an expression
''Instruction If...Then...Else: Exécute un groupe d''instructions soumises à une condition,
''en fonction de la valeur d''une expression
If UBound(aPos) > 0 Then
Dim i , Resultat
Resultat = "Occurrence """ & sChaine & """ found " & UBound(aPos) & " times " & _
"in the phrase" & vbCrLf & vbCrLf & """" & Texte & """" & vbCrLf & vbCrLf & _
"L''occurrence """ & sChaine & """ a été trouvée " & UBound(aPos) & " fois " &_
"dans l''expression " & vbCrLf & vbCrLf & """" & Texte & """" & vbCrLf
''Instruction For ... Next: Repeats a group of statements a specified number of times
''CStr Function: Returns an expression that has been converted to a String subtype Variant
''Len Function: Returns the number of characters in a string
''Instruction For...Next: Répète un groupe d''instructions un nombre spécifié de fois
''Fonction CStr: Renvoie une expression qui a été convertie en un Variant de sous-type String
''Fonction Len: Renvoie le nombre de caractères contenus dans une chaîne
For i = 1 To UBound(aPos)
Resultat = Resultat & vbCrLf & "Postion: " & CStr(aPos(i)) & "," & CStr(aPos(i)) + Len(sChaine)
Next
Else
Resultat = "L''occurrence """ & sChaine & """ n''a pas été trouvée dans l''expression " &vbCrLf&vbCrLf&_
"""" & Texte & """"
End If
Wscript.echo Resultat
Si desea utilizar InStr
para buscar una cadena para todas las apariciones de una subcadena en particular, debe llamar a la función repetidamente, comenzando cada búsqueda nueva (al menos) un carácter después de la última coincidencia.
response = "..." ''your HTTP response string
srch = "..." ''the string you want to find in the response
start = 1
Do
pos = InStr(start, response, srch, vbTextCompare)
If pos > 0 Then
start = pos + 1 ''alternatively: start = pos + Len(srch)
WScript.Echo pos
WScript.Echo Mid(response, pos, Len(srch))
End If
Loop While pos > 0
Si desea que la comparación sea sensible a mayúsculas y minúsculas, reemplace vbTextCompare
con vbBinaryCompare
.
Editar: para encontrar patrones que comiencen con una cadena, contengan otra y terminen con una tercera, probablemente sea mejor usar una expresión regular . @TylerStandishMan ya mostró el principio básico en su respuesta , pero hay algunas cosas que observar en su escenario.
response = "..." ''your HTTP response string
startTerm = "startstring"
midTerm = "midstring"
endTerm = "endstring"
Set re = New RegExp
re.Pattern = startTerm & "[/s/S]*?" & midTerm & "[/s/S]*?" & endTerm
re.Global = True
re.IgnoreCase = True ''if required
For Each m In re.Execute(response)
WScript.Echo m
Next
Algunos caracteres en una expresión regular tienen un significado especial (por ejemplo, coincide con cualquier carácter excepto líneas nuevas), por lo que debe asegurarse de que dicho carácter en sus términos de inicio, medio y final se escape correctamente (por ejemplo, use /.
Para hacer coincidir un literal punto). En caso de que la subcadena que desea combinar abarque más de una línea, necesita aquellas partes de la expresión que coincidan con el texto arbitrario entre los términos de búsqueda para incluir caracteres de nueva línea (por ejemplo [/s/S]
para que coincida con cualquier espacio en blanco o no blanco) . También es posible que desee que el partido no sea codicioso, de lo contrario, obtendría una coincidencia única desde la primera aparición de startTerm
hasta la última aparición de endTerm
. Eso es lo que el modificador *?
es para.