W tym artykule omówiliśmy różne rodzaje pętli używanych w VBA i sposoby ich wykorzystania do wykonania tego samego zadania na różne sposoby.
Dlaczego pętle?
Zapętlanie jest jedną z najpotężniejszych technik programowania używanych w wielu językach programowania. Zapętlenie służy do powtarzania bloku kodu wymaganą liczbę razy lub do momentu, gdy dany warunek zostanie spełniony lub zostanie osiągnięta określona wartość, po czym wykonywany jest następny blok kodu.
Celem pętli Excel VBA jest sprawienie, aby Excel powtórzył fragment kodu określoną liczbę razy. Można określić, ile razy kod musi być powtórzony jako stała liczba (np. zrób to 10 razy) lub jako zmienna (np. zrób to tyle razy, ile jest wierszy danych).
Pętle programu Excel można konstruować na różne sposoby, aby dopasować je do różnych okoliczności. Często te same wyniki można uzyskać na różne sposoby, zgodnie z osobistymi preferencjami.
W Excel VBA dostępne są trzy różne rodzaje pętli, którymi są:
1. Rób do pętli
2. ZRÓB PODCZAS Pętla
3. Pętla FOR
1. Rób do pętli
Pętla DO UNTIL jest używana do powtarzania bloku kodu w nieskończoność, dopóki określony warunek nie zostanie ustawiony na True. Warunek można sprawdzić na początku lub na końcu pętli. Instrukcja DO UNTIL… LOOP sprawdza warunek na początku, podczas gdy instrukcja DO… LOOP UNTIL sprawdza warunek na końcu pętli.
Składnia instrukcji DO UNTIL… LOOP
Czy Do [Warunek]
[Blok kodu do powtórzenia]
Pętla
Składnia instrukcji DO… LOOP UNTIL
Robić
[Blok kodu do powtórzenia]
Zapętl do [warunek]
Wyjaśniliśmy pętlę DO… UNTIL na przykładzie. Makra Loop1 i Loop2 służą do obliczania średniej liczb w kolumnie A i kolumnie B przy użyciu pętli DO… UNTIL.
Przykładowe dane znajdują się w zakresie A15:B27. Kolumna A zawiera wyniki Rundy 1, a kolumna B zawiera wyniki Rundy 2. Chcemy obliczyć średnie wyników Rundy 1 i Rundy 2 w kolumnie C.
W makrze Loop1 użyliśmy „FormułaR1C1” do wstawienia średniej formuły do aktywnej komórki. Instrukcja warunku w pętli DO UNTIL jest sprawdzana na końcu pętli.
W makrze Loop2 użyliśmy „WorksheetFunction.Average”, aby wstawić średnią wartość w aktywnej komórce. Nawet w tym makrze instrukcja warunku jest sprawdzana na końcu pętli.
Jedyna różnica między makrem Loop1 i Loop2 polega na tym, że Loop1 wstawia średnią formułę, podczas gdy Loop2 oblicza średnią, a następnie wstawia średnią wartość do aktywnej komórki.
2. ZRÓB PODCZAS Pętla
Pętla DO WHILE służy do powtarzania bloku kodu nieskończoną liczbę razy, podczas gdy określony warunek nadal ma wartość True i zatrzymuje się, gdy warunek zwraca wartość False. Warunek można sprawdzić na początku lub na końcu pętli. Instrukcja DO WHILE… LOOP sprawdza warunek na początku, podczas gdy instrukcja DO… LOOP WHILE sprawdza warunek na końcu pętli. Instrukcja DO… LOOP WHILE jest używana, gdy chcemy, aby pętla przynajmniej raz uruchomiła blok kodu przed sprawdzeniem warunku.
Składnia instrukcji DO WHILE… LOOP
Zrób póki [Warunek]
[Blok kodu do powtórzenia]
Pętla
Składnia instrukcji DO… LOOP WHILE
Robić
[Blok kodu do powtórzenia]
Pętla podczas [warunek]
W tym przykładzie makra Loop3 i Loop4 są używane do obliczania średnich wartości w komórkach kolumny A i kolumny B. Oba makra działają na tych samych przykładowych danych, które są używane przez makra Loop1 i Loop2. Oba używają instrukcji DO WHILE, aby przejść przez zakres zawierający dane.
Jedyna różnica między makrami Loop3 i Loop4 polega na tym, że są one różnymi sposobami reprezentowania warunków pętli DO WHILE.
Ponieważ makra Loop3 i Loop4 używają tych samych danych wejściowych, a nawet wykonują te same funkcje, co makro Loop1, więc zwrócone dane wyjściowe będą również takie same jak makra Loop1.
3. Pętla FOR
Pętla For służy do powtarzania bloku kodu określoną liczbę razy.
Składnia pętli FOR
Dla zmienna_liczbowa = wartość_początkowa Do wartości_końcowej
[blok kodu]
Następna zmienna_licznikowa
Makro Loop5 pokazuje jak używać pętli FOR do obliczania średniej. Wykorzystuje również te same przykładowe dane, które są używane przez inne makra. Użyliśmy 15 jako wartości początkowej, ponieważ przykładowe dane zaczynają się od 15NS wiersz. Użyliśmy Range("A" & Cells.Rows.Count).End(xlUp).Row, aby znaleźć ostatni wiersz zawierający dane. Pętla FOR powtórzy się (ostatnia komórka-15) wiele razy.
Dane wyjściowe zwracane po uruchomieniu makra Loop5 są takie same jak makra Loop1.
Makro Loop6 jest tworzone do obliczania średniej tylko wtedy, gdy aktywna komórka, w której będzie funkcja średniej, jest pusta przed uruchomieniem makra.
Przykładowe dane dla tego makra znajdują się w zakresie E15 do G27.
Użyliśmy funkcji DO… LOOP WHILE, aby przejść przez zdefiniowany zakres. Instrukcja IF służy do sprawdzenia, czy komórka, w której zostanie wstawiona funkcja, zawiera wartość. To makro wstawi średnią funkcję do komórki tylko wtedy, gdy jest pusta.
Makro Loop7 służy również do obliczania średniej. Sprawdza wartości w kolumnie pomocniczej przed oceną, czy ponownie zapętlić. Sprawdza również, czy odwołanie do komórki, które ma być użyte w funkcji średniej, jest puste.
Przykładowe dane użyte dla makra Loop7 mieszczą się w zakresie J15:M27.
Kolumna M jest używana jako kolumna pomocnicza. To makro wstawi średnią funkcję tylko wtedy, gdy komórka w kolumnie M nie jest pusta. To makro sprawdza, czy komórka powinna być pusta przed wstawieniem do niej średniej funkcji. Nie wstawi funkcji średniej, jeśli komórka, do której odwołuje się funkcja średnia, jest pusta.
Proszę postępować zgodnie z poniższym kodem!
Option Explicit Sub Loop1() 'Obliczanie średniej 'Do dopóki pętla będzie pętla do momentu, gdy komórka w poprzedniej kolumnie aktywnej komórki będzie pusta Zakres("C15").Wybierz Do 'Przypisywanie średniej funkcji do wartości w komórkach dwóch poprzednich kolejnych kolumn ActiveCell. FormulaR1C1 = "=Average(RC[-1],RC[-2])" 'Przejście do komórki w następnym wierszu ActiveCell.Offset(1, 0).Wybierz 'Sprawdzenie, czy wartość w komórce poprzedniej kolumny jest pusta 'Wykonaj do pętla będzie pętla, dopóki instrukcja warunku nie zwróci True Loop Until IsEmpty(ActiveCell.Offset(0, -1)) Range("A15").Select End Sub Sub Loop2() 'Obliczanie średniej 'Do dopóki pętla będzie pętla do komórki w poprzedniej kolumna aktywnej komórki jest pusta 'To makro jest podobne do makra Loop1, jedynym sposobem obliczenia średniej jest inny Zakres("C15").Wybierz Do 'Worksheet.Average służy do obliczania średniej ActiveCell.Value = WorksheetFunction.Average( ActiveCell.Offset(0, -1).Value, _ ActiveCell.Offset(0,-2).Value) ActiveCell.Offset(1, 0). Wybierz pętlę do czasu, gdy jest pusty (ActiveCel l.Offset(0, -1)) Zakres("A15") .Wybierz 'Sprawdzanie, czy wartość w komórce poprzedniej kolumny jest pusta 'Pętla Do While będzie pętla, dopóki instrukcja warunku nie będzie miała wartości True Do While IsEmpty(ActiveCell.Offset(0, -1)) = False 'Przypisywanie średniej funkcji do wartości w komórkach poprzedniej kolumny dwie kolejne kolumny ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])" 'Przechodzenie do komórki w następnym wierszu ActiveCell.Offset(1, 0).Select Loop Range("A15").Select End Sub Sub Loop4() 'Obliczanie średniej 'Wykonaj Podczas gdy pętla będzie działać dopóki komórka w poprzedniej kolumnie aktywnej komórki będzie pusta 'To makro jest podobne do makra Loop3, jedynym sposobem zastosowania warunku jest inny Zakres("C15").Wybierz Dopóki nie jest pusty(ActiveCell.Offset(0, -1)) ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])" ActiveCell.Offset(1, 0). Wybierz zakres pętli(" A15"). Wybierz End Sub Sub Loop5() 'Pętla FOR powtarza się dla ustalonej liczby er razy określona przez liczbę wierszy Dim i, lastcell As Long 'Znajdowanie ostatniego wiersza zawierającego dane w kolumnie A lastcell = Range("A" & Cells.Rows.Count).End(xlUp).Row Range("C15 ").Select 'i zmiennej jest przypisywana wartość 15, ponieważ nasze przykładowe dane zaczynają się od 15 wiersza 'FOR Loop zapętli x For i = 15 To lastcell ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2 ])" ActiveCell.Offset(1, 0).Select Next i Range("A15").Select End Sub Sub Loop6() 'Obliczanie średniej 'Dopóki pętla wykona pętlę, dopóki komórka w poprzedniej kolumnie aktywnej komórki będzie pusta' Nie oblicza średniej, jeśli jest już coś w komórce Range("G15").Wybierz Do If IsEmpty(ActiveCell) Then ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])" End If ActiveCell.Offset(1, 0).Select Loop Until IsEmpty(ActiveCell.Offset(0, -1)) Range("E15").Select End Sub Sub Loop7() 'Do dopóki pętla działa tak długo, jak jest coś w komórce w następnej kolumnie 'Nie oblicza średniej, jeśli jest już coś w aktywnym c ell 'Nie, jeśli w komórkach nie ma danych, które są używane w ramach funkcji średniej (aby uniknąć błędów #DIV/0). 'Obliczanie średniego zakresu("L15").Wybierz Do If IsEmpty(ActiveCell) Then If IsEmpty(ActiveCell.Offset(0, -1)) And IsEmpty(ActiveCell.Offset(0, -2)) Then ActiveCell.Value = " " Else ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])" Koniec, jeśli koniec, jeśli ActiveCell.Offset(1, 0). Wybierz pętlę do czasu pustego(ActiveCell.Offset(0, 1)) Zakres ("J15"). Wybierz Koniec Sub
Jeśli podobał Ci się ten blog, podziel się nim ze znajomymi na Facebooku. Możesz również śledzić nas na Twitterze i Facebooku.
Chcielibyśmy usłyszeć od Ciebie, daj nam znać, jak możemy poprawić naszą pracę i uczynić ją lepszą dla Ciebie. Napisz do nas na stronie e-mail