Как я могу использовать для каждого цикла в массиве?

34

У меня есть массив строк:

Dim sArray(4) as String

Я просматриваю каждую строку в массиве:

for each element in sarray
  do_something(element)
next element

do_something принимает строку как параметр

Я получаю сообщение об ошибке, передавая элемент как String:

Ошибка несоответствия аргумента ByRef

Должен ли я преобразовать элемент в строку или что-то еще?

  • 0
    звучит так, как будто в вашей подписи do_something указан параметр byref, но вместо этого он должен быть равен byval?
Теги:
excel

4 ответа

64
Лучший ответ

Элемент должен быть вариантом, поэтому вы не можете объявить его как строку. Ваша функция должна принимать вариант, если это строка, хотя до тех пор, пока вы передаете ее 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)
  • 0
    Это ничего не даст, так как sArray пусто?!?!
  • 1
    @EdwardBlack - он дал только фрагменты кода, которые имеют отношение к обсуждению. Предположительно, дополнительный код между размерами sArray и циклом For Each фактически определит его. Но как это определяется, не важно для вопроса.
21

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
  • 0
    + Во-первых, использование LBound и UBound понятно !! Хотя другая альтернатива использует для каждого блока ..
5

Я использую переменную счетчика, как предполагает 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
2

как насчет этой простой функции 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню