Strony

  • Strona główna
  • Kurs Excel
  • Kurs VBA
  • Moje narzędzia
  • Ciekawe Strony

11 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.

Worksheets("Arkusz1").Range("A1").Value = 1

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,

Range("MojaKomorka").Value = 1

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

ActiveSheet.Range("A1:A10").Value = 1

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

Worksheets("Arkusz1").Range("A1") = 1

Łatwo jest wymienić kilka komórek.

Worksheets("Arkusz1").Range("A1, A2, A5") = 1

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

Worksheets("Arkusz1").Range("A1").Formula = "=RAND()"

Zaznaczanie komórek

Do zaznaczania komórek używamy metody Select.

Worksheets(2).Range("B1:B15").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.

Range("A1").Offset(1, 0).Select

Teraz ustawimy 1 w komórce C2.

Range("A1").Offset(1, 2) = 1

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

Range("A1").Offset(-1, -2) = 1


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

ActiveCell.Offset(1, 0).Select

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.

Option Explicit
Sub test()
    Dim lv_li As Integer
    
    Range("A1").Select
    
    For lv_li = 1 To 10
        ActiveCell = lv_li
        ActiveCell.Offset(1, 0).Select
    Next lv_li
End Sub

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.

Range("A1:A10").Resize(1,2).Select

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

Range("A1:A10").Resize(,2).Select

lub drugi, w przypadku kolumn.

Range("A1:A10").Resize(2).Select

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

With Range("Database")
  .Resize(.Rows.Count + 1).Name = "Database"
End With

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).

Range("B2:D4").Cells(1, 2).Select

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


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

Worksheets("Arkusz1").Cells(1, 3).Select

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.

Range("B2:C5").Range("A1").Select

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

Cells(1, 2).Range("B1").Select

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
Sub test()
    Dim lv_li As Integer
        
    For lv_li = 1 To 10
        Range("A1").Cells(lv_li, 1) = lv_li
    Next lv_li
End Sub

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.

Worksheets("Arkusz1").Range("A1:B20").Cells(1, 1). _
Offset(1, 1).Range("B2").Offset(-2, -2) = 1

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.

ActiveCell.Cells(2, 1).Select
ActiveCell.Range("A2").Select
ActiveCell.Offset(1, 0).Select


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