У меня есть массив строк:
Dim sArray(4) as String
Я просматриваю каждую строку в массиве:
for each element in sarray
do_something(element)
next element
do_something
принимает строку как параметр
Я получаю сообщение об ошибке, передавая элемент как String:
Ошибка несоответствия аргумента ByRef
Должен ли я преобразовать элемент в строку или что-то еще?
Элемент должен быть вариантом, поэтому вы не можете объявить его как строку. Ваша функция должна принимать вариант, если это строка, хотя до тех пор, пока вы передаете ее 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)
A для каждой структуры цикла более сконструирован вокруг объекта коллекции. Для цикла 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
Я использую переменную счетчика, как предполагает 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