Po przeczytaniu postu gdzie prezentowałem szybki zapis danych z tablicy do arkusza (Zapisywanie zakresów) wielu z Was zapewne zastanawiało się, czy tę technikę można zastosować w odwrotnym kierunku: czyli wczytać zakres danych do tablicy. Nadszedł czas aby to sprawdzić.
Spróbujmy zatem wczytać do tablicy dane jak z poniższego rysunku:

Pomińmy oczywisty i nieefektywny sposób wczytywania tych danych za pomocą pętli przechodzącej przez każdą z komórek (For... Next czy For each... Next). Sprawdźmy, co się stanie ze zmienną typu Variant jeśli spróbujemy przypisać jej wartości komórek w zakresie:
Sub ZakresDoTablicy() Dim MojaTablica As Variant MojaTablica = ActiveSheet.UsedRange.Value MsgBox UBound(MojaTablica, 1) MsgBox UBound(MojaTablica, 2) End Sub
Kilka słów wyjaśnienia dot. funkcji UBound(NazwaTablicy[, Wymiar]): funkcja ta zwraca największy indeks wymiaru (Wymiar) podanej tablicy(NazwaTablicy). W praktyce oznacza to, że:
Dim Tablica(1 to 10) MsgBox UBound(Tablica)
zwróci nam wartość 10, natomiast:
Dim Tablica(1 to 10, 1 to 5) MsgBox UBound(Tablica, 2)
zwróci nam wartość 5 - czyli maksymalny indeks drugiego wymiaru. Proste. Przydatne. Warto zapamiętać.
Ad rem: nasza konstrukcja próbowała przypisać wartości bieżącego zakresu danych (UsedRange) do zmiennej typu Variant. Funkcje MsgBox zwróciły kolejno liczby 13 i 2 - odpowiednio liczbę wierszy i kolumn naszego zakresu. To oznacza, że przypisanie wartości komórek jakiegoś zakresu do zmiennej typu Variant tworzy z niej dwuwymiarową tablicę. Którą notabene możemy (wyposażeni w wiedzę jak szybko przepisać tablicę do arkusza) błyskawicznie przepisać do arkusza w nowe miejsce. Jeśli w arkuszu Arkusz1 mamy dane źródłowe, które chcemy przepisać do arkusza Arkusz2 to możemy zrobić tak:
Sub ZakresDoTablicy() Dim MojaTablica As Variant Dim Cel As Range MojaTablica = Sheets("Arkusz1").UsedRange.Value Sheets("Arkusz2").Activate Set Cel = Range(Cells(1, 1), Cells(UBound( MojaTablica, 1), UBound(MojaTablica, 2))) Cel.Value = MojaTablica End Sub
W ułamku sekundy mamy nasze dane w arkuszu Arkusz2.
Jest to najszybszy znany mi sposób na operacje z zakresami danych, które mają być kopiowane/przenoszone w inne miejsca. Oczywiście w czasie miedzy pobraniem danych do tablicy, a umieszczeniem ich w nowym miejscu możemy wykonywać różne operacje na [części z] tych danych w tablicy - ale niestety już przy zastosowaniu zwykłych znanych nam pętli.

[...] komentarze Wtorki z VBA cz. 15 – Wczytywanie zakresów do tablicy on Wtorki z VBA cz.14 – Zapisywanie zakresówWtorki z VBA cz. 9 – Wprowadzanie [...]