2010-11-19 4 views
37

Ich habe ein Array von Strings:Wie kann ich eine für jede Schleife in einem Array verwenden?

Dim sArray(4) as String 

ich in der Anordnung durch die einzelnen String werde:

for each element in sarray 
    do_something(element) 
next element 

do_something nimmt einen String als Parameter

ich einen Fehler Gang bin immer das Element als String:

ByRef Argument Mismatc h

Sollte ich das Element in einen String oder etwas konvertieren?

+0

klingt wie Ihre do_something-Signatur hat byref angegeben, aber es sollte stattdessen byval sein? – CarneyCode

Antwort

70

Element eine Variante sein muss, Sie können es also nicht als String deklarieren. Ihre Funktion sollte eine Variante akzeptieren, wenn es sich um eine Zeichenfolge handelt, solange Sie sie ByVal übergeben.

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 

Die andere Option besteht darin, die Variante in eine Zeichenfolge zu konvertieren, bevor sie übergeben wird.

do_something CStr(element) 
+9

Ich gab dieser Antwort ein Up-Vote, weil das wörtlich ist, was gefragt wurde, aber ich denke, dass diese relevante Referenz ebenfalls erwähnt werden muss: https://support.microsoft.com/en-us/kb/129931 –

+0

Das wird nichts tun, da sArray leer ist?!?! – Black

+0

@EdwardBlack - Er gab nur Codeschnipsel, die für die Diskussion relevant sind. Vermutlich würde zusätzlicher Code zwischen der Dimensionierung von sArray und der For Each-Schleife dies definieren. Aber wie es definiert ist, ist für die Frage nicht wichtig. –

23

A für jede Schleifenstruktur ist mehr um das Sammlungsobjekt entworfen. A For..Jede Schleife benötigt einen Variant-Typ oder -Objekt. Da Ihr „Element“ Variable als eine Variante Ihre „do_something“ eingegeben wird Funktion benötigen einen Variantentyp zu akzeptieren, oder Sie können Ihre Schleife so etwas wie dies ändern:

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

+ One, die Verwendung von LBound und UBound ist klar !! Obwohl eine andere Alternative For Each Block verwendet. – SIslam

5

Ich benutze die Counter-Variable wie Fink suggeriert. Wenn Sie möchten, für jeden und passiert ByRef (die effizienten für lange Strings sein kann) Sie werfen müssen, um Ihr Element als String CStr mit

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

was ist mit dieser einfachen InArray Funktion:

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 
Verwandte Themen