2015-08-24 2 views
3

В примере я увидел array() = range().value, и я пытаюсь понять, как это работает.Array() = range(). Значение

Sub test() 
Dim arr() As Variant 

arr() = Range("E5:E7").Value 
For i = 0 To UBound(arr) 
    Debug.Print arr(i) 
Next i 

End Sub 

Во-первых, выше код дает мне subscript out of range ошибку. Как так ? Во-вторых, какая часть документации сообщит мне, как бы играла array() = range().value без ее тестирования? Моя гипотеза заключается в том, что она будет проходить через ячейки слева вверху вправо и добавлять их в массив. Как я могу это подтвердить?

ответ

1

Это хорошо читать для вас: http://www.cpearson.com/excel/ArraysAndRanges.aspx

Причина вы получаете «вне диапазона», потому что она возвращает 2 одномерный массив.

Ваша строка кода For i = 0 To UBound(arr) должна быть For i = 1 To UBound(arr,1)

Кроме того, массив начинается с 1, так что не используйте 0 For i = 1 to UBound(arr, 1)

Ваш исправленный код будет выглядеть так:

Sub Test() 

Dim arr() as Variant 
arr = Range("E5:E7") 
For i = 1 To UBound(arr, 1) 
    MsgBox (arr(i, 1)) 
Next i 

End Sub 
+0

Выбрано это как ответ из-за информационной ссылки на эту тему. Всем спасибо. – newdimension

+0

Почему я получаю «несоответствие типов», если я изменяю диапазон до «Range (« E5 »)'? – newdimension

+0

Если диапазон является одной ячейкой, он возвращает одно значение вместо диапазона. Только диапазоны, содержащие несколько ячеек, возвращают массив. Вы можете определить это, используя «If Range» («E5»). Cells.CountLarge = 1' и программа соответственно. – user1274820

2

Я вижу две проблемы с вашим кодом. Первое, что вы начинаете I 0, но массивы в Excel начинаются с индекса 1. Вместо For i = 0 вы можете использовать For i = LBound(arr) как вы используете UBound(arr) или просто запустить его на 1.

Во-вторых, и что более важно, массив ячейки имеют как столбцы, так и строки. Когда вы читаете диапазон в массив вариантов, вы получаете двумерный результат (строки и столбцы), а не одномерный результат, как вы, кажется, ожидаете.

Попробуйте это:

Sub test() 
     Dim arr() As Variant 
     Dim i As Long, j As Long 

     arr() = Range("E5:E7").Value 
     For i = 1 To UBound(arr, 1) 
       For j = 1 To UBound(arr, 2) 
         Debug.Print arr(i, j) 
       Next j 
     Next i 
End Sub 

Если вы хотите, чтобы получить только значения ячеек в одномерный массив, вы можете сделать это с помощью функции Transpose, как это:

arr() = Application.WorksheetFunction.Transpose(Range("E5:E7").Value) 

Если вы сделаете это, массив станет одномерным, и вы можете проходить через него, как вы пытались.

arr() = Application.WorksheetFunction.Transpose(Range("E5:E7").Value) 

For i = 1 To UBound(arr) 
    Debug.Print arr(i) 
Next i 
0

Это в основном загружая значения ячейки E5 - E7 в массив. Но он будет двухмерным. Поэтому вам понадобится Debug.Print arr (i, 1)

Sub test() 
Dim arr() As Variant 

arr() = Range("E5:E7").Value 
For i = 1 To UBound(arr) 
    Debug.Print arr(i, 1) 
Next i 

End Sub 
+0

Я получаю ошибку «Тип несоответствия» с кодом. Изменить: это потому, что я изменил диапазон на «Range (« E5 »)». – newdimension

+0

Вам нужно будет начать с 1 Для i = 1 – MatthewD

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