Wewnątrz danej pętli FOR można umieścić instrukcję Exit For, która powoduje przerwanie całej pętli. Exit For winno być umieszczane wewnątrz instrukcji warunkowej IF, dzięki czemu pętla będzie wcześniej zakończona przy założeniu spełnienie określonego warunku.Przykłady:For i = 1 To 20
a = a + 3
Next inp = 1nk = 15krok = 2stop = 10For n = np To nk Step krok
Cells(n,1) = n
If n > stop Then Exit For
Next n
Wewnątrz danej pętli FOR można umieszczać (zagnieżdżać) kolejne pętle.
Przykład:
For I = 1 To 10
For J = 1 To 10
For K = 1 To 10
...
Next K
Next J
Next I
Sumowanie
Do zliczania i sumowania wykorzystuje się pomocnicze zmienne, które zmieniają swoje wartości w zależności od konkretnego zadania.Przykład nr 1. Należy policzyć ile kolejnych 10 liczb ciągu Fibonacciego jest mniejszych od 12ile = 0kryterium = 12For n = 1 To 10
If (n < 3) Then
Cells(n, 1) = n - 1
Else
Cells(n, 1) = Cells(n - 1, 1) + Cells(n - 2, 1)
End IfIf (Cells(n, 1) > kryterium) Then ile = ile + 1
Next nMsgBox ile & " liczb w podanym ciagu jest > od " & kryterium
Przykład nr 2. Należy obliczyć jaka jest średnia kolejnych 20 liczb parzystych.ileliczb = 20ile = 0suma = 0For n = 1 To ileliczb
liczba = 2 * n'Cells(n, 1) = liczba 'to polecenie jest niepotrzebne, bo nie musimy wyświetlaćile = ile + 1 'liczymy ile jest liczbsuma = suma + liczba 'dodajemy kolejne do sumy
Next nsrednia = suma / ileMsgBox "w podanym ciagu srednia wartosci wynosi " & sredniaZMIENNE TABLICOWE
Część I: wektoryWektory domyślnie są indeksowane od zera, ale istnieje możliwość ustalenia zakresu indeksowania. Zazwyczaj elementy wpisujemy w pętli, która winna być tak skonstruowana, aby nawigować po wybranych elementach (nie zawsze celowe jest wykorzystanie wszystkich elementów).Wartości możemy ale nie musimy wypisywać do komórek.Przykład nr 1Dim w1(9) As Single 'tworzymy wektor 10-elementowy, indeksowany od 0 do 9Dim w2(1 To 10) As Integer 'tworzymy wektor 10-elementowy, indeksowany od 1 do 10RandomizeFor i = 1 To 10
w1(i - 1) = Rnd() 'wpisanie liczb losowych do 10-ciu elementóww2(i) = 2 * i 'wpisanie kolejnych liczb parzystych do 10-ciu elementów
Next iPrzykład nr 2Dim wek(99) As Single 'stworzenie wektora 100-elementowegoRandomizeFor i = 0 To 49wek(i) = Rnd() 'do pierwszych 50-ciu wpisujemy liczby losowe <0; 1)wek(50 + i) = 2 * Rnd() 'do ostatnich 50-ciu wpisujemy liczby losowe <0; 2)If i < 10 Then Cells(i + 1, 1) = wek(i) 'wypisujemy tylko pierwszych 10 elementów' uwaga: i+1 przy Cells, bo i zaczyn się od zera, a nie ma zerowego wiersza!Next iPrzykład nr 3Dim tablica(1 To 20) As Integer ' tablica 20-elementowa, indeksowana od 1tablica(1) = 5 'wpisanie pierwszego elementutablica(2) = -3 'wpisanie drugiego elementutablica(3) = 2 * tablica(1) 'wpisanie trzeciego elementuMsgBox tablica(3) 'wyświetlenie bieżącej wartości trzeciego elementutablica(4) = Cells(1, 1) + 4 'wpisanie czwartego elementuFor k = 5 To 20 'wpisanie kolejnych piętnastu
tablica(k) = tablica(k - 1) + 4 + Cells(k - 4, 3)
Next nFor k = 1 To 20 'podwojenie każdego elementu tablicy
tablica(k) = 2 * tablica(k)
Next nCzęść II: tablice 2-wymiarowe (macierze)W przypadku tablic 2-wymiarowych mamy dodatkowy wymiar, zatem każdy element jest lokalizowany przez współrzędne wiersza i kolumny, analogicznie do macierzy. Operowanie na wszystkich elementach związane jest z zastosowanie pętli podwójnych. Podobnie jak w przypadku wektorów, elementy możemy (dla pewności) wypisywać w arkuszu, ale nie musimy.Przykład nr 4Dim m1(9, 9) As Integer ' tablica 10x10, 100 elementówDim m2(1 To 5, 1 To 5) As Single ' tablica 5x5, 25 elementówRandomizeFor i = 1 To 5
For j = 1 To 5
m2(i, j) = Rnd() 'do każdego elementu m2 wpisujemy liczbę losowa' w tym przypadku nie wypisujemy
Next j
Next i' pierwsza wersja indeksowaniaFor i = 1 To 10
For j = 1 To 10
m1(i - 1, j - 1) = i + j 'odejmujemy 1, bo indeksowane od zeraCells(i, j) = m1(i - 1, j - 1) 'od razu wypisujemy, począwszy od A1
Next i' druga wersja indeksowaniaFor i = 0 To 9
For j = 0 To 9
m1(i, j) = (i - 1) + (j - 1) 'tutaj nie odejmujemy, bo pętle idą od zeraCells(i + 1, j + 1) = m1(i, j) 'do Cells trzeba dodać jedynki, bo nie ma zerowego wiersza i kolumny
Next im1(4, 7) = m1(4, 7) * 3 + 7 'ten element modyfikujemym2(1, 4) = m1(1, 1) + m1(3, 1) - m2(4, 1) 'ten element także modyfikujemyFor i = 1 To 5
For j = 1 To 2
m2(i, j) = 0 'zerujemy elementy w pierwszych 2 kolumnach
Next i
CZYSZCZENIE
Do czyszczenia zawartości arkusza (danego zakresu) można wykorzystać jedno z dwóch poleceń, np. w postaci:
· Range("a1:g10").Clear
· Range("a1:g10").ClearContents
MOD
Operator (działanie) modulo wykorzystywane jest m.in. do uzyskania reszty z dzielenia danej liczby a przez liczbę b.Składnia:wynik = a Mod bPrzykłady:5 Mod 3 = 2 (1 x 3 i 2 reszty)12 Mod 4 = 0 (3 x 4 i 0 reszty)12 Mod 5 = 2 (2 x 5 i 2 reszty)12 Mod 8 = 4 (1 x 8 i 4 reszty)
DO LOOP
Pętla Do...Loop (w innych językach określana często jako 'while') powoduje powtarzanie określonego zestawu instrukcji w sytuacji, gdy warunek (pętli) jest spełniony (prawdziwy) lub dopóki warunek nie jest spełniony (w zależności od konstrukcji).Składnia:
Do [{While | Until} condition][statements][Exit Do][statements]
Loop
Lub
Do[statements][Exit Do][statements]
Loop [{While | Until} condition]
gdzie:
condition
Optional. Numeric expression or string expression that is True or False. If condition is Null , condition is treated as False.
statements
One or more statements that are repeated while, or until, condition is True.
Zaletą stosowania tej pętli jest fakt, że nie jest określana maksymalna liczba iteracji, jak to ma miejsce w przypadku pętli For. Nie jest także określana minimalna liczba - w określonych sytuacjach pętla może mieć tylko jedną iterację albo nie mieć żadnej. A więc, w zależności od spełnienia (bądź nie) danego warunku w kolejnym przebiegu pętli, wykonywana jest kolejna iteracja lub pętla jest zakończona. Podobnie, jak w przypadku pętli For, jest możliwość wyjścia z pętli w każdym momencie z wykorzystaniem dedykowanej instrukcji (Exit Do), związanej z wykorzystaniem instrukcji warunkowej (If).Konstrukcja pętli zależy od konkretnego zadania (celu). W pierwszym kroku należy wybrać, czy użyjemy Until bądź While. W drugim kroku należy zdecydować, czy instrukcja Until/While będzie obok Do czy obok Loop. Różne warianty powodują, że praktycznie mamy 4 warianty tej pętli, których znajomość jest obowiązkowa dla każdego studenta. Oto kilka przykładów (jak zwykle - pominięcie rzeczy oczywistych, m.in. deklaracji zmiennych):Liczba = 0Do While (Liczba < 100)
Liczba = InputBox("Wpisz liczbę całkowitą", "Podaj liczbę")
LoopDo
Loop While (Liczba < 100)Liczba = 0Do Until (Liczba >= 100)
Loop Until (Liczba >= 100)Warto zauważyć, że jeżeli warunek jest przy Do, wówczas musi być nadana wcześniej początkowa wartość zmiennej Liczba. W tym przypadku, gdy początkowa wartość nie spełnia warunku działania pętli, nie zostanie wykonany ani jeden przebieg. W związku z powyższym, 4 konstrukcje nie działają zupełnie tak samo. Różnica jest właśnie w zależności od tego, czy warunek umieszczony jest na początku, czy na końcu pętli.Nawiasy przy warunku mogą, ale nie muszą występować.
Przykład 1.Losowanie 2 różnych całkowitych liczb losowych.Randomizedol = 1gora = 3a = Int((gora - dol + 1) * Rnd() + dol)Lkrokow = 0Do
Lkrokow = Lkrokow + 1
b = Int((gora - dol + 1) * Rnd() + dol)
Loop While a = b 'powtarzaj losowanie, gdy b jest taka sama jak aMsgBox "pierwsza liczba: " & a & ", druga liczba: " & b & Chr(10) & "Liczba krokow: " & LkrokowPoniższa modyfikacja obrazuje (w komórkach arkusza), jakie liczby były losowane w poszczególnych krokach.Randomizedol = 1gora = 3a = Int((gora - dol + 1) * Rnd() + dol)Lkrokow = 0Do
Lkrokow = Lkrokow + 1b = Int((gora - dol + 1) * Rnd() + dol)Cells(Lkrokow, 1) = aCells(Lkrokow, 2) = b
Loop While a = b 'powtarzaj losowanie, gdy b jest taka sama jak aMsgBox "pierwsza liczba: " & a & ", druga liczba: " & b & Chr(10) & "Liczba krokow: " & LkrokowZadanie: Powyższy przykład napisać w 3 kolejnych wersjach. Można zmienić wartość zmiennej gora na z 3 na 2, aby było więcej losowań.Przykład 2.Danych jest 100 liczb losowych w kolejnych komórkach od A1 do A100, całkowitych liczb losowych z przedziału od -5 do 5 (uwaga: zadanie można też zrobić z wykorzystaniem pętli For zamiast Do, użytego w jednym fragmencie programu). Policzyć:
· ile jest liczb dodatnich
· jaka jest średnia wszystkich liczb
· ile jest liczb większych od średniej liczb z zakresu <-2; 2>
· jaki jest numer wiersza pierwszej liczby, której wartość jest równa 5
dol = -5gora = 5RandomizeLdodat = 0ile = 0suma = 0ile2 = 0 'do liczenia sredniej w przedzialesuma2 = 0' wiele rzeczy robimy na raz w jednej petli: generowanie, zliczanie, itd.For w = 1 To 100
ile = ile + 1a = Int((gora - dol + 1) * Rnd() + dol)suma = suma + a 'uwaga: tutaj dodajemy wartosc zm.a, a NIE Cells! Niby to samo, ale...If a >= -2 And a <= 2 Then
ile2 = ile2 + 1 'zliczamy tylko wybrane iteracjesuma2 = suma2 + 1 'sumujemy tylko wybrane elementy
End IfIf a > 0 Then Ldodat = Ldodat + 1 'tutaj sprawdzamy, czy liczba dodatniaCells(w, 1) = a 'tutaj wyswietalmy w komórce
Next wsr = suma / ile 'srednia wszystkich liczbsr2 = suma2 / ile2 'srednia warunkowa'kolejna petla - zliczamy ile elementow wiekszych od sr2Lsr = 0ilekom = 100For w = 1 To ilekom
If Cells(w, 1) > sr2 Then Lsr = Lsr + 1
Next w'tutaj przykladowa petla Do...Loop'mozna to samo zrobic z uzyciem For: nowej petli, albo wplesc w ktoras z poprzednichw = 0 'to samo w co wczesniej; przy okazji symulujemy dzialanie petli Forkoniec = 0Do
w = w + 1 'zwiekszenie wartosci, aby odczytac kolejna komorke (jak w przypadku For)a = Cells(w, 1) 'mozna wykorzystywac zmienne uzywane wczesniejIf a = gora Then 'zamiast gora mozna dac po prostu 5
nrPierw = wkoniec = 1 'dzieki temu petla bedzie zakonczona
End IfIf w = ilekom Then 'tutaj zabezpieczenie, w przypadku gdy nie ma takiej wartosci
nrPierw = 0 ' nie znaleziono takiej wartoscikoniec = 1 'dzieki temu petla bedzie zakonczona
End If
Loop While koniec = 0'prezentacja wynikow'znak Chr(10) - czyli kod Enter - powoduje przejscie do nastepnej linii'znak '_' na koncu linii umozliwia pisanie instrukcji w kolejne linijce (zwiekszenie czytelnosci kodu)MsgBox "Liczba dodatnich wartosci: " & Ldodat & Chr(10) & "Srednia wszystkich liczb: " _& sr & Chr(10) & "Liczba wartosci wiekszych od sredniej z zakresu <-2; 2>: " & Lsr _& Chr(10) & "Numer wiersza pierwszej liczby, której wartość jest równa 5: " & nrPierw
ZMIENNE PSEUDOLOSOWE
Do generowania liczb pseudolosowych wykorzystujemy polecenia:
Aby wygenerować liczbę z dowolnego przedziału (od a do b) należy zastosować przykładowe przekształcenia:
· Int((b - a + 1) * Rnd + a) - wylosowanie liczby całkowitej
· Int((b - a + 1) * Rnd) + a - także wylosowanie liczby całkowitej
· Int((b - a) * Rnd + a) - także wylosowanie liczby całkowitej
· Int((b - a) * Rnd) + a - także wylosowanie liczby całkowitej
· (b - a) * Rnd + a - wylosowanie liczby rzeczywistej
· (b - a + 1) * Rnd + a - także wylosowanie liczby rzeczywistej
Pierwsze cztery polecenia różnią się tym, jaka część jest zaokrąglona. Sposób zaokrąglenia wpływa na to, czy liczba losowana jest z przedziału. Możemy mieć <a; b> czy <a; b), (a; b) czy (a; b>. Przykład nr 1:Randomizeliczba = Rnd()MsgBox liczbaPrzykład nr 2:RandomizeFor i = 1 To 10
liczba = Rnd()Cells(i, 1) = liczba
Next iPrzykład nr 3:Randomizepoczatek = 1koniec = 5liczba1 = Int((koniec - poczatek) * Rnd() + poczatek)MsgBox liczba1Przykład nr 4:Randomizepoczatek = 1koniec = 10losowa = Rnd() 'losowana jest tylko jedna liczba, aby mozna bylo porownac' program nalezy uruchomic kilka razy i porownac wynikiliczba1 = Int((koniec - poczatek) * losowa + poczatek)liczba2 = Int((koniec - poczatek) * losowa) + poczatekliczba3 = Int((koniec - poczatek + 1) * losowa + poczatek)liczba4 = Int((koniec - poczatek + 1) * losowa) + poczatekMsgBox "Wynik: 1) " & liczba1 & ", 2) " & liczba2 & ", 3) " & liczba3 & ", 4) " & liczba1ZaokrąglanieDo zaokrąglania liczb do najbliższej liczby całkowitej wykorzystuje się funkcje Int lub Fix, zgodnie z poniższymi przykładami:
· x = Int(99.8) 'zwraca 99
· x = Fix(...
Kaacha91