2010-11-19 19 views
37

Ho un array di stringhe:Come posso usare un per ogni ciclo su un array?

Dim sArray(4) as String 

sto attraversando ogni stringa nella matrice:

for each element in sarray 
    do_something(element) 
next element 

do_something prende una stringa come parametro

sto ottenendo un passaggio errore l'elemento come stringa:

ByRef Argument Mismatc h

Devo convertire l'elemento in stringa o qualcosa del genere?

+0

sembra che la tua firma do_qualcosa abbia specificato byref, ma dovrebbe essere invece byval? – CarneyCode

risposta

70

elemento deve essere una variante, quindi non puoi dichiararlo come una stringa. La tua funzione dovrebbe accettare una variante se si tratta di una stringa, purché tu la superi 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 

L'altra opzione è di convertire la variante in stringa prima di passarla.

do_something CStr(element) 
+9

Ho dato questa risposta in rialzo perché è letteralmente quello che è stato chiesto, ma ritengo che questo riferimento pertinente meriti menzione: https://support.microsoft.com/en-us/kb/129931 –

+0

Questo non farà nulla da quando sArray è vuoto?!?! – Black

+0

@EdwardBlack - Ha fornito solo frammenti di codice rilevanti per la discussione. Presumibilmente codice aggiuntivo tra la quotatura di sArray e il ciclo For Each lo definirà effettivamente. Ma come è definito non è importante per la domanda. –

23

A per ogni struttura del ciclo è più progettato attorno all'oggetto di raccolta. Un ciclo For..Each richiede un tipo o un oggetto variante. Dal momento che la variabile "elemento" viene digitato come variante la funzione "fa_qualcosa" dovrà accettare un tipo di variante, oppure è possibile modificare il proprio ciclo per qualcosa di simile:

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, l'uso di LBound e UBound è chiaro !! Sebbene un'altra alternativa stia usando Per ogni blocco .. – SIslam

5

Uso la variabile contatore come suggerisce Fink. Se si desidera per ciascuno e passare ByRef (che può essere più efficiente per lunghe stringhe) si deve lanciare la vostra elemento come una stringa utilizzando 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

che dire di questo semplice funzione 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 
Problemi correlati