如何为阵列上的每个循环使用a?

时间:2010-11-19 18:22:23

标签: excel vba

我有一个字符串数组:

Dim sArray(4) as String

我正在浏览数组中的每个String:

for each element in sarray
  do_something(element)
next element

do_something将字符串作为参数

我收到错误,将该元素作为String传递:

  

ByRef Argument Mismatch

我应该将元素转换为String还是什么?

5 个答案:

答案 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