2010-11-19 12 views
37

Tengo una matriz de cadenas:¿Cómo puedo usar a para cada ciclo en una matriz?

Dim sArray(4) as String 

Voy a través de cada cadena de la matriz:

for each element in sarray 
    do_something(element) 
next element 

do_something toma una cadena como parámetro

Recibo un error al pasar el elemento como una cadena:

ByRef Argument Mismatc h

¿Debería estar convirtiendo el elemento en una cadena o algo así?

+0

suena como que su firma do_algo ha sido especificada por refrendo pero debe ser byval en su lugar? – CarneyCode

Respuesta

70

elemento tiene que ser una variante, por lo que no puedes declararlo como una cadena. Su función debería aceptar una variante si es una cadena aunque siempre que la pase ByVal.

Public Sub example() 
    Dim sArray(4) As string 
    Dim element As variant 

    For Each element In sArray 
     do_something (element) 
    Next element 
End Sub 


Sub do_something(ByVal e As String) 

End Sub 

La otra opción es convertir la variante en una cadena antes de pasarla.

do_something CStr(element) 
+9

Respondí positivamente a esta respuesta porque eso es literalmente lo que se me pidió, pero creo que esta referencia relevante también merece mención: https://support.microsoft.com/en-us/kb/129931 –

+0

Esto no hará nada ya que sArray está vacío?!?! – Black

+0

@EdwardBlack - Solo dio fragmentos de código que son relevantes para la discusión. Presumiblemente, un código adicional entre el dimensionamiento de sArray y el bucle For Each realmente lo definiría. Pero cómo se define no es importante para la pregunta. –

23

A para cada estructura de bucle está más diseñado alrededor del objeto de colección. A For..Cada bucle requiere un tipo de variante u objeto. Dado que la variable de "elemento" se escribe como una variante de su función "hacer_algo" tendrá que aceptar un tipo de variante, o puede modificar su bucle a algo como esto:

Public Sub Example() 

    Dim sArray(4) As String 
    Dim i As Long 

    For i = LBound(sArray) To UBound(sArray) 
     do_something sArray(i) 
    Next i 

End Sub 
+0

+ Uno, el uso de LBound y UBound está claro! Aunque otra alternativa es el uso del bloque For Each. – SIslam

5

Uso la variable de contador como sugiere Fink. Si usted quiere para cada uno y para pasar ByRef (que puede ser más eficiente para las cadenas largas) que tiene que emitir su elemento como una cadena usando CStr

Sub Example() 

    Dim vItm As Variant 
    Dim aStrings(1 To 4) As String 

    aStrings(1) = "one": aStrings(2) = "two": aStrings(3) = "three": aStrings(4) = "four" 

    For Each vItm In aStrings 
     do_something CStr(vItm) 
    Next vItm 

End Sub 

Function do_something(ByRef sInput As String) 

    Debug.Print sInput 

End Function 
2

¿qué pasa con esta simple función InArray:

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 
Cuestiones relacionadas