Feb 01 2010

Wtorki z VBA cz. 15 – Wczytywanie zakresów do tablicy

Posted by Marcin

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:

Przykładowe dane
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.

Powiązane artykuły:

Filed under : Kurs VBA, Wszystkie | 1 Comment »

One Response to “Wtorki z VBA cz. 15 – Wczytywanie zakresów do tablicy”

  1. [...] 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 [...]

Leave a Reply