2012-08-09 75 views
5

Tengo problemas para que mi caso de prueba se ejecute correctamente.QTP: comprobación Si una matriz de cadenas contiene un valor

El problema está en el código siguiente, la primera instrucción if es exacta. QTP se queja de que un objeto se requiere

For j=Lbound(options) to Ubound(options) 
    If options(j).Contains(choice) Then 
     MsgBox("Found " & FindThisString & " at index " & _ 
     options.IndexOf(choice)) 
    Else 
     MsgBox "String not found!" 
    End If 
Next 

Cuando compruebo la matriz puedo ver que se rellena correctamente y 'j' es también la cadena correcta. Cualquier ayuda con este problema sería muy apreciada.

+0

¿Cuáles son los contenidos de 'options'? ¿Son estas cuerdas, algún tipo de objeto de prueba (si es así, qué tipo)? – Motti

+0

Estoy poblando opciones como: 'options (0) =" welcome "' que es cadenas si estoy en lo correcto. Es una matriz de tamaño fijo. – L337BEAN

Respuesta

13

Las cadenas en VBScript no son objetos, ya que no tienen funciones de miembro. La búsqueda de una subcadena debe realizarse utilizando la función InStr.

For j=Lbound(options) to Ubound(options) 
    If InStr(options(j), choice) <> 0 Then 
     MsgBox("Found " & choice & " at index " & j 
    Else 
     MsgBox "String not found!" 
    End If 
Next 
+0

Ah sí. Eso explica los problemas que estaba teniendo. Gracias por tu respuesta informativa. – L337BEAN

-2

Hola si marca cadena exacta no subcadena en el uso conjunto StrComb porque si uso InStr continuación, si el array = "apple1", "apple2", "apple3", "manzana" y la elección = "manzana "Entonces todo volverá para cada elemento de la matriz.

Function CompareStrings (arrayItems , choice) 

For i=Lbound(arrayItems) to Ubound(arrayItems) 

    ' 1 - for binary comparison "Case sensitive 
    ' 0 - not case sensitive 
    If StrComp(arrayItems(i), choice , 1) = 0 Then 

    CompareStrings = True 
    MsgBox("Found " & choice & " at index " & i 

    Else 

    CompareStrings = False 
    MsgBox "String not found!" 

    End If 

Next 

End Function 
+0

En lugar de los números mágicos (¡incorrectos!) Se deben usar las constantes vbTextCompare/vbBinaryCompare (http://msdn.microsoft.com/en-us/library/05z4sfc7%28v=vs.84%29.aspx); establecer el valor de retorno * en * el ciclo no tiene sentido. –

+0

Lo sentimos ... Tienes razón ... también abt el ciclo ... Gracias –

+0

Lo siento ... Tienes razón sobre el ciclo ... pero he intentado pasar 0 y 1 parece funcionar bien ... Creo que en lugar de vbTextCompare/vbBinaryCompare 0 y 1 funcionan bien ... Gracias –

0
Function CompareStrings (arrayItems , choice) 
For i=Lbound(arrayItems) to Ubound(arrayItems) 

' 0 - for binary comparison "Case sensitive 
' 1 - for text compare not case sensitive 
If StrComp(arrayItems(i), choice , 0) = 0 Then 

MsgBox("Found " & choice & " at index " & i 

Else 

MsgBox "String not found!" 

End If 

Next 

End Function 
+0

ahora su función no es una función y todavía no utiliza las constantes. Elimine esta 'respuesta' y corrija la anterior (que contiene el valioso puntero a StrComp()). –

10

Una forma concisa para comprobar si una matriz de cadenas contiene un valor sería combinar las Filter y UBound funciones:

 If Ubound(Filter(options, choice)) > -1 Then 
      MsgBox "Found" 
     Else 
      MsgBox "Not found!" 
     End If 

Contras: no obtiene los índices donde los elementos se encuentran

Ventajas: es simple y tiene los parámetros de inclusión y comparación habituales para especificar los criterios de coincidencia.

+1

Si entiendo los documentos correctamente, el problema con esta solución es que Filter devolverá todos los elementos donde la opción es una subcadena. P.ej. con una matriz que contiene "Dune", "Dunebug", "Blah" y choice = "Dune", devolverá dos elementos. –

Cuestiones relacionadas