2016-06-07 6 views
12

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

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

Я могу сделать это с помощью

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

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

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

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

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

MsgBox UBound(DirArray, 1) 

И

MsgBox UBound(DirArray) 

Return 0, в то время как с бывшим они вернутся 1.

+0

Loop через диапазон. – findwindow

+0

Разве это не так эффективно? Я думал, что существует метод или свойство, которые позволят сразу загрузить весь массив в массив. Или что-то с аналогичным эффектом, если есть тип объектов без массива, которые я должен использовать вместо этого ... – basaltanglia

+1

вы должны иметь возможность просто сделать это. - DirArray = Range ("A1: A2") – chungtinhlakho

ответ

13

Просто определить переменную как вариант, и сделать их не более:

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

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

+0

Вау, это ослепительно очевидно. Я пробовал это, но не, я думаю, в сочетании с DirArray (1, 1), который был необходим, а не только DirArray (1). Спасибо огромное! – basaltanglia

+1

Но разве это не вариант, а не массив? Есть ли разница в использовании памяти в этом случае? –

+0

Теперь я понимаю, что использование Variant-массивов - один из единственных способов сделать что-то в Excel. –

15

Использование Value2 дает преимущество в производительности. Согласно Charles Williams blog

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

Так

DirArray = [a1:a5].Value2 
Смежные вопросы