W tym artykule pokażemy, jak utworzyć zakres dynamiczny w Excel VBA.
Zadeklarowanie określonego zakresu komórek jako zmiennej w Excel VBA ogranicza nas do pracy tylko z tymi konkretnymi komórkami. Deklarując zakresy dynamiczne w programie Excel, zyskujemy znacznie większą elastyczność w zakresie naszego kodu i funkcjonalności, które może on wykonywać.
Zakresy i komórki odniesienia
Kiedy odwołujemy się do obiektu Range lub Cell w programie Excel, zwykle odwołujemy się do nich, umieszczając na stałe w żądanym wierszu i kolumnach.
Zakres nieruchomości
Korzystając z właściwości zakresu, w przykładowych wierszach kodu poniżej, możemy wykonać działania na tym zakresie, takie jak zmiana koloru komórek lub pogrubienie komórek.
12 | Zakres("A1:A5").Kolor czcionki = vbRedZakres("A1:A5").Czcionka.Pogrubienie = Prawda |
Właściwość komórek
Podobnie możemy użyć właściwości Cells, aby odnieść się do zakresu komórek, bezpośrednio odwołując się do wiersza i kolumny we właściwości cell. Wiersz musi być zawsze liczbą, ale kolumna może być liczbą lub literą ujętą w cudzysłów.
Na przykład adres komórki A1 może mieć postać:
1 | Komórki(1,1) |
Lub
1 | Komórki(1, "A") |
Aby użyć właściwości Cells do odwoływania się do zakresu komórek, musimy wskazać początek zakresu i koniec zakresu.
Na przykład do zakresu odniesienia A1: A6 możemy użyć poniższej składni:
1 | Zakres (komórki (1,1), komórki (1,6) |
Następnie możemy użyć właściwości Cells, aby wykonać akcje na zakresie zgodnie z przykładowymi wierszami kodu poniżej:
12 | Range(Cells(2, 2), Cells(6, 2)).Font.Color = vbRedRange(Cells(2, 2), Cells(6, 2)).Font.Bold = True |
Zakresy dynamiczne ze zmiennymi
Ponieważ rozmiar naszych danych zmienia się w Excelu (tzn. używamy więcej wierszy i kolumn niż zakresy, które zakodowaliśmy), dobrze byłoby, gdyby zmieniły się również zakresy, do których odwołujemy się w naszym kodzie. Korzystając z powyższego obiektu Range, możemy tworzyć zmienne do przechowywania maksymalnej liczby wierszy i kolumn w obszarze arkusza programu Excel, którego używamy, i używać tych zmiennych do dynamicznego dostosowywania obiektu Range podczas działania kodu.
Na przykład
1234 | Dim lRow jako liczba całkowitaDim lCol jako liczba całkowitalRow = Zakres("A1048576").End(xlUp).RowlCol = Zakres("XFD1").End(xlToLeft).Column |
Ostatni wiersz w kolumnie
Ponieważ w arkuszu jest 1048576 wierszy, zmienna lRow przejdzie na dół arkusza, a następnie użyje specjalnej kombinacji klawisza End i klawisza strzałki w górę, aby przejść do ostatniego wiersza użytego w arkuszu - to da nam numer rzędu, który potrzebujemy w naszym asortymencie.
Ostatnia kolumna w rzędzie
Podobnie, lCol przejdzie do kolumny XFD, która jest ostatnią kolumną w arkuszu, a następnie użyj specjalnej kombinacji klawisza End i klawisza strzałki w lewo, aby przejść do ostatniej kolumny użytej w arkuszu - to da nam numer kolumny, której potrzebujemy w naszym asortymencie.
Dlatego, aby uzyskać cały zakres, który jest używany w arkuszu, możemy uruchomić następujący kod:
1234567891011 | Sub GetRange()Dim lRow jako liczba całkowitaDim lCol jako liczba całkowitaDim rng As RangelRow = Zakres("A1048576").End(xlUp).Row'użyj lRow, aby znaleźć ostatnią kolumnę w zakresielCol = Zakres("XFD" & lRow).End(xlToLeft).ColumnUstaw rng = Zakres(Komórki(1, 1), Komórki(lRow, lCol))'msgbox, aby pokazać nam zakresMsgBox "Zakres to " i rng.AddressNapis końcowy |
SpecialCells - LastCell
Możemy również użyć metody SpecialCells obiektu Range, aby uzyskać ostatni wiersz i kolumnę użyte w arkuszu.
123456789101112 | Dodatkowe użycieKomórekspecjalnych()Dim lRow jako liczba całkowitaDim lCol jako liczba całkowitaDim rng As RangeDim rngRozpocznij jako zakresUstaw rngBegin = Zakres("A1")lRow = rngBegin.SpecialCells(xlCellTypeLastCell).RowlCol = rngBegin.SpecialCells(xlCellTypeLastCell).KolumnaUstaw rng = Zakres(Komórki(1, 1), Komórki(lRow, lCol))'msgbox, aby pokazać nam zakresMsgBox "Zakres to " i rng.AddressNapis końcowy |
Używany zakres
Metoda używanego zakresu obejmuje wszystkie komórki, które zawierają wartości w bieżącym arkuszu.
123456 | Podrzędny przykład zakresu używanego()Dim rng As RangeUstaw rng = ActiveSheet.UsedRange'msgbox, aby pokazać nam zakresMsgBox "Zakres to " i rng.AddressNapis końcowy |
Bieżący region
Bieżący region różni się od UsedRange tym, że patrzy na komórki otaczające komórkę, którą zadeklarowaliśmy jako zakres początkowy (tzn. zmienną rngBegin w poniższym przykładzie), a następnie przegląda wszystkie komórki, które są „dołączone” lub powiązane do tej zadeklarowanej komórki. Jeśli pojawi się pusta komórka w wierszu lub kolumnie, CurrentRegion przestanie szukać dalszych komórek.
12345678 | Sub bieżący region()Dim rng As RangeDim rngRozpocznij jako zakresUstaw rngBegin = Zakres("A1")Ustaw rng = rngBegin.CurrentRegion'msgbox, aby pokazać nam zakresMsgBox "Zakres to " i rng.AddressNapis końcowy |
Jeśli użyjemy tej metody, musimy upewnić się, że wszystkie komórki w wymaganym zakresie są połączone bez pustych wierszy lub kolumn.
Nazwany zakres
Możemy również odwoływać się do nazwanych zakresów w naszym kodzie. Nazwane zakresy mogą być dynamiczne, o ile po aktualizacji lub wstawieniu danych nazwa zakresu może się zmienić, aby uwzględnić nowe dane.
Ten przykład zmieni czcionkę na pogrubioną dla nazwy zakresu „Styczeń”
12345 | Podzakres NazwaPrzykład()Dim rng jako zakresUstaw rng = Zakres("Styczeń")rng.Font.Pogrubienie = = PrawdaNapis końcowy |
Jak widać na poniższym obrazku, jeśli do nazwy zakresu zostanie dodany wiersz, nazwa zakresu zostanie automatycznie zaktualizowana, aby uwzględnić ten wiersz.
Jeśli następnie ponownie uruchomimy przykładowy kod, zakres, na który ma wpływ kod, będzie C5:C9, podczas gdy w pierwszym przypadku byłby to C5:C8.
Stoły
Możemy odwoływać się do tabel (kliknij, aby uzyskać więcej informacji o tworzeniu i manipulowaniu tabelami w VBA) w naszym kodzie. Gdy dane tabeli w programie Excel zostaną zaktualizowane lub zmienione, kod odnoszący się do tabeli będzie odnosić się do zaktualizowanych danych tabeli. Jest to szczególnie przydatne w przypadku odwoływania się do tabel przestawnych, które są połączone z zewnętrznym źródłem danych.
Używając tej tabeli w naszym kodzie, możemy odwoływać się do kolumn tabeli według nagłówków w każdej kolumnie i wykonywać akcje na kolumnie zgodnie z ich nazwą. Gdy wiersze w tabeli rosną lub maleją zgodnie z danymi, zakres tabeli odpowiednio się dostosuje, a nasz kod będzie nadal działał dla całej kolumny w tabeli.
Na przykład:
123 | Sub UsuńTabelaKolumna()ActiveWorkbook.Worksheets("Arkusz1").ListObjects("Tabela1").ListColumns("Dostawca").DeleteNapis końcowy |