Создание массива из диапазона в VBA

У меня есть, казалось бы, основная проблема, но я не могу найти никаких ресурсов, обращающихся к ней.

Проще говоря, я просто хочу загрузить содержимое диапазона ячеек (всего одного столбца) в массив.

Я могу выполнить это с помощью

DirArray = Array(Range("A1"), Range("A2"))

Но по какой-то причине я не могу создать массив, выраженный таким образом:

DirArray = Array(Range("A1:A2"))

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

С последним кодом:

MsgBox UBound(DirArray, 1)

и

MsgBox UBound(DirArray)

Возвращает 0, тогда как с первым они возвращают 1.

Ответ 1

Просто определите переменную как вариант и сделайте ее равной:

Dim DirArray As Variant
DirArray = Range("a1:a5").Value

Нет необходимости в команде Array.

Ответ 2

Использование Value2 дает преимущество в производительности. Согласно Чарльз Уильямс блог

Range.Value2 работает так же, как Range.Value, за исключением того, что он не проверяет формат ячейки и не конвертирует в Date или Currency. И, вероятно, почему он быстрее, чем .Value при получении чисел.

Итак,

DirArray = [a1:a5].Value2

Ответ 3

Если мы сделаем это просто так:

Dim myArr as Variant
myArr = Range("A1:A10")

новый массив будет с двумя измерениями. С которым не всегда удобно работать:

enter image description here

Чтобы избавиться от двух измерений, при получении одного столбца в массиве мы можем использовать встроенную в Excel функцию "Транспонирование". С этим данные становятся в одном измерении:

enter image description here

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

enter image description here

Ответ 4

В дополнение к предлагаемым решениям, и если у вас есть массив от 1D до 1D, я предпочитаю обрабатывать его с помощью функции, как показано ниже. Причина проста: если по какой-либо причине ваш диапазон уменьшается до 1 диапазона элементов, насколько я знаю, команда Range(). Значение не будет возвращать массив вариантов, а только вариант, и вы не сможете назначить вариант переменная в массиве вариантов (ранее объявленном).

Мне пришлось преобразовать диапазон переменного размера в двойной массив, и когда диапазон был равен 1 размеру ячейки, я не смог использовать такую конструкцию, как range(). Value, поэтому я продолжил работу с функцией, описанной ниже.

Public Function Rng2Array(inputRange As Range) As Double()

    Dim out() As Double    
    ReDim out(inputRange.Columns.Count - 1)

    Dim cell As Range
    Dim i As Long
    For i = 0 To inputRange.Columns.Count - 1
        out(i) = inputRange(1, i + 1) 'loop over a range "row"
    Next

    Rng2Array = out  
End Function