Aby przechowywać więcej niż jedną kolumnę danych, potrzebujemy innego wymiaru tablicy. Przykład:
Zapisywanie danych w tablicy dwuwymiarowej:
'Deklaracja Dim array_example(10, 2) '„Zdefiniowana” tablica 11 x 3 'Zapisywanie danych w tablicy For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
Oto kilka przykładów pracy z tymi wartościami:
MsgBox array_example(0, 0) '=> zwroty: 03.11.2026 MsgBox array_example(0, 1) '=> zwraca: 24 MsgBox array_example(9, 2) '=> zwraca: NO MsgBox array_example(10, 2) '=> zwraca: YES
Wyobraźmy sobie na chwilę, że musimy na bieżąco aktualizować dane w naszej tablicy i dlatego nie możemy przypisywać stałych wartości w momencie deklaracji...
Aby poznać numer wiersza ostatniej niepustej komórki, czyli inaczej ostatniego wiersza naszej bazy danych, skorzystamy ze wzoru:
last_row = Range("A1").End(xlDown).Row
Excel nie akceptuje zmiennych w deklaracji.
Zamiast tego zadeklaruj tablicę dynamiczną (używając pustych nawiasów), a następnie zdefiniuj jej rozmiar za pomocą Redim:
Dim array_example() ReDim array_example(last_row - 2, 2)
Korzystając z poniższej procedury, możesz przechowywać wszystkie wiersze swojego zbioru danych (tabeli) w naszej tablicy:
Dim array_example() ReDim array_example(last_row - 2, 2)
W poprzednim przykładzie ostatnią liczbą w naszej tablicy był last_row - 2:
For i = 0 To last_row - 2
Innym sposobem określenia ostatniej liczby w naszej tablicy może być użycie Ubound:
For i = 0 To UBound(array_example)
Ta funkcja zwraca największą liczbę w tablicy dla wybranego wymiaru (domyślnie jest to pierwszy wymiar).
Oto kilka przykładów, które sprawią, że będzie to bardziej jasne:
Sub example() Dim array_example(10, 2) MsgBox UBound(array_example) '=> zwraca: 10 MsgBox UBound(array_example, 1) '=> zwraca: 10 MsgBox UBound(array_example, 2) '=> zwraca: 2 End Sub
Możliwe jest wypełnienie tablicy wartościami z zakresu komórek arkusza kalkulacyjnego nawet bez użycia pętli:
'Deklaracja Dim array_example(10, 2) '„Zdefiniowana” tablica 11 x 3 'Zapisywanie danych w tablicy For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
Powyższy kod można skutecznie zastąpić następującym:
'Deklaracja Dim array_example() 'Zapisywanie danych w tablicy array_example = Range("A2:C12").Value
Chociaż druga metoda wydaje się atrakcyjniejsza niż pierwsza, pamiętaj, że w większości przypadków jej wdrożenie może kosztować więcej czasu niż pierwsza.
Jeśli przechowujesz dane w tablicy w ten sposób, pierwszą liczbą będzie 1 zamiast 0, co może powodować zamieszanie...
Jeśli w dalszej części procesu zwiększania kodu zdecydujesz się przechowywać w tablicy tylko dane spełniające określone kryteria wyszukiwania (lub wykonasz zupełnie inną operację), będziesz musiał całkowicie przepisać kod, używając innej funkcji pętli...
Ale ta druga metoda jest całkiem przydatna, jeśli chcesz zapisać całą zawartość dużego zestawu danych, ponieważ jest szybsza niż pętla (oszczędność około 0,2 sekundy na każde 15 000 rekordów).
Ale jeśli chcesz utworzyć tablicę o „stałej” zawartości.
Jednym z rozwiązań może być nagrywanie wartości taśma po taśmie:
Dim en(5) en(0) = "IF" en(1) = "VLOOKUP" en(2) = "SUM" en(3) = "COUNT" en(4) = "ISNUMBER" en(5) = "MID"
Na szczęście można uprościć ten kod za pomocą tablicy (Array):
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
Oto demonstracja użycia funkcji Replace (pomoże Ci to zrozumieć następujący przykład):
Sub replace_example() Dim var_translate As String 'Wstążka tekstowa dla tego przykładu var_translate = "Hello World !" 'Zastąp „Świat” słowem „Ty” na wstążce tekstowej var_translate = Replace(var_translate, "World", "you") 'Taśma po wymianie MsgBox var_translate '=> zwraca „Witam!” End Sub
Teraz, jeśli chcemy zastąpić ciąg wartości innym zbiorem danych, niezwykle przydatne będzie wykorzystanie tablic i funkcji Array:
Sub translate() 'Uproszczony przykład tłumaczenia formuł z języka angielskiego na francuski Dim var_translate As String 'Wstążka tekstowa dla tego przykładu var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))" 'Dwa zestawy wartości en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID") fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT") 'Zamień „SI” na „IF”, „RECHERVEV” na „WYSZUKAJ.PIONOWO” itp. For i = 0 To UBound(en) var_translate = Replace(var_translate, en(i), fr(i)) Next 'Taśma po wymianie MsgBox var_translate '=> zwraca „Formula do tłumaczenia: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))” End Sub
Funkcja Split pozwala nam podzielić ciąg znaków na części i zapisać powstałe wartości w tablicy.
Aby przekonwertować wstążkę na tablicę, wykonaj następujące czynności:
variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"
Użyj funkcji VBA Split i określ separator:
en = Split(variable, "/")
Tablica „en” zwróci następujące wartości:
MsgBox en(0) '=> zwraca: IF MsgBox en(1) '=> zwraca: WYSZUKAJ.PIONOWO MsgBox en(2) '=> zwraca: SUMA MsgBox en(3) '=> zwraca: LICZBA MsgBox en(4) '=> zwraca: ISNUMBER MsgBox en(5) '=> zwraca : MID
Poniższe 3 tablice również zwrócą te same wartości:
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID") en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",") en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")
Poniższy przykład zwraca trzecią wartość w ciągu:
MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> zwraca: SUMA
Odwrotnością Split jest funkcja VBA Join.
Ta funkcja zbiera wartości tablicy w ciąg znaków.
MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> zwraca: 12345