W kolejnej lekcji naszego kursu Visual Basic for Applications zajmiemy się pracą z zakresami. Przetwarzanie zakresów to prawdopodobnie najczęściej wykorzystywany element podczas przygotowania raportów - niezbędny zwłaszcza w pracach konsolidujących dane z różnych plików/źródeł.
Kopiowanie zakresu
Kopiowanie zakresów w VBA jest niezwykle proste, realizowane zresztą za pomocą jednej tylko metody Copy. Ogólna składnia instrukcji kopiującej w VBA może wyglądać następująco:
ZakresŹródłowy.Copy ZakresDocelowy
gdzie ZakresŹródłowy to komórka, zakres lub wiele zakresów, które mają zostać skopiowane, natomiast ZakresDocelowy to adres górnej, lewej komórki zakresu, do którego kopiujemy wartości.
Oto przykłady praktyczne - załóżmy, że mamy zakres wartości w komórkach A1:E5 jak na poniższym rysunku:

I chcemy go skopiować w miejsce B7:F11. Użyjemy do tego makra:
Sub KopiujZakres() Range("A1:E5").Copy Range("B7") End Sub
Efekt powinien wyglądać jak na ponizszym rysunku:

Wynik przetworzenia zakresu
Zwróćcie proszę uwagę, że do skopiowania zakresu nie jest wymagane jego uprzednie zaznaczanie - warto o tym pamiętać w sytuacji, kiedy nagrywacie makro a później je edytujecie ręcznie - możecie wtedy usunąć instrukcje zaznaczania, przyspieszając w ten sposób wykonanie makra.
Za pomocą metody Copy możecie kopiować pojedyncze komórki i zakresy w ramach jednego arkusza, między arkuszami czy nawet między różnymi plikami. Oto przykład makra kopiującego zakres między różnymi plikami:
Sub KopiujMiedzyPlikami() Workbooks("Plik1.xls").Sheets("Arkusz1").Range("A1").Copy _ Workbooks("Plik2.xls").Sheets("Arkusz2").Range("B2") End Sub
Powyższe makro skopiuje zawartość komórki A1 z arkusza Arkusz1 z pliku Plik1 do komórki B2, arkusza Arkusz2 w pliku Plik2.
Spacja i znak podkreślenia ( _) oznacza, że instrukcje w linijce poniżej będą traktowane przez Excel jakby były wpisane w tej samej linijce, w której były użyte. Stosujemy ten zabieg wtedy gdy nasza instrukcja jest bardzo długa i dla polepszenia czytelności kodu chcemy podzielić ją na kilka linijek.
Przenoszenie zakresu
Przenoszenie zakresów jest bardzo podobne do ich kopiowania - jedyną różnicą jest użycie metody Cut w miejsce metody Copy. Np.:
Sub PrzeniesZakres() Range("A1:A2").Cut Range("B1") End Sub
Wszystkie uwagi napisane wcześniej w odniesieniu do kopiowania mają zastosowanie do przenoszenia.
Podsumowanie
Kopiowanie i przenoszenie zakresów jest niezwykle proste, jednak aby te instrukcje móc wykorzystywać w realnych zadaniach warto je wzbogacić o mechanizmy rozpoznowania zakresów użytkownika - w rzeczywistości rzadko mamy sytuację, kiedy pisząc makro wiemy z góry na jakim zakresie danych będzie ono pracowało. Dlatego w następnym poście pokaże Wam jak znajdować granice zakresów - niezależnie od tego jak szybko się zmieniają.
Jak zwykle zachęcam do eksperymentów.
