Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

ReDim

Termin Definicja
ReDim

ReDim to instrukcja VBA zmieniająca rozmiar wcześniej zadeklarowanej tablicy dynamicznej.

ReDim w VBA: czym jest zmiana rozmiaru tablicy

ReDim to instrukcja języka VBA służąca do zmiany rozmiaru tablicy dynamicznej, czyli takiej tablicy, której liczba elementów nie została ustalona na stałe w chwili deklaracji. Dzięki temu rozmiar struktury może zostać dopasowany do rzeczywistej liczby danych pojawiających się podczas wykonywania procedury. Takie rozwiązanie bywa przydatne przy imporcie rekordów, przetwarzaniu wyników zapytań, odczytywaniu zawartości plików oraz budowaniu list zależnych od danych wprowadzonych przez użytkownika.

Najczęściej tablicę deklaruje się bez określania jej końcowego indeksu, na przykład za pomocą polecenia Dim wyniki() As String. W tym momencie tablica istnieje jako zmienna, ale nie ma jeszcze przydzielonego zakresu elementów, do którego można zapisywać dane. Dopiero zastosowanie instrukcji ReDim wyniki(1 To 10) nadaje jej konkretny rozmiar. W przedstawionym przykładzie utworzono dziesięć pozycji indeksowanych od 1 do 10.

Rozmiar tablicy może zostać wyznaczony na podstawie zmiennej, dlatego często spotyka się konstrukcję ReDim dane(1 To liczbaWierszy). Wymaga się wtedy, aby zmienna określająca zakres zawierała poprawną wartość całkowitą. Należy także pamiętać, że instrukcja ReDim nie zastępuje deklaracji zmiennej. Najpierw tablica musi zostać zadeklarowana jako dynamiczna, a następnie może być wymiarowana lub ponownie wymiarowana w odpowiednim miejscu procedury.

ReDim Preserve a zwykłe ReDim: kontekst techniczny i porównania

Zwykłe użycie ReDim powoduje utworzenie tablicy o nowym zakresie i może usunąć wartości, które znajdowały się w poprzednim rozmiarze. Przykładowo po wykonaniu ReDim liczby(1 To 5), zapisaniu danych, a następnie zastosowaniu ReDim liczby(1 To 20), wcześniejsza zawartość nie powinna być traktowana jako zachowana. Jest to istotna różnica w porównaniu z rozszerzaniem gotowej kolekcji, w której dodanie elementu zwykle nie wymaga ponownego określania całej struktury.

Jeżeli dane mają pozostać dostępne, stosuje się wariant ReDim Preserve. Przykład ReDim Preserve liczby(1 To 20) zwiększa zakres i kopiuje istniejące wartości do nowej tablicy. Zachowane zostają elementy mieszczące się zarówno w poprzednim, jak i w nowym zakresie. Wartość indeksu początkowego również ma znaczenie, dlatego przy zmianie granic powinno się zachować spójność całej konstrukcji.

W VBA operacja Preserve ma ograniczenie dotyczące wymiarów. W praktyce bezpiecznie przyjmuje się, że przy ponownym wymiarowaniu tablicy wielowymiarowej zmieniany powinien być ostatni wymiar. Dla tablicy zapisanej jako Dim macierz() As Double konstrukcja ReDim Preserve macierz(1 To 4, 1 To nowaLiczbaKolumn) może być użyteczna przy rozszerzaniu liczby kolumn. Próba zmiany wcześniejszego wymiaru może zakończyć się błędem wykonania.

Wybór między ReDim i ReDim Preserve zależy od celu operacji. Gdy zawartość tablicy nie jest już potrzebna, zwykłe ReDim bywa prostsze i może ograniczyć ilość kopiowanych danych. Gdy wcześniejsze wyniki mają zostać zachowane, niezbędne jest Preserve albo zastosowanie innej struktury, takiej jak kolekcja lub obiekt słownikowy. Przy dużych zbiorach danych różnica wydajnościowa może być zauważalna, ponieważ Preserve często tworzy nowy obszar pamięci i przenosi do niego dotychczasowe elementy.

ReDim w procedurach VBA: typowe problemy i błędy

Jednym z częstych problemów jest próba użycia ReDim wobec tablicy zadeklarowanej ze stałym rozmiarem. Kod Dim elementy(1 To 10) As String tworzy tablicę statyczną, której zakres nie powinien być później zmieniany za pomocą ReDim. Do ponownego wymiarowania należy użyć deklaracji bez granic, na przykład Dim elementy() As String.

Inny błąd polega na odwołaniu do elementu przed nadaniem tablicy rozmiaru. Sama deklaracja tablicy dynamicznej nie tworzy jeszcze pozycji dostępnych do zapisu. Przed instrukcją elementy(indeks) = wartosc powinno się wykonać odpowiednie ReDim lub sprawdzić, czy tablica została już przygotowana. Przydatne może być także testowanie stanu tablicy przez obsługę błędów albo przez przechowywanie osobnej zmiennej informującej o jej zainicjalizowaniu.

Problemy powoduje również wielokrotne zwiększanie tablicy o jeden element w pętli. Konstrukcja ReDim Preserve dane(1 To i) wykonywana przy każdym obrocie pętli może powodować ciągłe kopiowanie zawartości. Przy niewielkiej liczbie rekordów nie musi to mieć znaczenia, lecz przy większym zbiorze obliczenia stają się mniej efektywne. Częściej stosuje się powiększanie zakresu większymi porcjami, wcześniejsze ustalenie liczby elementów albo zebranie danych w kolekcji i późniejsze przepisanie ich do tablicy.

Warto zwrócić uwagę na granice indeksów. VBA może pracować z tablicami zaczynającymi się od zera lub od jedynki, zależnie od użytej składni i ustawień projektu. Zapis ReDim dane(10) zwykle oznacza indeksy od 0 do 10, czyli jedenaście elementów, a nie dziesięć. Jednoznaczniejsze jest określenie obu granic, na przykład ReDim dane(1 To 10). Takie zapisanie zakresu ogranicza ryzyko pomyłek przy obliczaniu liczby pozycji.

ReDim i tablice dynamiczne: praktyczne wskazówki projektowe

Przed zmianą rozmiaru tablicy powinno się ustalić, czy potrzebne jest zachowanie zawartości. Jeżeli tablica ma zostać wyczyszczona i zbudowana od początku, zwykłe ReDim jasno komunikuje ten zamiar. Jeżeli kolejne dane mają być dopisywane, należy zastosować ReDim Preserve albo rozważyć kolekcję. Rozdzielenie tych dwóch scenariuszy ułatwia późniejsze utrzymanie kodu i ogranicza ryzyko niezamierzonego usunięcia wyników.

Dobrym rozwiązaniem jest przechowywanie aktualnej liczby elementów w osobnej zmiennej. Po dodaniu nowej wartości zwiększa się licznik, a dopiero potem sprawdza, czy zakres tablicy jest wystarczający. W większych procedurach można przeznaczać zapas miejsca i powiększać tablicę dopiero po jego wykorzystaniu. Ogranicza to liczbę operacji kopiowania oraz upraszcza analizę działania pętli.

Przykładowy schemat może wyglądać następująco:

  • zadeklarowanie tablicy dynamicznej bez podawania granic;
  • ustalenie liczby danych na podstawie arkusza, pliku albo wyniku obliczeń;
  • jednorazowe wykonanie ReDim z zakresem odpowiadającym liczbie elementów;
  • zapisanie wartości z zachowaniem zgodności indeksów;
  • sprawdzenie, czy liczba rekordów nie jest równa zero i czy zakres nie przyjmuje błędnej wartości.

Przy pracy z arkuszami szczególnej uwagi wymaga różnica między liczbą wierszy a numerem ostatniego wiersza. Jeżeli dane zaczynają się od drugiego wiersza, liczba rekordów może być mniejsza od numeru ostatniego wiersza. Należy więc obliczyć rzeczywistą liczbę elementów i dopiero na jej podstawie wykonać ReDim. Podobnie przy odczycie pliku tekstowego należy rozstrzygnąć, czy pusta końcowa linia ma być traktowana jako rekord.

Warto stosować typy danych odpowiadające zawartości tablicy. Tablica tekstowa powinna być deklarowana jako String, wartości całkowite jako Long, a liczby wymagające części ułamkowej jako Double. Samo ReDim zmienia zakres, ale nie naprawia pomyłki w typie zmiennej. Kontrola wartości wejściowych, obsługa pustych danych i jednoznaczne nazwy zmiennych pozostają równie ważne jak poprawne wymiarowanie.

ReDim a serwis komputerowy: kiedy zgłosić się po pomoc

Problemy z ReDim zwykle ujawniają się jako błędy wykonania, utrata wcześniej zebranych wartości, nieprawidłowa liczba elementów albo zatrzymanie makra podczas pracy z arkuszem. W pierwszej kolejności warto sprawdzić, czy tablica została zadeklarowana dynamicznie, czy instrukcja Preserve jest używana świadomie oraz czy granice indeksów odpowiadają liczbie przetwarzanych danych. Pomocne bywa także uruchomienie kodu krok po kroku i obserwowanie wartości zmiennej określającej rozmiar.

Jeżeli awarie makr występują razem z zawieszaniem programu, samoczynnym wyłączaniem komputera, problemami z odczytem plików lub niestabilnością systemu, przyczyna może wykraczać poza sam kod VBA. W takiej sytuacji zgłoszenie do Warszawskiego Pogotowia Komputerowego 24/7 pozwala połączyć sprawdzenie środowiska pracy z analizą objawów występujących podczas uruchamiania procedur. Przed przekazaniem urządzenia warto przygotować opis błędu, nazwę używanego programu oraz informację, po której operacji pojawia się problem.

Przy pracy z ważnymi skoroszytami zaleca się wykonanie kopii pliku przed testami, zapisanie wersji makra i unikanie eksperymentów na jedynym egzemplarzu danych. Takie przygotowanie ułatwia odtworzenie sytuacji, w której występuje błąd ReDim, a także pozwala bezpieczniej porównać działanie kodu przed i po wprowadzeniu zmian.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę