2016-06-07 24 views
12

Mam pozornie podstawowy problem, ale nie mogę znaleźć żadnych zasobów adresujących go.Tworzenie tablicy z zakresu w VBA

Po prostu chcę tylko załadować zawartość zakresu komórek (wszystkie kolumny) do tablicy.

jestem w stanie tego dokonać za pomocą

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

Ale z jakiegoś powodu, nie mogę utworzyć tablicę gdy wyrażona w ten sposób:

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

Mój prawdziwy zakres jest znacznie dłuższy (i może mieć różną długość), więc nie chcę pojedynczo wyliczać komórek w ten sposób. Czy ktoś może mi powiedzieć, jak prawidłowo załadować cały zakres do tablicy?

Z drugiej kodu:

MsgBox UBound(DirArray, 1) 

I

MsgBox UBound(DirArray) 

return 0, natomiast z byłego wrócą 1.

+0

Loop dzięki swoim przedziale. – findwindow

+0

Czy to nie jest mniej wydajne? Sądziłem, że na pewno istnieje metoda lub właściwość, która umożliwiłaby załadowanie całego zakresu jednocześnie. Albo coś o podobnym działaniu, jeśli istnieje typ obiektu, którego nie powinienem używać, powinienem użyć ... – basaltanglia

+1

powinieneś być w stanie to zrobić. - DirArray = Zakres ("A1: A2") – chungtinhlakho

Odpowiedz

13

Wystarczy zdefiniować zmienną jako wariant, i uczynić je równe:

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

Nie ma potrzeby użycia polecenia Array.

+0

Wow, to jest oślepiająco oczywiste. Próbowałem tego, ale nie, jak sądzę, w połączeniu z DirArray (1, 1), który był potrzebny zamiast tylko DirArray (1). Dziękuję bardzo! – basaltanglia

+1

Ale czy to nie Wariant, a nie tablica? Czy w tym przypadku występuje różnica w wykorzystaniu pamięci? –

+0

Zdaję sobie sprawę, że używanie tablic Variant jest jednym z niewielu sposobów robienia rzeczy w Excelu. –

15

Korzystanie z Value2 daje korzyści wydajności. Zgodnie Charles Williams blog

Range.Value2 działa w ten sam sposób jak Range.Value, oprócz tego, że nie sprawdza format komórek i konwersji do daty lub waluty. I to pewnie dlatego jest szybsze niż .Value przy pobieraniu liczb.

Więc

DirArray = [a1:a5].Value2