Moje doświadczenia z Excelem, Accesem i programowaniem w VBA

Wpisy z tagiem: pętla

czwartek, 23 stycznia 2014

Przykład prostego makra losującego 6 liczb z 49:

Public Sub Lotto()
'Makro losujące 6 cyfr z 49
Dim i As Integer
Dim Liczba As Integer

For i = 1 To 6
    Randomize
    Liczba = Int(Rnd * (49) + 1)
    Range("A" & i) = Liczba
Next i
End Sub


Makro losuje liczby i wpisuje je do kolejnych wierszy kolumny A.

Wynik działania widoczny jest tu (każde uruchomienie makra powoduje inne wyniki):

losowanie w Excelu

Procedura jest bardzo prosta i ograniczona. Przede wszystkim nie ma sprawdzania powtarzalności liczb, więc nie gwarantuje unikalności.
W samym kodzie zostały wykorzystane funkcje Randomize oraz pętla For ... Next.

 


 

 

 

 

 

Kurs Excel - zaawansowane funkcje i formuły



środa, 27 kwietnia 2011

Matematyka, szczególnie ta nauczana na różnych etapach edukacji, ma swoje prawa i zwyczaje. Dobrym przykładem może być tu zapis liczb niewymiernych. Co z tego, że na kalkulatorze możemy wyznaczyć wartość √2 z dokładnością do wielu miejsc po przecinku? Zawsze będzie to tylko przybliżona wartość. Rozwiązując zadania - prawidłowy wynik często musi być więc liczbą niewymierną. Jeżeli pod pierwiastkiem mamy np. liczbę 12 - to w prosty sposób widzimy, ze jest to po prostu 2√3. Jeśli jednak mamy np. 4050? Moze być to już trudniejsze.
Może więc warto zrobić sobie mały programik, który za nas to wyliczy?

Jedna z propozycji wygląda tak:

Public Function LiczbaNiewymierna(JakaLiczba As Integer)
Dim PrzedPierwiastkiem
Dim PodPierwiastkiem
Dim Wynik
Dim MojaLiczba

PrzedPierwiastkiem = 1
PodPierwiastkiem = JakaLiczba
MojaLiczba = JakaLiczba
Wynik = 1

Do While Wynik <> 0
Wynik = Sprawdzliczbe(PodPierwiastkiem)
If Wynik > 0 Then
   PrzedPierwiastkiem = PrzedPierwiastkiem * Sqr(Wynik)
   PodPierwiastkiem = PodPierwiastkiem / Wynik
End If
Loop
LiczbaNiewymierna = PrzedPierwiastkiem & " V " & PodPierwiastkiem

End Function

-------------------------------------------------------------------------

Public Function Sprawdzliczbe(AnalizowanaLiczba)
Dim i As Integer
Dim CzyInt
Dim a
Dim b


For i = AnalizowanaLiczba To 2 Step -1
    If AnalizowanaLiczba Mod i = 0 Then
       CzyInt = Sqr(i) / (Int(Sqr(i)))
       If CzyInt = 1 Then
          Sprawdzliczbe = i
          Exit Function
        End If
    End If
Next
Sprawdzliczbe = 0

End Function

Funkcja SprawdzLiczbe jest tu podrzędną. Wprowadzony argument AnalizowanaLiczba jest dzielony przez kolejne liczby (malejąco o 1 aż do wartości równej 2). Jeżeli chwilowa wartość zmiennej i jest podzielnikiem AnalizowanejLiczby - następuje sprawdzenie - czy jej pierwiastek kwadratowy jest liczbą całkowitą (iloraz pierwiastka i cześci całkowitej z pierwiastka jest równy 1). Jeżeli znajdzie się taka liczba - następuje natychmiastowe wyjście z funkcji, a sama wartość funkcji jest równa tej liczbie.
Następnie zmienna PrzedPierwiastkiem zostaje pomnożona przez pierwiastek tej liczby, a zmienna PodPierwiastkiem - podzielona przez samą liczbę. I ponownie analizujemy to, co pod pierwiastkiem. Jeżeli finalnie PodPierwiastkiem nie da się już rozłożyć na 2 czynniki, z kórych jeden jest kwadratem liczby naturalnej - funkcja SprawdzLiczbe przyjmie wartość 0. Jest to warunek wyjścia z pętli w funkcji LiczbaNiewymierna i wyniku ostatecznego.

W praktyce wyglada to tak:

Liczba niewymierna

Wstawiając do komórki A1 wartość - w komórce C1 otrzymujemy pierwiastek z niej w zapisie liczby niewymiernej. komórca C1 - to funkcja użytkownika LiczbaNiewymierna. 
I już - o to chodziło, prawda? 

 

wtorek, 19 kwietnia 2011

W ramach pisania własnego kodu VBA bardzo często konieczne jest wykorzystanie cyklicznego powtarzania jakiegoś fragmentu kodu.
O pętli For ... Next pisałam tu:
Pętla For...Next
Petla For...Next bardziej rozbudowana
Trudno ją jednak zastosować do wyrażeń nieregularnych. Do tego celu nadaje się pętla Do...Loop.

Jej struktura wygląda tak:

Do While [jaki waunek]           'warunek wejścia do pęli
   [wykonywana instrukcja]       'ciąg programu do cyklicznego powtarzania
  Exit Do                                    'warunek natychmiastowego opuszczenia pętli
Loop                                          'koniec pętli

Tyle teorii. Praktyczną przydatność zastosowania pętli najlepiej sprawdzić na konkretnym przykładzie i to właśnie będzie tematem następnej notki.

A może warto zajrzeć do książki? Na przykład tu:

wtorek, 07 września 2010

Pętla For Each ...Next jest specyficznym rodzajem pętli For ...Next, o której pisałam wcześniej tu:
Pętla VBA: For ...Next
Pętla For ... Next bardziej rozbudowana
Działa podobnie, ale w stosunku do kolekcji i obiektów
(zob. VBA obiekty Excela)
W przypadku obiektu Range, będącego kolekcją komórek - pętla działa w ramach komórek zaznaczonego obszaru. Przechodząc przez kolejne komórki obszaru - możemy je odczytywać, zapisywać czy zmieniać formatowanie.

Najlepiej pokazać to na prostym przykładzie. Załóżmy, że mamy arkusz z liczbami w poszczególnych komórkach:

arkusz Excela

Naszym zadaniem jest pomnożenie każdej komóki przez 2. Jak będzie wyglądał kod takiej procedury?


Public Sub Pomnoz()
Dim Komorka As Range    'zmienna określająca pojedynczą komórkę obszaru

For Each Komorka In Range("A2:A10")
    Komorka.Value = 2 * Komorka.Value
Next

End Sub

Wartość zmiennej Komorka za każdym kolejny przejściem pętli odnosi się do kolejnych komórek Excela z zaznaczonego obszaru Range - w tym przypadku A2 do A10. Efekt końcowy:

arkusz Excela

Oczywiście w tej pętli można stosować wszystkie metody i właściwości związane z dana kolekcją obiektów. Dla obiektu Range są one opisane tu:
Obiekty VBA - Range

 

czwartek, 26 sierpnia 2010

W poprzedniej notce
Pętle VBA: For...Next
opisywałam podstawy zastosowania pętli języka VBA. W ramach uzupełnienia warto jeszcze tylko wspomnieć, że pętlę For...Next można bez problemu zagłębiać tzn. w ramach jednej pętli stosować kolejne. Zapis ogólny takiego zagnieżdżenia wyglada przykładowo tak:

For i=1 to n Step 1
      [seria formuł/poleceń]
     For j=1 to m Step 10
          [seria formuł/poleceń]
     Next j
Next i 

Przy pisaniu własnej funkcji czy procedury istotna jest też możliwość opuszczenia pętli po spełnieniu określonego warunku. Stosujemy tu słowa kluczowe Exit For.

For i=1 to n Step 1
      [seria formuł/poleceń]
      If [warunek wyjścia] Then Exit For
Next i 

Po spełnieniu warunku wyjścia, niezależnie od stanu licznika - następuje natychmiastowe opuszczenie pętli. Przydaje się często.

Tagi: pętla
11:27, marzatela , Funkcje VBA
Link Komentarze (7) »
wtorek, 24 sierpnia 2010

Pętla For...Next jest bardzo użytecznym narzędziem, często wykorzystywanym w bardziej złożonych procedurach. Jej składnia wygląda następująco:
For Licznik=Początek To Koniec Step Krok
          [instrukcje do wykonania w ramach pętli]
Next Początek

Poszczególne argumenty to:
Początek - start Licznika, od którego zaczynamy wykonywani
e pętli
Koniec - ostatni wyraz Licznika
Step - argument opcjonalny określający wartość o jaką zostanie zwiększony Licznik. Pominięcie jest równoznaczne z przyjęciem wartości 1. 

Public Function MojaSilnia(JakaLiczba As Integer) As Long
Dim k As Integer

MojaSilnia=1
For
k = 2 To JakaLiczba Step 1

    MojaSilnia = MojaSilnia * k
Next k

End Function

Powyższy przykład oblicza wartość silni zewnętrznego argumentu JakaLiczba. W ramach pętli powtarzane jest mnożenie zmiennej MojaSilnia i wartości k.  

Identyczny efekt uzyskamy także "odwracając" Licznik z rosnącego na malejący.

 

Public Function MojaSilnia(JakaLiczba As Integer) As Long
Dim k As Integer

MojaSilnia=1
For
k = JakaLiczba To 1 Step -1

MojaSilnia = MojaSilnia * k
Next k

End Function

W tym przypadku krok licznik jest równy -1. Efekt końcowy - bez zmian.

Tagi: pętla
10:42, marzatela , Funkcje VBA
Link Dodaj komentarz »
| < Listopad 2017 > |
Pn Wt Śr Cz Pt So N
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      


Książki warte polecenia
zobacz szczegóły...


A tu oferta na dziś:





ministat liczniki.org



Napisz do mnie!