una simples simple sencilla entre dobles doble concatenar como comillas comilla caracter cadena buscar vba vbscript word-vba

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.