如何为数组的每个循环使用a?


71

我有一个字符串数组:

Dim sArray(4) as String

我正在遍历数组中的每个字符串:

for each element in sarray
  do_something(element)
next element

do_something 将字符串作为参数

我在将元素作为字符串传递时遇到错误:

ByRef参数不匹配

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


听起来您的do_something签名已指定byref,但应该改为byval?
CarneyCode

Answers:


115

元素必须是一个变体,因此您不能将其声明为字符串。只要是字符串,您的函数就应该接受一个变体,只要您将其传递给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)

由于sArray为空,这将无济于事?!?!
黑色

2
@EdwardBlack-他只给出了与讨论相关的代码片段。大概在sArray的尺寸和For Each循环之间可以定义附加代码​​。但是,如何定义它对这个问题并不重要。
保罗·辛克莱

42

针对每个循环结构在集合对象周围进行了更多设计。For..Each循环需要一个变量类型或对象。由于将“ element”变量输入为变量,因此“ 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

+一个,LBound和UBound的用法很清楚!尽管另一种替代方法是使用“每个块”。
SIslam

lboundubound是否需要索引i的循环,并与可另一种使用情况是非常有用的foreach..
蒂莫

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

5

这个简单的inArray函数呢?

Function isInArray(ByRef stringToBeFound As String, ByRef arr As Variant) As Boolean
For Each element In arr
    If element = stringToBeFound Then
        isInArray = True
        Exit Function
    End If
Next element
End Function
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.