TOP

VBA-Lekcja 13.2. Używanie tablic (Arrays) (ciąg dalszy)


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

Tablica dynamiczna

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)

Uwiązany

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

Zapisywanie danych w szeregu elementów tablicy

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).

Tablica (Array)

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

Konwertuj tekst na tablicę (VBA Split)

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