2010-11-19 97 views
37

我有一个字符串数组:如何在阵列上使用每个循环?

Dim sArray(4) as String 

我通过阵列中的每个字符串去:

for each element in sarray 
    do_something(element) 
next element 

do_something以一个字符串作为参数

我得到一个错误的传球作为字符串的元素:

ByRef Argument Mismatc h

我应该将元素转换为String还是其他?

+0

听起来像你的do_something签名具有byref指定,但它应该是byval而不是? – CarneyCode 2010-11-19 18:36:22

回答

70

元素必须是一个变体,所以你不能把它声明为一个字符串。你的函数应该接受一个变体,如果它是一个字符串,只要你通过它的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 

另一种选择是在传递变量之前将变体转换为字符串。

do_something CStr(element) 
+9

我给这个答案加了一票,因为这实际上是被问到的,但我觉得这个相关的参考也值得一提:https://support.microsoft.com/en-us/kb/129931 – 2015-05-12 14:52:27

+0

由于sArray是空的,这将不会执行任何操作?!?! – Black 2016-11-10 09:16:03

+0

@EdwardBlack - 他只给出与讨论相关的代码片段。据推测,sArray和For Each循环的尺寸之间的附加代码实际上会定义它。但是如何定义这个问题并不重要。 – 2017-01-24 20:43:59

23

针对每个循环结构的A更多地围绕集合对象设计。 For..Each循环需要变体类型或对象。由于您的“元素”变量被类型为一个变体的“do_something”功能将需要接受一个变量类型,也可以修改你的循环,这样的事情:

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

+一,LBound和UBound的使用很清楚!虽然另一种选择是使用For Each块.. – SIslam 2016-03-11 09:02:17

5

我使用像Fink建议的计数器变量。如果你想为每通过为ByRef(这对于长字符串更高效的),你必须投你的元素使用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

你看这个简单的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