2017-01-02 2 views
0

У меня небольшая проблема с a для каждого цикла, итерации через массив целых чисел. У меня есть что-то вроде этого:получить индекс в a для каждого цикла на массиве VBA

Dim arr(3) as Integer 
Dim vari as variant 

for each vari in arr 
    debug.print vari 
next var 

Хотя это возвращает значение правильно, я бы также нужен способ, чтобы обратиться к порядковому номеру данного элемента в массиве (будь то обр (1), (2) и т.д). Как это сделать с помощью для каждого цикла? Я знаю, как это сделать, используя цикл for x = y to z, но я бы предпочел сохранить его как для каждого цикла.

+0

Почему вы "а держать его как для каждого цикла"? Ваш вопрос в основном «как я могу сделать X без использования инструмента, который я уже знаю о том, что он предназначен для *** именно того, что я хочу ***»? – Comintern

+0

Я надеялся сохранить его как для каждого цикла, чтобы упростить его поддержку, поскольку количество элементов в массиве, скорее всего, будет меняться. Мне не приходило в голову использовать UBound LBound для этого. –

ответ

2

Вам нужно использовать традиционный цикл, если вы хотите получить легкий доступ к индексу элемента. Попробуйте это ...

Sub Test2() 

    Dim arr(3) As Integer 
    Dim vari As Variant 
    arr(0) = 5: arr(1) = 4: arr(2) = 3: arr(3) = 2 

    Dim lIdx As Long 
    For lIdx = LBound(arr) To UBound(arr) '* though you have defined the bounds to be 3 above !! anyway... 
     vari = arr(lIdx) 
     Debug.Print vari, lIdx 
    Next lIdx 
' For Each vari In arr 
'  Debug.Print vari 
' Next Var 
End Sub 

Там нет нет способа получить номер индекса из For Each цикла. Если вы хотите доказательств, то здесь есть документация для интерфейса IEnumVARIANT, что подчеркивает For Each в VB6/VBA https://msdn.microsoft.com/en-us/library/windows/desktop/ms221053(v=vs.85).aspx

+0

Спасибо за ссылку. Также «LBound to UBound» работал как шарм и устранял мою потребность в «для каждого». –

0

Если вы действительно настаиваете на использовании For Each, то вам необходимо следить за индексом, используя переменную-счетчик, т.е. переменной idx в коде ниже:

Dim arr(1 to 3) as Integer '<-- 1 to 3 if you want your array index start with 1 instead of zero 
Dim vari as variant 
Dim idx as long: idx = LBound(arr) 

For Each vari In arr 
    debug.print "The item at index " & idx & " is: " & vari 
    idx = idx + 1 
Next vari 
0

Вот попробуйте это изменить его первым.

Sub forEachArray()

Dim element As Variant 
Dim animals(0 To 5) As String 
'We have created an array that can hold 6 elements 

animals(0) = "Dog" 
animals(1) = "Cat" 
animals(2) = "Bird" 
animals(3) = "Buffalo" 
animals(4) = "Snake" 
animals(5) = "Duck-billed Platypus" 
'We fill each element of the array 


For Each element In animals 
'animals consists of 6 "elements" 

    Debug.Print element 
    'printing to the immediate window 

Next 

End Sub

Смежные вопросы