Kurs VBA – cz. 9 – Obiekt Range

Większość pracy z Excelem polega na modyfikowaniu komórek. Prawie każdy element Excela ma odpowiadający sobie obiekt, w efekcie dużą część pracy w VBA wykonujemy przy pomocy zakresów (obiekt Range). Range może reprezentować pojedynczą komórkę, wiersz, kolumnę, grupę komórek z zakresu ciągłego lub nie albo nawet zakres z kilku skoroszytów jednocześnie.

Właściwość Range obiektu zwraca obiekt typu Range. Może ona być używana następująco.

ObiektNadrzedny.Range(komorka1)
ObiektNadrzedny.Range(komorka1, komorka2)

Pierwszy przykład zwraca zakres wyznaczony przez jedną komórkę, drugi natomiast zakres między dwoma komórkami, W powyższych przykładach ObiektNadrzedny ozbacza obiekt Application, Range lub Worksheet. Jeżeli nie podamy go, zostanie tam domyślnie wstawiony ActiveSheet.

Tyle w telegraficznym skrócie. Przerobimy teraz kilkanaście przykładów różnego dostępu do komórek. VBA udostępnia wiele możliwości, z których można zawsze wybrać akurat najwygodniejszą.


Przypisywanie wartości do zakresu.

Przypisywanie wartości do komórki jest proste.

 

Podobnie możemy dokonać przypisania do zakresu nazwanego. Poniższy przykład zadziała niezależnie od tego, na którym arkuszu znajduje się zakres nazwany,

 

Następny przykład przypisuje wartość do wszystkich komórek podanego zakresu w aktywnym arkuszu.

 

Jak już wspominałem wcześniej właściwość Value jest domyślna i najczęściej jest pomijana.

 

Łatwo jest wymienić kilka komórek.

 

Do wstawianiu formuły posługujemy się atrybutem Formula. Niestety musimy użyć wtedy angielskiej wersji formuły.

 

Zaznaczanie komórek

Do zaznaczania komórek używamy metody Select.

 

Po wykonaniu powyższego przykładu zakres B1:B15 zostaje podstawiony pod obiekt Selection. Obiekt Selection jest typu Range, ma więc jego wszystkie atrybuty i metody.

Odniesienia względne

Często chcemy znaleźć komórkę odpowiednio przesuniętą względem innej.

Range.Offset(przesuniecie w wierszu, przesunięcie w kolumnie)

Dodatnie argumenty przesuwają zakres w dół i w prawo, negatywne w górę i w lewo. Poniższe zaznacza komórkę A2.

 

Teraz ustawimy 1 w komórce C2.

 

Po wykonaniu poniższej instrukcji pojawi się błąd, ponieważ nie ma nic powyżej ani po lewej stronie od A1.

 

Ostatni przykład zaznacza komórkę bezpośrednio pod aktualnie zaznaczoną.

 

Powyższy atrybut Offset oczywiście zwraca range. Jest on często wykorzystywany w programach przy okazji pętli. Pętli jeszcze nie omawialiśmy, ale istotne jest tutaj, że dziesięć razy zaznaczamy komórkę poniżej aktualnie zaznaczonej.

 

Zmiana rozmiaru zakresu

Przy pomocy parametru Resize możemy stworzyć zakres, który ma lewy, górny róg w tym samym miejscu, ale inną ilość kolumn i wierszy. Zaznaczę zakres A1:A2.

 

Pierwszy argument może być pominięty, jeżeli chcemy, aby ilość wierszy została bez zmian
 

lub drugi, w przypadku kolumn.
 

Poniższy przykład zmienia rozszerza zakres nazwany Baza o jeden wiersz.

Odwołanie do poszczególnych komórek w zakresie

Do pojedynczych komórek możemy zwracać się przy pomocy atrybutu Cells. Poniższym zaznaczamy komórkę C2 (1 wiersz, 2 kolumna zakresu).

 

Inne komórki w tym zakresie możemy zaznaczać zgodnie z przykładem:

Cells jest też atrybutem obiektu Worksheet. Zaznaczmy komórkę C1.

 

Jeżeli używamy zapisu w stylu Range(„A1”) trzeba pamiętać, że jest to A1 zakresu zwróconego przez obiekt nadrzędny. Poniżej zaznaczam komórkę B2. Zwykle A1 odnosi się do skrajnie lewej i górnej komórki. Poniżej jest to właśnie B2.

 

Możemy odwołać się też poza pierwotny zakres, dopóki mieścimy się w arkuszu. Zaznaczę komórkę C1 w aktywnym arkuszu.

 

Dzięki powyższemu możemy jeszcze raz napisać wcześniejszy program, unikając zaznaczania komórek, dzięki czemu będzie działał szybciej.Option Explicit

 

Podsumowanie

Oczywiście obiekt Range ma mnóstwo innych metod i atrybutów. Wszystkie można znaleźć na stronie MSDN i w pomocy VBA. W poprzedniej części kursu pokazałem jak znaleźć informacje na temat obiektów.

Żeby podsumować chciałbym jeszcze raz podkreślić, że wszystkie powyższe atrybuty najczęściej przynależą do obiektu Range i zawsze zwracają obiekt Range. Można więc z nich tworzyć „łańcuchy” wedle potrzeb. Umiejętność tworzenia takich zestawów przychodzi z doświadczeniem.

Ostatni przykład należy potraktować z przymrużeniem oka. Przypisuje on po prostu wartość 1 do komórki A1.

 

Jako ostateczny dowód elastyczności VBA w omawianym zakresie pokażę trzy instrukcje, które robią dokładnie to samo, czyli przesuwają zaznaczenie jedną komórkę niżej.

 

Subskrybuj RSS, lub polub blog na Facebooku aby otrzymywać najnowsze informacje o rozwoju kursu.

Comments 11

  1. Potrzebuję pomocy, poszukuję kodu, który będzie wybierał wolną komórkę ale zawsze w tym samej kolumnie A ale nie wiadomu w jakim wierszu bo zakres jest zmienny jak zrobić taki kod? Prosze o pomoc

    1. 'wybiera pierwszą wolną komórkę w kolumnie A
      Sub Pusta()
      [a1].Select
      Do While ActiveCell <> ""
      ActiveCell.Offset(1, 0).Select
      Loop
      End Sub

  2. witam może lepiej
    Sub test()
    Dim LastRow As Long
    LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row
    if Not ISEmpty (Cells(LastRow,1))
    Msgbox "Wolne miejsce"
    End if
    End sub

    Makro będzie w miejscu pustym wyświetlać informację

  3. Dzień Dobry,
    podłączam się do pytania. Również poszukuję formuły, która zaznaczy mi zakres wszystkich aktywnych komórek w danej kolumnie.

    Przykładowo jeżeli w kolumnie A będzie wpisanych 10 liczb pod sobą to makro zaznaczy 10, jeżeli 8 to makro zaznaczy 8 itp.
    Coś w stylu skrótu klawiszowego ctrl+shift+(strzałka w dół)

    Z góry dziękuje za pomoc.

    1. Dzień dobry,
      Dziękuje za pytanie. W takich przypadkach przydaje się nagrywarka. W tym przypadku po naciśnięciu skrótu ctrl+shift+ strzałka w dół nagrywarka tworzy kod:

      Range(Selection, Selection.End(xlDown)).Select

      Wystarczy pod Selection wstawić zakres A1.

  4. Dzień dobry mam problem, a dla kogoś nie obeznanego jak ja to wielki problem 🙁
    Może ktoś pomoże mi z nim.
    Jak zarejestrować makro /makro wypełnia komórki wartościami – i to działa/ tak by ostatnim jego zadaniem było ustawić po wykonaniu makra została zaznaczona automatycznie kolejna komórka /i tak też się ustawia/ i po wciśnięciu kolejny raz tego makra zostały wypełnione pola na których makro skończył zadanie. tj. Wypełniło komórki G2:G4 i stanęło na H2. Teraz po wciśnięciu tegoż samego makro chciałbym by wypełniło H2:H4 i stanęło na I2. I tak dalej po każorazowym wciśnięciu tego makra.

    Poniżej to makro.

    Sub Makro5()
    '
    ' Makro5 Makro
    '

    '
    Range("A12:A15").Select
    Selection.Copy
    Range("G2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Range("H2").Select
    End Sub

    1. Dziękuję za szybką odpowiedź. Już sobie poradziłem. Dałem radę z pętlą. :))
      Co do kursu to super sprawa! na bierząco się tego uczę 🙂 Jak człowiek za młodu olał temat tak teraz musi nadrabiać tak proste sprawy.

      Po range.selection dodałem

      Do Until (ActiveCell.Value = "")

      ActiveCell.Offset(0, 1).Select

      Loop 'koniec pętli

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *