'********************************************************************************************************** ' 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 '********************************************************************************************************** ' Nazwa: liczWymiary ' Autor: mielk | 2012-03-03 ' ' Opis: Funkcja zwraca liczbę wymiarów podanej tablicy VBA. ' ' Argumenty: ' tablica Tablica, której liczba wymiarów ma zostać zwrócona. ' ' Zwraca: ' Integer Liczba wymiarów podanej tablicy VBA. ' Jeżeli podana wartość nie jest tablicą lub jest zadeklarowana jako tablica ' dynamiczna, ale nie przypisano jeszcze do niej liczby wymiarów, zwracana ' jest wartość 0. ' ' ' --- Zmiany ---------------------------------------------------------------------------------------------- ' 2012-03-03 mielk Utworzenie funkcji ' 2014-06-15 mielk Zwracany typ zmieniony na Integer, żeby umożliwić zwracanie wartości -1, ' jeżeli podany parametr nie jest w ogóle tablicą. '********************************************************************************************************** Public Function liczWymiary(tablica As Variant) As Integer Const NAZWA_METODY As String = "liczWymiary" '------------------------------------------------------------------------------------------------------ Dim granica As Long '------------------------------------------------------------------------------------------------------ If VBA.IsArray(tablica) Then On Error GoTo NieistniejacyWymiar Do granica = UBound(tablica, liczWymiary + 1) liczWymiary = liczWymiary + 1 Loop Else liczWymiary = -1 End If '---------------------------------------------------------------------------------------------------------- NieistniejacyWymiar: End Function