Pętle
Wielokrotne
Przykłady opisane w tej lekcji dostępne są w arkuszu Excela VBA.xls, tylko ich
samodzielne przerobienie daje gwarancję zapamiętania tej lekcji.
Przykłady dla wszystkich lekcji szkolenia Excel 2003: ExcelSzkolenie.pl Cwiczenia Excel 2003.zip
Przykład 1.
(Arkusz: ‘Petle Wielokrotne
W wielu makrach wykorzystywane są numeryczne oznaczenia
kolorów.
W arkuszu ‘Petle Wielokrotne
Poniższe makro wpisuje w komórki będące w zakresie od
kolumny pierwszej (A) do ósmej (H) i w wierszach od 1 do 5 numer koloru jaki ma
tło tej komórki.
Wykorzystano tu podwójną pętle For Next.
Zewnętrzna pętla zmienia kolumny, wewnętrzna zmienia wiersze.
Komenda Cells(wiersz, kolumna) = Selection.Interior.ColorIndex wprowadza numer koloru do
komórki.
Komenda ActiveCell.Offset(1, 0).Range("A1").Select
przechodzi o linijkę niżej, a komenda:
ActiveCell.Offset(-5, 1).Range("A1").Select przechodzi o 1 kolumnę w prawo i 5 komórek w górę.
Przed uruchomieniem makra należy ustawić A1 jako aktywną
komórkę.
Sub
Podwojna_Petla_For_Next()
For
kolumna = 1 To 8
For
wiersz = 1 To 5
Cells(wiersz, kolumna) = Selection.Interior.ColorIndex
ActiveCell.Offset(1,
0).Range("A1").Select
Next
wiersz
ActiveCell.Offset(-5,
1).Range("A1").Select
Next
kolumna
End Sub
Przechodzenie komórkę w dół i w prawo pozwala łatwo
zrozumieć działanie tego makra, bo zmiany dokonywane są w komórce która jest
akurat aktywna.
Ale uaktywnianie komórek nie jest konieczne, w poniższej
krótszej wersji tego makra zostało pominięte.
Wersja ta nie wymaga też uaktywnienia komórki A1 przed jego
uruchomieniem.
Sub
Podwojna_Petla_For_Next_v2()
For
kolumna = 1 To 8
For
wiersz = 1 To 5
Cells(wiersz, kolumna) = Cells(wiersz, kolumna).Interior.ColorIndex
Next
wiersz
Next
kolumna
End
Sub
Oba makra dają identyczny wynik:
Przykład 2.
(Arkusze: ‘Petle Wielokrotne
W tej lekcji zapoznamy się z makrem,
które zmienia wartości w arkuszu danych.
Chcielibyśmy ustalić targety dla dwudziestu przedstawicieli handlowych w Woj.
Mazowieckim, na skutek dyskusji i uzgodnień udało się nam wypracować poniższą
tabelę danych. Jednak targety dla wszystkich
przedstawicieli w roku i każdym kwartale muszą się sumować dokładnie do targetu dla całego województwa. Ponieważ różnice są
niewielkie kierownicy zespołów A, B i C zgodzili się aby rozdzielić je po równo
pomiędzy ich podwładnych.
Wykorzystamy do tego makro, które
różnicę z komórki M34 doda do targetu każdego z
przedstawicieli handlowych tych zespołów.
Poniżej przedstawiam najprostszą
wersję takiego makra, które w dalszej części tej lekcji będzie rozbudowywane.
Sub Target()
tablica_linii_Q = Array("zerowy",
7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, "koniec")
j = 1 'zmienia kolejne wiersze
b = -Range("m34").Value
Do Until tablica_linii_Q(j) = "koniec"
Range("m"
& tablica_linii_Q(j)).Select
ActiveCell.Value
= ActiveCell.Value + b
j = j + 1
Loop
End Sub
Po tytule makra zadeklarowano
tablicę (Array) wraz ze wszystkimi jej elementami.
Elementy tej tablicy to numery
wierszy w których są dane jakie planujemy zmieniać.
Tablica taka ma element zerowy
któremu w tym przypadku przyznano wartość tekstową „zerowy” i który nie jest
wykorzystywany w makrze.
Zmienna „j” służy do wskazywania
kolejnych wierszy w kolumnie m, które mają być zmienione, dla pierwszej z
komórek wynosi 1 co oznacza pierwszy element tablicy czyli wiersz 7.
Zmienna „b” przyjmuje wartość różnicy
znajdującej się komórce M34 ale z odwrotnym znakiem. b = -Range("m34").Value
Składnia wykorzystanej tu pętli jest
następująca:
Do Until
WARUNEK
ZADANIE
Loop
Pętla ta wykonuje określone zadanie
znajdujące się pomiędzy Do Until i Loop tak długo jak długo warunek podany po ‘Do Until’ będzie spełniony. W naszym przypadku tak długo aż
zmienna j nie osiągnie wartości „koniec”.
W tym przykładzie Zadanie składa się
z 3 linii:
Range("m" & tablica_linii_Q(j)).Select
Zadanie jakie jest wykonywane to
przejście do komórki której adres składa się z komny
M i wartości j z tablica_linii, np.
dla j wynoszącego 3 będzie to adres M9.
ActiveCell.Value = ActiveCell.Value
+ b
W kolejnej linii zadania makro wprowadza
do aktywnej komórki jej wartość zsumowaną ze zmienną b.
j = j + 1
W ostatniej linii zadania makro
powiększa zmienną j o 1 tak aby przy kolejnym powtórzeniu makro zmieniło
następną z wartości i docelowo mogło osiągnąć warrość
zmiennej „koniec”
Ta najprostsza wersja tego makra
zmieniać będzie tylko wartości dla kolumny M i będzie mało dokładna ponieważ
wartości dla Zespołu D nie są zmieniane. Kilkukrotne uruchomienie makra
znacznie poprawi dokładność, ale po co mielibyśmy samodzielnie uruchamiać makro
kilkakrotnie jeżeli możemy to ująć w makrze?
Sub Target1()
tablica_linii_Q = Array("zerowy",
7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, "koniec")
i = 1 'powtórzenia w kolumnie
j = 1
Do Until i = 5
b = -Range("m34").Value
Do Until tablica_linii_Q(j) = "koniec"
Range("m"
& tablica_linii_Q(j)).Select
ActiveCell.Value
= ActiveCell.Value + b
j = j + 1
Loop
j = 1
i = i + 1
End
Sub
W drugiej wersji tego samego makra dodano
jedynie pętle, która pozwoli nam powtórzyć całą operację kilkukrotnie. Zmienna
„i” to właśnie ilość powtórzeń całej operacji.
W naszym przykładzie pętla
zmieniająca dane zostanie powtórzona 4 razy.
Proponuję uruchomienie obu makr za
pomocą przycisku F8 i przyjrzenie się jak aktywna komórka krąży w pętlach.
W pliku VBA.xls znajdują się
następne wersje tego makra które do2 pętli przedstawionych powyżej dodają
kolejne. Makro to w swojej ostatecznej wersji może w ciągu kilku minut wykonać
pracę, którą człowiek wykonywałby przez cały dzień.
Szkolenie Excel 2003 Szkolenie Excel 2007