我有一个字符串数组:
Dim sArray(4) as String
我正在浏览数组中的每个String:
for each element in sarray
do_something(element)
next element
do_something
将字符串作为参数
我收到错误,将该元素作为String传递:
ByRef Argument Mismatch
我应该将元素转换为String还是什么?
答案 0 :(得分:98)
元素必须是变体,因此您不能将其声明为字符串。只要你传递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)
答案 1 :(得分:32)
每个循环结构的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
答案 2 :(得分:8)
我像Fink建议的那样使用计数器变量。如果你想要For Each并传递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
答案 3 :(得分:4)
这个简单的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
答案 4 :(得分:2)
如果在这种情况下可以接受替代方案,我宁愿建议 UBound :
For i = 1 to UBound(nameofthearray)
your code here
next i