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

Excel - makra i VBA


Pętla Do...Loop

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

Tym razem omówimy krótko pętlę, która dodatkowo zawiera w sobie warunek sprawdzający. Innymi słowy, liczba powtórzeń poleceń w niej zawartej zależy od tego, jakie są efekty wykonywanych sekwencyjnie poleceń. Pętla ta może być użyta na dwa sposoby: może wykonywać sekwencję poleceń dopóki warunek sprawdzany na jej początku lub końcu jest spełniony, lub też wykonywać sekwencję poleceń, do momentu aż warunek ten zostanie spełniony.

Pętla z wyrażeniem "While"

Pętla, która powtarzać będzie określone polecenia, dopóki warunek jest spełniony. Załóżmy, że chcemy wypełniać komórki liczbami losowymi od 0 do 1000 w kolejnych komórkach kolumny, do momentu kiedy losowane liczby są mniejsze lub równe od 750. Użyjemy tych samych poleceń, jak w przykładzie z poprzedniego rozdziału, jednak umieścimy je w innej pętli:


Sub petla_do_while()

Dim zmienna_losowa As Integer

zmienna_losowa = Round(Rnd() * 1000, 0)

If zmienna_losowa > 750 Then
	Exit Sub
	Else

		Do While zmienna_losowa <= 750
			ActiveCell = zmienna_losowa
			Cells(ActiveCell.Row + 1, ActiveCell.Column).Select
			zmienna_losowa = Round(Rnd() * 1000, 0)
		Loop

End If

End Sub
Przeanalizujmy naszą procedurę. Definiujemy zmienną jako typu Integer i przypisujemy jej wartość losową (podobnym poleceniem jak w poprzednim rozdziale). W następnym kroku sprawdzamy, czy zmienna ta nie jest przypadkiem większa od 750 - jeśli tak, kończymy procedurę, jeśli nie przechodzimy do meritum tego rozdziału.
Definiujemy pętlę, która sprawdza na samym początku bieżącą wartość zmiennej "zmienna_losowa" i jeśli jest ona mniejsza lub równa 750 wykonuje sekwencję poleceń:
- wstawia wartość zmiennej do aktualnej komórki,
- przechodzi do kolejnej komórki,
- losuje kolejną wartość i przypisuje ją do zmiennej "zmienna_losowa".

Dzięki zastosowaniu dodatkowej instrukcji If mamy pewność, iż nawet w przypadku jeśli zmienna już podczas pierwszego losowania "wypadła" poza pożądany przedział, nie będzie wpisana - potem sprawdzanie jest możliwe już w ramach samej pętli.


Pętla z wyrażeniem "Until"

Drugi typ pętli będzie miał za zadanie wygenerowanie identycznego szeregu danych, ale sprawdzanie będzie odbywało się w inny sposób. Spójrzmy poniżej:


Sub petla_do_until()

Dim zmienna_losowa As Integer

zmienna_losowa = Round(Rnd() * 1000, 0)

If zmienna_losowa > 750 Then
	Exit Sub
	Else

		Do Until zmienna_losowa > 750
			ActiveCell = zmienna_losowa
			Cells(ActiveCell.Row + 1, ActiveCell.Column).Select
			zmienna_losowa = Round(Rnd() * 1000, 0)
		Loop

End If

End Sub

Procedura wygląda niemal identycznie - jednak teraz sprawdzenie zawiera słowo Until, które wymaga zmiany również warunku na: zmienna > 750. Można to teraz zinterpretować jako: "wykonuj dopóki zmienna "zmienna_losowa" przekroczy 750" (co jest w rzeczy samej tożsame z poprzednim "dopóki "zmienna_losowa" mniejsza lub równa 750").

Praktycznie niemal każdy warunek można postawić używając obu powyższych sformułowań - czasami jednak (jeśli warunki byłyby rozłączne i byłoby ich więcej) zastosowanie konkretnego z nich będzie lepsze - wszystko zależy od sytuacji i stopnia skomplikowania wyrażenia logicznego.