Ответ 1
Просто определите переменную как вариант и сделайте ее равной:
Dim DirArray As Variant
DirArray = Range("a1:a5").Value
Нет необходимости в команде Array.
У меня есть, казалось бы, основная проблема, но я не могу найти никаких ресурсов, обращающихся к ней.
Проще говоря, я просто хочу загрузить содержимое диапазона ячеек (всего одного столбца) в массив.
Я могу выполнить это с помощью
DirArray = Array(Range("A1"), Range("A2"))
Но по какой-то причине я не могу создать массив, выраженный таким образом:
DirArray = Array(Range("A1:A2"))
Мой реальный диапазон намного длиннее (и может варьироваться по длине), поэтому я не хочу, чтобы индивидуально перечислять ячейки таким образом. Может ли кто-нибудь сказать мне, как правильно загрузить целый Range в массив?
С последним кодом:
MsgBox UBound(DirArray, 1)
и
MsgBox UBound(DirArray)
Возвращает 0, тогда как с первым они возвращают 1.
Просто определите переменную как вариант и сделайте ее равной:
Dim DirArray As Variant
DirArray = Range("a1:a5").Value
Нет необходимости в команде Array.
Использование Value2
дает преимущество в производительности. Согласно Чарльз Уильямс блог
Range.Value2 работает так же, как Range.Value, за исключением того, что он не проверяет формат ячейки и не конвертирует в Date или Currency. И, вероятно, почему он быстрее, чем .Value при получении чисел.
Итак,
DirArray = [a1:a5].Value2
Если мы сделаем это просто так:
Dim myArr as Variant
myArr = Range("A1:A10")
новый массив будет с двумя измерениями. С которым не всегда удобно работать:
Чтобы избавиться от двух измерений, при получении одного столбца в массиве мы можем использовать встроенную в Excel функцию "Транспонирование". С этим данные становятся в одном измерении:
Если у нас есть данные в ряд, одна транспонирование не будет делать эту работу. Нам нужно использовать функцию Transpose дважды:
В дополнение к предлагаемым решениям, и если у вас есть массив от 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