Tablice Array, podobnie zresztą jak wszystkie zmienne, w momencie ich deklaracji uzyskują wartość domyślną dla danego typu. I tak np. poniższe tablice przyjmą następujące wartości początkowe:
a. liczby całkowite, wartość początkowa równa 0 (zero)
2 | Debug.Print intTBL(0), TypeName(intTBL) |
b. ciągi tekstowe, wartość początkowa- pusty ciąg tekstowy
1 | Dim strTBL(10) As String |
2 | Debug.Print strTBL(0), TypeName(strTBL) |
c. tablica wariant, wartość początkowa- pusta (Empty)
2 | Debug.Print varTBL(0); TypeName(varTBL) |
Co należałoby zrobić aby utworzyć tablicę, której elementy zostaną zainicjowane z inną niż domyślna (zerowa) wartość przyjmując jednocześnie założenie, że nie chcemy w tym celu korzystać z pętli? Poniżej kilka z możliwych rozwiązań.
1. Funkcja API FillMemory dla tablic typu Byte
Jeżeli naszą tablicę chcemy wypełnić wartościami z przedziału - do 255 możemy posłużyć się następującym rozwiązaniem opartym o funkcję API:
02 | Private Declare Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" _ |
03 | (dest As Any, ByVal size As Long , ByVal fill As Byte ) |
07 | FillMemory byTBL(0), 11, 10 |
10 | Dim loTBL(1, 10) As Byte |
11 | FillMemory loTBL(0, 0), 2 * 11, 200 |
12 | Debug.Print loTBL(1, 1) |
Składnia funkcji FillMemory:
FillMemory Destination, Length, Fill
gdzie:
Destination to punkt startowy w pamięci deklarowany jako dolny indeks (indeksy) naszej tablicy,
Length to ilość elementów tablicy
Fill to wartość jaką będziemy wypełniać tablicę
2. Evaluate i funkcja arkuszowa
Dla każdego innego rozwiązania możemy posłużyć się poniższą kombinacją funkcji Evaluate, funkcji arkuszowych i deklaracji tablicowych. Poszczególne kroki tej metody zostały opisane w postaci komentarzy w poniższym kodzie.
Uwaga! Rozwiązanie to tworzy tablice z dolnym indeksem równym 1 (a nie 0, co jest wartością domyślną)
02 | Dim sngTBL() As Variant |
04 | relacji do komórek A1:A10. |
06 | sngTBL = Evaluate( "=IF(ISERROR(Transpose(A1:a10)), 99.99, 99.99)" ) |
08 | Debug.Print sngTBL(1), sngTBL(10) |
12 | Dim strTBL() As Variant |
14 | relacji do komórek A1:C10. |
16 | strTBL = Evaluate( "=IF(ISERROR(A1:C100), " "test" ", " "test" ")" ) |
18 | Debug.Print strTBL(1, 1), strTBL(10, 3) |
3. Kombinacja funkcji arkuszowej i funkcji VBA
W wariancie tym tworzymy tymczasowy ciąg tekstowy składający się z zadanej ilości powtórzeń. Następnie konwertujemy ten ciąg na tablice z wykorzystaniem funkcji Split.
2 | tmpVal = WorksheetFunction.Rept( "99.99," , 100) |
3 | tmpVal = Left(tmpVal, Len(tmpVal) - 1) |
6 | tmpArr = Split(tmpVal, "," ) |
8 | Debug.Print tmpArr(1), tmpArr(10) |
Uwaga końcowa! Po powyższe rozwiązania warto sięgać w sytuacji, kiedy ilość elementów w tablicy przekracza około 10 tyś. W przeciwnym wypadku wystarczy posłużyć się zwykłą pętlą co, choć nie jest efektowne, będzie rozwiązaniem efektywnym.
Brak komentarzy:
Prześlij komentarz