Start > Kursy on-line > Excel - makra i VBA

Excel - makra i VBA


Przypisania danych i odwołania: skoroszyt, arkusz, obszar, komórka

Załącznik z przykładami dla tego rozdziału znajduje się w tym miejscu.

W tym rozdziale zaczniemy tworzyć proste procedury, które będą miały za zadanie pokazanie czytelnikowi jak można odwoływać się do różnego rodzaju obiektów. Będziemy wywoływać procedury, przypisywać dane do zmiennych, odwoływać się do skoroszytów, arkuszy, kolumn, wierszy, obszarów i komórek. Sprawdzimy też jak wykorzystać niektóre z właściwości wspomnianych obiektów i jak je zmieniać. W tym celu utwórzmy moduł w pustym pliku Excela:



Na początek stworzymy procedurę, która będzie wykonywać kolejno następujące czynności:

  • odwołamy się do konkretnej komórki, konkretnego arkusza w określonym pliku
  • zapiszemy jej zawartość do zmiennej
  • zawartość zmiennej wkleimy do innej komórki.


Oto jak ona wygląda:


Option Explicit

Sub przeklej() Dim tekst As String Windows("odwolania_vba.xls").Activate Sheets("Arkusz1").Select Cells(1, 1).Select tekst = Cells(1, 1) Sheets("Arkusz2").Select Cells(1, 1).Select Cells(1, 1) = tekst End Sub
Uruchomienie procedury możliwe jest poprzez ustawienie kursora w dowolnym jej miejscu oraz naciśnięcia klawisza F5 klawiatury.
Powyższa procedura, najpierw definiuje zmienną tekstową o nazwie "tekst", następnie wybiera okno programu Excel (o nazwie "odwolania_vba.xls") - służy do tego polecenie Windows(nazwa otwartego okna systemu w cudzysłowie).Activate
W dalszej kolejności wybieramy arkusz - służy do tego polecenie: Sheets(nazwa arkusza w cudzysłowie).Select, następnie konkretną komórkę poleceniem Cells(nr wiersza liczony od 1, numer kolumny liczony od 1).Select. Przypisanie zawartości komórki do zmiennej zawarte jest w kolejnym wierszu i odbywa się po prostu przez sformułowanie tekst=. Dalsza część jest wybraniem innego arkusza i komórki w nim, a następnie przypisaniu wartości przechowywanej w zmiennej tekst (=tekst).

Polecenie dotyczące wyboru danego okna programu jest w tym miejscu opcjonalne, gdyż jego pominięcie nadal spowoduje, że pozostałe czynności zostaną wykonane dla bieżącego pliku. Chodziło raczej o pokazanie, jak z poziomu procedury umieszczonej w jednym pliku, można odwołać się do zawartości innego. Dodatkowo kod procedury został celowo rozwleczony, na kolejne etapy - także w celu prezentacji poszczególnych poleceń. Jeśli pisalibyśmy program w celach użytkowych, powinniśmy te czynności zrobić w następujący sposób:


Sub przeklej_2()

Sheets("Arkusz2").Cells(1, 1) = Sheets("Arkusz1").Cells(1, 1)

End Sub
Efekt będzie identyczny (pominęliśmy wybór pliku). A wykonana zostanie tylko i wyłącznie jedna instrukcja oraz obędziemy się bez zmiennej, która także obciąża pamięć komputera. Dodatkowo nie będziemy się przełączać pomiędzy arkuszami w trakcie przeklejania (gdyż nie musimy używać jawnej deklaracji "Select" aby mieć dostęp do właściwości danego obiektu i jego jako takiego). Takie niejawne deklarowanie poleceń jest zdecydowanie zalecane - zwłaszcza podczas tworzenia rozbudowanych aplikacji - pozwala przede wszystkim na znaczące przyspieszenie działania aplikacji jak i wymaga od komputera znacznie mniej zasobów procesora i pamięci.

Inną możliwością odwołania się do konkretnej komórki jest użycie polecenia Range:


Sub przeklej_3()

Sheets("Arkusz2").Range("A1") = Sheets("Arkusz1").Cells(1, 1)

End Sub
W tym przypadku możemy użyć w cudzysłowie adresu komórki. Polecenie Range pozwala odnosić się nam także do obszarów danych, kolumn lub wierszy:


Sub przeklej_4()

Sheets("Arkusz2").Range("A:A") = Sheets("Arkusz1").Cells(1, 1)

End Sub
Jeśli użyjemy powyższej procedury, wypełnimy w momencie całą kolumnę A w Arkuszu2, zawartością komórki A1 z Arkusza1. Na koniec trzeba wspomnieć o poleceniu, które pozwala na operacje na bieżącym arkuszu, komórce: są to ActiveSheet oraz ActiveCell - użycie ich zamiast deklarowania całego adresu pozwoli na identyczne operacje jak powyżej, jednak w odniesieniu, to arkuszy/komórek aktywnych w momencie wykonania procedury.

Gdybyśmy pozostawili teraz przeklejanie/przenoszenie wartości z boku, natomiast chcieli zająć się bliżej niektórymi metodami i właściwościami kolumn i wierszy, warto zwrócić uwagę na następujące sposoby "manipulowania" nimi:

  • ukrywanie/pokazywanie:
    
    Sub ukryj_kolumne_wiersz()
    
    Sheets("Arkusz1").Columns(1).Hidden = True
    Sheets("Arkusz1").Rows(1).Hidden = True
    
    End Sub
    
    polega na ustawieniu właściwości "Hidden" na "False", ponowne pokazanie jest możliwe poprzez zmianę tej właściwości na "True"
  • usuwanie:
    
    Sub usun_kolumne_wiersz()
    
    Sheets("Arkusz1").Columns(1).Delete
    Sheets("Arkusz1").Rows(1).Delete
    
    End Sub
    
    zauważmy, że w tym przypadku nie mamy znaku równości oraz przypisania cechy do danej właściwości. Nasz kod kończy się poleceniem Delete - różnica polega na tym, że obecnie użyliśmy metody w stosunku do kolumn/wierszy, a nie zmieniliśmy tylko właściwość danego obiektu. Metody odpowiadają za realne działania - można by zaryzykować stwierdzenie, że konsekwencje ich uruchamiania są bardzo często nieodwołalne. Pamiętając o tym, warto przed uruchomieniem danej procedury, co do działania której nie jesteśmy pewni, zapisać wcześniej plik Excela. W przypadku kiedy "coś pójdzie nie tak" możemy zamknąć plik bez jego zapisu i przywrócić poprzedni stan - jako, że konsekwencje użycia kodu VBA są nie do cofnięcia (polecenie "Cofnij" programu nie zadziała).


W bardzo podobny sposób można ustawiać wiele innych właściwości i używać innych metod w odniesieniu do niemal dowolnego obiektu. Ten kurs zdecydowanie nie wyczerpuje tego tematu - ma za zadanie jedynie nakreślić czytelnikowi sposób użycia i różnice - konkretne działania w odniesieniu do określonych obiektów można dosyć łatwo znaleźć w plikach pomocy programu - a bardzo często odzwierciedlają one po prostu angielskie słowa opisujące czynności/właściwości - i w wielu przypadkach można zaryzykować metodę "chybił - trafił" i uruchamiając kod. Do dyspozycji czytelnika pozostaje też rejestrator makr, który dzięki zapisywaniu wykonywanych czynności, jest prawdziwą "kopalnią wiedzy" dla projektanta i skraca znacznie poszukiwania konkretnych poleceń.

Na koniec trzeba zaznaczyć, iż pomimo tego, że nasze przykłady zawierały jako argumenty odwołań konkretne liczby (podawaliśmy numer wiersza/kolumny lub adres jawnie), nic nie stoi na przeszkodzie, aby w tych miejscach pojawiły się zagnieżdżone odwołania do np. komórek, które te wartości by zawierały. Podobnie jak możliwe jest używanie jako argumentów zmiennych, do których wcześniej przypisaliśmy określone wartości. Dodatkowo należy wspomnieć, iż w miejscach tych jak najbardziej dozwolone używanie wszelkiego rodzaju operatorów działań matematycznych: czyli dodawania (+), odejmowania (-), mnożenia (*) i dzielenia (/) - jak i stosowanie nawiasów dla określenia kolejności działań.