我有一个字符串数组:如何在阵列上使用每个循环?
Dim sArray(4) as String
我通过阵列中的每个字符串去:
for each element in sarray
do_something(element)
next element
do_something
以一个字符串作为参数
我得到一个错误的传球作为字符串的元素:
ByRef Argument Mismatc h
我应该将元素转换为String还是其他?
我有一个字符串数组:如何在阵列上使用每个循环?
Dim sArray(4) as String
我通过阵列中的每个字符串去:
for each element in sarray
do_something(element)
next element
do_something
以一个字符串作为参数
我得到一个错误的传球作为字符串的元素:
ByRef Argument Mismatc h
我应该将元素转换为String还是其他?
元素必须是一个变体,所以你不能把它声明为一个字符串。你的函数应该接受一个变体,如果它是一个字符串,只要你通过它的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)
我给这个答案加了一票,因为这实际上是被问到的,但我觉得这个相关的参考也值得一提:https://support.microsoft.com/en-us/kb/129931 – 2015-05-12 14:52:27
由于sArray是空的,这将不会执行任何操作?!?! – Black 2016-11-10 09:16:03
@EdwardBlack - 他只给出与讨论相关的代码片段。据推测,sArray和For Each循环的尺寸之间的附加代码实际上会定义它。但是如何定义这个问题并不重要。 – 2017-01-24 20:43:59
针对每个循环结构的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
+一,LBound和UBound的使用很清楚!虽然另一种选择是使用For Each块.. – SIslam 2016-03-11 09:02:17
我使用像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
你看这个简单的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
听起来像你的do_something签名具有byref指定,但它应该是byval而不是? – CarneyCode 2010-11-19 18:36:22