Zakresy i komórki w VBA
Arkusze kalkulacyjne Excel przechowują dane w komórkach. Komórki są ułożone w wiersze i kolumny. Każdą komórkę można zidentyfikować na podstawie punktu przecięcia jej wiersza i kolumny (np. B3 lub R3C2).
Zakres Excela odnosi się do jednej lub więcej komórek (np. A3:B4)
Adres komórki
Notacja A1
W notacji A1 komórka jest określana literą kolumny (od A do XFD), po której następuje numer wiersza (od 1 do 1 048 576).
W VBA możesz odwołać się do dowolnej komórki za pomocą Obiekt zakresu.
123456789 | 'Odwołaj się do komórki B4 w aktualnie aktywnym arkuszuZakres MsgBox("B4")' Odwołaj się do komórki B4 w arkuszu o nazwie 'Dane'Arkusze MsgBox("Dane").Range("B4")' Odwołaj się do komórki B4 w arkuszu o nazwie 'Dane' w innym skoroszycie OPENo nazwie „Moje dane”MsgBox Workbooks("Moje dane").Worksheets("Dane").Range("B4") |
Notacja R1C1
W notacji R1C1 komórka jest oznaczona literą R, po której następuje numer wiersza, a następnie litera „C”, a następnie numer kolumny. np. B4 w notacji R1C1 będzie odnosić się do R4C2. W VBA używasz Obiekt komórek używać notacji R1C1:
12 | ' Odnieś się do komórki R[6]C[4] tj. D6Komórki (6, 4) = "D6" |
Zakres komórek
Notacja A1
Aby odwołać się do więcej niż jednej komórki, użyj „:” między początkowym adresem komórki a adresem ostatniej komórki. Poniższe będą dotyczyć wszystkich komórek od A1 do D10:
1 | Zakres("A1:D10") |
Notacja R1C1
Aby odwołać się do więcej niż jednej komórki, użyj „,” między początkowym adresem komórki a adresem ostatniej komórki. Poniższe będą dotyczyć wszystkich komórek od A1 do D10:
1 | Zakres (komórki (1, 1), komórki (10, 4)) |
Pisanie do komórek
Aby zapisać wartości w komórce lub ciągłej grupie komórek, po prostu odwołaj się do zakresu, umieść znak =, a następnie wpisz wartość, która ma być przechowywana:
12345678910 | 'Przechowuj F5 w komórce z adresem F6Zakres("F6") = "F6"' Przechowuj E6 w komórce z adresem R[6]C[5], czyli E6Komórki(6, 5) = "E6""Przechowuj A1: D10 w zakresie A1: D10"Zakres("A1:D10") = "A1:D10"' lubZakres(Komórki(1, 1), Komórki(10, 4)) = "A1:D10" |
Czytanie z komórek
Aby odczytać wartości z komórek, po prostu odwołaj się do zmiennej, aby przechowywać wartości, umieść znak =, a następnie odnieś się do zakresu do odczytania:
1234567891011 | Wart ściemniania1Wartość ściemniania2' Odczytaj z komórki F6wart1 = Zakres("F6")'Odczytaj z komórki E6wart2 = komórki(6, 5)MsgBox wart1Msgbox Val2 |
Uwaga: Aby przechowywać wartości z zakresu komórek, musisz użyć tablicy zamiast prostej zmiennej.
Komórki nieciągłe
Aby odwołać się do nieciągłych komórek, użyj przecinka między adresami komórek:
123456 | ' Przechowuj 10 w komórkach A1, A3 i A5Zakres("A1,A3,A5") = 10' Przechowuj 10 w komórkach A1:A3 i D1:D3)Zakres("A1:A3, D1:D3") = 10 |
Przecięcie komórek
Aby odwołać się do nieciągłych komórek, użyj spacji między adresami komórek:
123 | ' Przechowuj 'Col D' w D1:D10' co jest wspólne dla A1:D10 i D1:F10Zakres("A1:D10 D1:G10") = "Kol D" |
Odsunięcie od komórki lub zakresu
Korzystając z funkcji Offset, możesz przenieść odwołanie z danego Zakresu (komórki lub grupy komórek) o określoną liczbę_wierszy i liczbę_kolumn.
Składnia przesunięcia
Zakres.Przesunięcie(liczba_wierszy, liczba_kolumn)
Przesunięcie od komórki
12345678910111213141516 | ' PRZESUNIĘCIE z komórki A1'Odnieś się do samej komórki' Przenieś 0 wierszy i 0 kolumnZakres("A1").Przesunięcie(0,0) = "A1"' Przenieś 1 wiersze i 0 kolumnZakres("A1").Przesunięcie(1,0) = "A2"' Przenieś 0 wierszy i 1 kolumnZakres("A1").Przesunięcie(0, 1) = "B1"' Przenieś 1 wiersz i 1 kolumnęZakres("A1").Przesunięcie(1, 1) = "B2"' Przenieś 10 wierszy i 5 kolumnZakres("A1").Przesunięcie(10, 5) = "F11" |
Odsunięcie od zakresu
123 | ' Przenieś odniesienie do zakresu A1:D4 o 4 wiersze i 4 kolumny'Nowe odniesienie to E5:H8Zakres("A1:D4").Przesunięcie(4,4) = "E5:H8" |
Ustawianie odniesienia do zakresu
Aby przypisać zakres do zmiennej zakresu: zadeklaruj zmienną typu Range, a następnie użyj polecenia Set, aby ustawić ją na zakres. Pamiętaj, że musisz użyć polecenia SET, ponieważ RANGE jest obiektem:
12345678 | ' Zadeklaruj zmienną zakresuPrzyciemnij mój zakres jako zakres' Ustaw zmienną na zakres A1:D4Ustaw mójZakres = Zakres("A1:D4")' Drukuje $A$1:$D$4MsgBox mójZakres.Adres |
Zmień rozmiar zakresu
Metoda zmiany rozmiaru obiektu Range zmienia wymiar zakresu odniesienia:
1234567 | Przyciemnij mój zakres jako zakres'Zakres do zmiany rozmiaruUstaw mójZakres = Zakres("A1:F4")' Drukuje $A$1:$E$10Debug.Print myRange.Resize(10, 5).Adres |
Lewa górna komórka zakresu zmienionego rozmiaru jest taka sama jak lewa górna komórka oryginalnego zakresu
Zmień rozmiar składni
Range.Resize(liczba_wierszy, liczba_kolumn)
PRZESUNIĘCIE a zmiana rozmiaru
Przesunięcie nie zmienia wymiarów zakresu, ale przesuwa go o określoną liczbę wierszy i kolumn. Zmiana rozmiaru nie zmienia pozycji oryginalnego zakresu, ale zmienia wymiary na określoną liczbę wierszy i kolumn.
Wszystkie komórki w arkuszu
Obiekt Cells odnosi się do wszystkich komórek w arkuszu (1048576 wierszy i 16384 kolumn).
12 | ' Wyczyść wszystkie komórki w arkuszach roboczychKomórki.Wyczyść |
Używany zakres
Właściwość UsedRange podaje prostokątny zakres od lewej górnej używanej komórki do prawej dolnej używanej komórki aktywnego arkusza.
1234567 | Dim ws As WorksheetUstaw ws = Aktywny arkusz' $B$2:$L$14, jeśli L2 jest pierwszą komórką z dowolną wartością' i L14 to ostatnia komórka z dowolną wartością na' aktywny arkuszDebug.Print ws.UsedRange.Address |
Bieżący region
Właściwość CurrentRegion zapewnia ciągły prostokątny zakres od lewej górnej komórki do prawej dolnej używanej komórki zawierającej komórkę/zakres, do którego istnieje odwołanie.
1234567891011 | Przyciemnij mój zakres jako zakresUstaw mójZakres = Zakres("D4:F6")'Wydruki $B$2:$L$14' Jeśli jest wypełniona ścieżka z D4:F16 do B2 I L14Debug.Print myRange.CurrentRegion.Address' Możesz również odwołać się do pojedynczej komórki początkowejUstaw mójZakres = Zakres("D4") ' Drukuje $B$2:$L$14 |
Właściwości zakresu
Możesz uzyskać adres, numer wiersza / kolumny komórki i liczbę wierszy / kolumn w zakresie, jak podano poniżej:
123456789101112131415161718192021 | Przyciemnij mój zakres jako zakresUstaw mójZakres = Zakres("A1:F10")' Drukuje $A$1:$F$10Debug.Drukuj mójZakres.AdresUstaw mójZakres = Zakres("F10")' Drukuje 10 dla rzędu 10Debug.Print myRange.Row' Drukuje 6 dla kolumny FDebug.Print myRange.ColumnUstaw mójZakres = Zakres("E1:F5")'Wypisuje 5 dla liczby wierszy w zakresieDebug.Print myRange.Rows.Count'Wypisuje 2 dla liczby kolumn w zakresieDebug.Print myRange.Columns.Count |
Ostatnia komórka w arkuszu
Możesz użyć Liczba wierszy oraz Kolumny.Liczba właściwości z Komórki obiekt, aby uzyskać ostatnią komórkę w arkuszu:
1234567891011 | ' Wydrukuj numer ostatniego wiersza'Wydruki 1048576Debug.Print "Wiersze w arkuszu: " & Rows.Count' Wydrukuj ostatni numer kolumny„Odbitki 16384”Debug.Print "Kolumny w arkuszu: " & Columns.Count' Wydrukuj adres ostatniej komórki' Wydruki $XFD$1048576Debug.Print "Adres ostatniej komórki w arkuszu: " & Cells(Rows.Count, Columns.Count) |
Ostatni używany numer wiersza w kolumnie
Właściwość END przenosi nas do ostatniej komórki w zakresie, a End(xlUp) przenosi do pierwszej użytej komórki z tej komórki.
123 | Dim lastRow As LonglastRow = Cells(Rows.Count, "A").End(xlUp).Row |
Numer ostatniej używanej kolumny w rzędzie
123 | Dim lastCol As LonglastCol = Cells(1, Columns.Count).End(xlToLeft).Column |
Właściwość END przenosi nas do ostatniej komórki w zakresie, a End(xlToLeft) przenosi nas do pierwszej użytej komórki z tej komórki.
Możesz również użyć właściwości xlDown i xlToRight, aby przejść do pierwszej używanej dolnej lub prawej komórki bieżącej komórki.
Właściwości komórki
Wspólne właściwości
Oto kod do wyświetlania powszechnie używanych właściwości komórki
12345678910111213141516171819202122 | Przyciemnij komórkę jako zakresUstaw komórkę = Zakres("A1")komórka.AktywujDebug.Drukuj komórkę.Adres' Drukuj $A$1Debug.Print cell.Value'Odbitki 456' AdresDebug.Drukuj komórkę.Formuła' Drukuje = SUMA(C2:C3)' KomentarzDebug.Drukuj komórkę.Komentarz.Tekst„Styl”Debug.Print cell.Style' Format komórkiDebug.Print cell.DisplayFormat.NumberFormat |
Czcionka komórki
Obiekt Cell.Font zawiera właściwości czcionki komórki:
1234567891011121314151617181920 | Przyciemnij komórkę jako zakresUstaw komórkę = Zakres("A1")' Regularna, kursywa, pogrubiona i pogrubiona kursywacell.Font.FontStyle = "Pogrubiona kursywa"' Taki sam jakcell.Font.Pogrubienie = Prawdacell.Font.Italic = Prawda' Ustaw czcionkę na Couriercell.Font.FontStyle = "Kurier"' Ustaw kolor czcionkikomórka.Czcionka.Kolor = vbBlue' lubkomórka.Czcionka.Kolor = RGB(255, 0, 0)' Ustaw rozmiar czcionkikomórka.Czcionka.Rozmiar = 20 |
Kopiuj i wklej
Wklej wszystko
Zakresy/komórki można kopiować i wklejać z jednej lokalizacji do drugiej. Poniższy kod kopiuje wszystkie właściwości zakresu źródłowego do zakresu docelowego (odpowiednik CTRL-C i CTRL-V)
1234567 | „Prosta kopia”Zakres ("A1:D20").KopiujArkusze("Arkusz2").Zakres("B10").Wklej'lub' Kopiuj z bieżącego arkusza do arkusza o nazwie 'Arkusz2'Range("A1:D20").Miejsce docelowe kopiowania:=Worksheets("Arkusz2").Range("B10") |
Wklej specjalnie
Wybrane właściwości zakresu źródłowego można skopiować do miejsca docelowego za pomocą opcji WKLEJ SPECJALNE:
123 | ' Wklej zakres tylko jako wartościZakres ("A1:D20").KopiujArkusze("Arkusz2").Range("B10").PasteSpecial Paste:=xlPasteValues |
Oto możliwe opcje opcji Wklej:
12345678910111213 | ' Wklej typy specjalnexlWklej wszystkoxlWklej wszystkie z wyjątkiem obramowańxlWklej wszystkie scalające formaty warunkowexlPasteAllUsingSource ThemexlPasteColumnSzerokościxlWklejKomentarzexlPasteFormatyxlPasteFormułyxlPasteFormulasAndNumberFormatsxlWklejWalidacjaxlWklejWartościxlPasteValuesAndNumberFormats |
Zawartość autodopasowania
Rozmiar wierszy i kolumn można zmienić, aby dopasować zawartość za pomocą poniższego kodu:
12345 | ' Zmień rozmiar wierszy od 1 do 5, aby dopasować zawartośćWiersze("1:5").Autodopasowanie' Zmień rozmiar kolumn od A do B, aby dopasować zawartośćKolumny("A:B").AutoFit |
Więcej przykładów zakresu
Zaleca się korzystanie z Rejestratora makr podczas wykonywania wymaganej czynności za pośrednictwem GUI. Pomoże Ci zrozumieć różne dostępne opcje i jak z nich korzystać.
Dla każdego
Łatwiej jest przejść przez zakres za pomocą Dla każdego skonstruuj jak pokazano poniżej:
123 | Dla każdej komórki w zakresie ("A1:B100")'Zrób coś z komórkąNastępna komórka |
W każdej iteracji pętli jedna komórka z zakresu jest przypisywana do zmiennej c, a instrukcje w pętli For są wykonywane dla tej komórki. Pętla kończy się, gdy wszystkie komórki są przetwarzane.
Sortować
Sort to metoda obiektu Range. Zakres można posortować, określając opcje sortowania do Range.Sort. Poniższy kod posortuje kolumny A: C na podstawie klucza w komórce C2. Sort Order może być xlAscending lub xlDescending. Header:= xlYes należy stosować, jeśli pierwszy wiersz jest wierszem nagłówka.
12 | Kolumny("A:C").Sort key1:=Range("C2"), _order1:=xlRosnąco, Nagłówek:=xlYes |
Odnaleźć
Find jest również metodą Range Object. Znajduje pierwszą komórkę mającą zawartość pasującą do kryteriów wyszukiwania i zwraca komórkę jako obiekt Range. Wraca Nic jeśli nie ma dopasowania.
Posługiwać się Znajdź następny metoda (lub FindPrevious), aby znaleźć następne (poprzednie) wystąpienie.
Poniższy kod zmieni czcionkę na „Arial Black” dla wszystkich komórek w zakresie zaczynającym się od „John”:
12345 | Dla każdego c W zakresie("A1:A100")Jeśli c Jak „Jan*” Wtedyc.Font.Name = "Arial Black"Zakończ, jeśliNastępny c |
Poniższy kod zastąpi wszystkie wystąpienia „Do przetestowania” na „Zaliczone” w określonym zakresie:
12345678910 | Z zakresem("a1:a500")Ustaw c = .Find("Do przetestowania", LookIn:=xlValues)Jeśli nie c, to nic, topierwszy adres = c.AdresRobićc.Wartość = "Zdane"Ustaw c = .Znajdźnastępny(c)Loop While Not c Is Nothing And c.Adres pierwszy adresZakończ, jeśliKończyć z |
Ważne jest, aby pamiętać, że musisz określić zakres, aby użyć FindNext. Musisz także podać warunek zatrzymania, w przeciwnym razie pętla będzie wykonywana bez końca. Zwykle adres pierwszej znalezionej komórki jest przechowywany w zmiennej i pętla jest zatrzymywana, gdy ponownie dotrzesz do tej komórki. Musisz również sprawdzić przypadek, w którym nie znaleziono nic, co mogłoby zatrzymać pętlę.
Adres zakresu
Użyj Range.Address, aby uzyskać adres w stylu A1
123 | Zakres MsgBox("A1:D10").Adres' lubDebug.Print Range("A1:D10").Adres |
Użyj xlReferenceStyle (domyślnie xlA1), aby uzyskać adresy w stylu R1C1
123 | MsgBox Range("A1:D10").Address(ReferenceStyle:=xlR1C1)' lubDebug.Print Range("A1:D10").Address(ReferenceStyle:=xlR1C1) |
Jest to przydatne, gdy masz do czynienia z zakresami przechowywanymi w zmiennych i chcesz przetwarzać tylko określone adresy.
Zakres do tablicy
Szybciej i łatwiej jest przenieść zakres do tablicy, a następnie przetworzyć wartości. Tablicę należy zadeklarować jako Wariant, aby uniknąć obliczania rozmiaru wymaganego do wypełnienia zakresu w tablicy. Wymiary tablicy są ustawione tak, aby odpowiadały liczbie wartości w zakresie.
123456789 | Dim DirArray jako wariant'Przechowuj wartości z zakresu do tablicyDirArray = Zakres("a1:a5").Value' Pętla do przetwarzania wartościDla każdego c In DirArrayDebug.Drukuj cNastępny |
Tablica do zakresu
Po przetworzeniu możesz zapisać tablicę z powrotem do zakresu. Aby zapisać Array w powyższym przykładzie w Range, musisz określić Range, którego rozmiar odpowiada liczbie elementów w Array.
Użyj poniższego kodu, aby zapisać tablicę w zakresie D1:D5:
123 | Zakres("D1:D5").Value = DirArrayZakres("D1:H1").Value = Application.Transpose(DirArray) |
Pamiętaj, że musisz transponować tablicę, jeśli zapisujesz ją w wierszu.
Zakres sumy
12 | SumOfRange = Application.WorksheetFunction.Sum(Range("A1:A10"))Debug.Print SumOfRange |
Możesz użyć wielu funkcji dostępnych w programie Excel w kodzie VBA, określając Application.WorkSheetFunction. przed nazwą funkcji, jak w powyższym przykładzie.
Zakres zliczania
1234567 | ' Policz liczbę komórek z liczbami w zakresieCountOfCells = Application.WorksheetFunction.Count(Range("A1:A10"))Debug.Print CountOfCells' Policz liczbę niepustych komórek w zakresieCountOfNonBlankCells = Application.WorksheetFunction.CountA(Range("A1:A10"))Debug.Print CountOfNonBlankCells |
Autor: Vinamra Chandra