- Przypisywanie wartości do zakresu
- Zaznaczanie komórek
- Odniesienia względne
- Zmiana rozmiaru zakresu
- Odwołania do poszczególnych komórkach w zakresie
- Podsumowanie
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.
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.
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.
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.


