Czy tablica dynamiczna


Funkcja czyTablicaDynamiczna korzysta podczas działania z innych nie-wbudowanych funkcji prezentowanych na tej stronie, które w związku z tym również muszą być umieszczone w kodzie projektu dla prawidłowego działania tej funkcji.

Nie uwzględnienie ich w kodzie spowoduje wygenerowanie błędu: Compile error: Sub or Function not defined.

Dodatkowe funkcje wykorzystywane w funkcji czyTablicaDynamiczna zostały wymienione poniżej. Klikając w nazwę każdej z nich przeniesiesz się do podstrony zawierającej jej kod:

Dodając powyższe funkcje, zwróć uwagę czy nie były one już wcześniej wykorzystywane w Twoim kodzie. Obecność w jednym projekcie VBA dwóch funkcji publicznych o identycznych nazwach spowoduje wygenerowanie błędu kompilacji o treści: Compile error: Ambiguous name detected: nazwa_funkcji.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
'**********************************************************************************************************
' Nazwa:                czyTablicaDynamiczna
' Autor:                mielk | 2012-03-27
'
' Opis:                 Funkcja sprawdza czy podana zmienna jest tablicą dynamiczną, czyli taką, której
'                       rozmiary mogą być zmieniane w trakcie działania makra.
'                       Funkcja działa prawidłowo tylko dla tablic mających maksymalnie trzy wymiary.
'
' Argumenty:
'   arr                 Sprawdzana zmienna.
'
' Zwraca:
'   Boolean             True - jeżeli parametr wejściowy arr jest tablicą dynamiczną, której rozmiary mogą
'                               być zmieniane w trakcie działania programu.
'                       False - jeżeli parametr wejściowy nie jest tablicą lub jest tablicą o stałych
'                               rozmiarach, których nie można modyfikować w trakcie działania makra.
'
'
' Wyjątki:
'   NiedozwolonaLiczbaWymiarow      Wywoływany, jeżeli przekazana do funkcji tablica posiada więcej niż
'                                   trzy wymiary.
'
'
' --- Zmiany ----------------------------------------------------------------------------------------------
' 2012-03-27    mielk       Utworzenie funkcji
'**********************************************************************************************************
Public Function czyTablicaDynamiczna(arr As Variant) As Boolean
    Const NAZWA_METODY As String = "czyTablicaDynamiczna"
    '------------------------------------------------------------------------------------------------------


    'Dalsze operacje wykonywane są tylko dla tablic. Jeżeli zmienna nie jest tablicą,tym bardziej
    'nie będzie ona tablicą dynamiczną.
    If VBA.IsArray(arr) Then

        'Funkcja próbuje nadać podanej tablicy nowy rozmiar (który dzięki wykorzystaniu funkcji
        'LBound i UBound jest de facto identyczny z dotychczasowym rozmiarem tej tablicy). Tablice
        'nie-dynamiczne mają stały rozmiar, którego nie można zmieniać, więc taka próba spowoduje
        'wygenerowanie błędu, a tym samym przeniesienie kodu do miejsca oznaczonego etykietą
        'TablicaStatyczna i wyjście z funkcji z wartością False.
        On Error GoTo TablicaStatyczna

        Select Case liczWymiary(arr)
            Case 0
            'Jeżeli zmienna jest tablicą, ale ma zero wymiarów to bez wątpienia jest tablicą
            'dynamiczną, bo tablice stałe zawsze posiadają co najmniej jeden wymiar.

            Case 1
                If UBound(arr, 1) >= LBound(arr, 1) Then
                    ReDim Preserve arr(LBound(arr, 1) To UBound(arr, 1))
                End If
            Case 2
                ReDim Preserve arr(LBound(arr, 1) To UBound(arr, 1), _
                                   LBound(arr, 2) To UBound(arr, 2))
            Case 3
                ReDim Preserve arr(LBound(arr, 1) To UBound(arr, 1), _
                                   LBound(arr, 2) To UBound(arr, 2), _
                                   LBound(arr, 3) To UBound(arr, 3))
            Case Else
                'Funkcja nie obsługuje tablic posiadających więcej niż trzy wymiary, dlatego w takim
                'przypadku wykonywanie kodu przenoszone jest do etykiety NiedozwolonaLiczbaWymiarow.
                GoTo NiedozwolonaLiczbaWymiarow
        End Select

        'Do tego momentu kod dociera tylko wtedy, jeśli nie został wygenerowany błąd przy próbie
        'zmiany rozmiaru tablicy, a więc w sytuacji gdy zmienna przekazana do funkcji jako argument [arr].
        czyTablicaDynamiczna = True

    End If


'==========================================================================================================
PunktWyjscia:
    Exit Function

'----------------------------------------------------------------------------------------------------------
TablicaStatyczna:
    czyTablicaDynamiczna = False
    GoTo PunktWyjscia

'----------------------------------------------------------------------------------------------------------
NiedozwolonaLiczbaWymiarow:
    '(...)
    'Obsługa błędów dla sytuacji, kiedy przekazana do funkcji tablica ma za dużo wymiarów.

    GoTo PunktWyjscia

End Function