230 likes | 524 Views
Programowanie w VBA. Komunikacja z użytkownikiem. Komunikacja z arkuszem. Iteracje. Funkcje. Komunikacja z użytkownikiem (w procedurach).
E N D
Programowaniew VBA Komunikacja z użytkownikiem. Komunikacja z arkuszem. Iteracje. Funkcje.
Komunikacja z użytkownikiem(w procedurach) • MsgBox(<tekst>,<przyciski>, <tytul>) – wyświetla komunikat <tekst> w okienku dialogowym o tytule <tytul>, do wyboru <przyciski> dają możliwość ustalenia przycisków i/lub symbolu pojawiającego się obok <tekstu>; • <przyciski> wpisuje się „sumując” teksty oznaczające klawisze i symbole, domyślnie jest tylko klawisz Ok i brak ikonki. Do wyboru jest, między innymi: vbOkOnly – klawisz Ok; vbOkCancel – klawisze Ok i Cancel; vbYesNo – klawisze Yes i No; vbCritical – ikonka krytyczna; vbQuestion – ikonka pytania; vbExclamation – ikonka wykrzyknika; vbInformation – ikonka informacji; wpisanie np.: vbOkCancel + vbQuestion da dwa przyciski (Ok i Cancel) i ikonke znaku zapytania
MsgBox MsgBox ("Pierwiastek równania x = " & x1) • st = MsgBox("Czy liczymy dalej?", vbYesNoCancel + vbQuestion, "Decyzja") • If st = vbNo Then Exit Sub
Prośba do użytkownika • InputBox – uruchomienie formularza wpisania danych (dowolnych, także zakresu komórek), których można użyć dalej w programie, funkcja zwraca wartość wpisaną przez użytkownika; • InputBox(<tekst>, <ew. tytuł formularza>, <ew. domyślny tekst wpisany w formularz>) Dim dana As Variant dana = InputBox(„Proszę wpisać dane”, „Potrzebne dane”, „Tu wpisz dane”).
Przykład Sub delta Dim a As Double Dim b As Double Dim c As Double Dim delta As Double a = InputBox(”Podaj a”) b = InputBox(”Podaj b”) c = InputBox(”Podaj c”) If a <> 0 Then delta = b^2 – 4*a*c MsgBox (”Delta równania kwadratowego wynosi: ” & delta) Else MsgBox (”Wspolczynnik a musi być rozny od 0!”) End If End Sub
Zadania (do dokończenia w domu, np. na kartce) • Posortowanie 3 danych liczb a, b, c w porządku malejącym; • Zamiana liczby punktów uzyskanych w czasie semestru na oceny; • Rozwiązanie równania kwadratowego z wykorzystaniem procedury rozwiązania równania liniowego w przypadku a = 0; Testujemy na własnych przykładach: wymyślonych odpowiednio do zadania – zarówno takich, żeby działało, jak i żeby nie działało – sprawdzenie, czy zostanie podany komunikat o błędzie.
Komunikacja z arkuszem • ActiveCell – oznacza aktualnie wybraną komórkę, jeśli wybrany jest zakres, to jest to komórka od której zaczęto zaznaczać; • Selection – wybrany zakres komórek; • Cells – bezpośrednie odwołanie do komórek adresując bezwzględnie (czyli niezależnie od zaznaczenia); Adresowanie jak w macierzach: A(1,2) – 1.wiersz, 2. kolumna
Komunikacja z arkuszem - Aktualnie zaznaczona komórka • ActiveCell.Value – zwraca wartość tej komórki lub umożliwia przypisanie jej wartości: Dim dana As Variant dana = ActiveCell.Value ActiveCell.Value = dana * 2 • Można też używać znanych z rejestracji makr metod związanych z formatowaniem: ActiveCell.Font, ActiveCell.FontSize, itd. • ActiveCell.Row – zwraca numer wiersza zaznaczonej komórki; • ActiveCell.Column – zwraca numer (liczbowy) kolumny zaznaczonej komórki;
Komunikacja z arkuszem - Aktualnie zaznaczony zakres • Selection.Rows.Count – zwraca ilość wierszy zaznaczenia; • Selection.Columns.Count – zwraca ilość kolumn zaznaczenia;
Komunikacja z arkuszem – Zmienna - zakres Dim zmienna as Range Set zmienna = Selection • zmienna.Rows.Count – zwraca ilość wierszy zakresu przechowywanego w zmiennej; • zmienna.Columns.Count – zwraca ilość kolumn zakresu przechowywanego w zmiennej; • zmienna.Row – zwraca numer pierwszego wiersza zakresu ze zmiennej; • zmienna.Column – zwraca numer pierwszej kolumny zmiennej; • Ostatni wiersz zakresu: zmienna.Row + zmienna.Rows.Count - 1
Komunikacja z arkuszem –Zakres komórek Range("A1:B2") • Range("A1:B2").Rows.Count • Range("A1:B2").Select • Range("A1:B2").Copy • Range("A1:B2").Interior.Color = 2
Komunikacja z arkuszem- bezwzględne odwołanie • Cells(<wiersz>,<kolumna>) – odwołanie do komórki w arkuszu (domyślnie jest to wartość); • Cells(w,k).Value – zarówno można przypisać wartość, jak i użyć do przypisania(w procedurach); • Inne metody działają tak jak w poprzednich przypadkach (np. formatowanie jakiejś komórki); dana = Cells(1,1).Value Cells(1,2).Value = dana (wynik: przepisanie zawartości komórki A1 do B1, bez znaczenia, jaka komórka jest zaznaczona)
Zadania Napisz program: • Obliczający liczbę komórek w zakresie zaznaczonym aktualnie w arkuszu (mnożenie liczby wierszy przez liczbę kolumn); • Wpisujący podaną przez użytkownika (inputbox) liczbę x w komórkę o koordynatach (x,x);
Iteracje dla n = 3
Iteracje • Jest to powtarzanie tej samej instrukcji (bloku instrukcji) w pętli; • Pętla musi mieć podaną ilość powtórzeń, niebezpośrednio – tworzy się ją przez zakres od liczby do liczby (przy rozpoczęciu sprawdzany jest warunek wykonania); For <licznik> = <pocz> To <koniec> Step <krok> <instrukcje> Next <licznik> • Człon Step jest opcjonalny; • Komenda „For i = 1 To 5” powtórzy następującą po niej (aż do komendy Next) sekwencję instrukcji 5 razy; • Komenda „For i = 0 To 10 Step 5” powtórzy czynności 3 razy (0,5,10), a po zakończeniu pętli i=15 (wartość ta nie spełniła warunku, więc pętla zakończyła działanie;
Iteracje • Wykonywanie pętli można przerwać z wewnątrz instrukcją Exit For – wywoływaną na przykład przez instrukcję warunkową; • <początek>, <koniec> i <krok> mogą być zmiennymi, nawet zmienianymi w trakcie wykonywania pętli; • Stan zmiennych określających rozpoczęcie powtarzania sprawdzane jest na początku każdej pętli; • Komenda Next dodaje liczbę <krok> do zmiennej <licznik> (inkrementacja zmiennej); • <początek> może być większy od <koniec>, ale albo musi być to rozwiązane w trakcie pętli, albo <krok> musi mieć wartość ujemną;
Iteracje • Po co takie kombinacje? Żeby nie trzeba było robić skomplikowanych przekształceń i używać bezpośrednio danych z zadania (na przykład) – ogólnie – w celu ułatwienia sobie życia; • Pętla w pętli z dobrze dobranymi zakresami to idealny sposób na poradzenie sobie z operacjami na dowolnych macierzach, tablicach, itd.
Iteracje • Inna składni iteracji specjalnie dla tablic: For Each <element> In <tablica> <blok instrukcji> Next • <element> i <tablica> muszą być typu Variant; • zmienna <element> może być używana w bloku instrukcji wewnątrz pętli i w każdej iteracji zawiera w sobie zawartość kolejnego elementu wektora/tablicy <tablica>;
Inne iteracje Do Until <wyrażenie logiczne> <instrukcje wykonywane póki wyrażenie = fałsz> Loop (Until <wyrażenie logiczne>) Do While <wyrażenie logiczne> <instrukcje wykonywane póki wyrażenie = prawda> Loop (While <wyrażenie logiczne>) Umiejscowienie warunku decyduje czy warunek jest sprawdzany po każdej pętli czy przed nią – ma to znaczenie zwłaszcza w pierwszej iteracji (gdy pierwsze sprawdzenie warunku jest pod koniec pętli)
Inne iteracje i=5 Do While i<5 MsgBox("bum") Loop Do MsgBox("brzdek") Loop While i<5
Zadania Napisz programy: • Obliczającą sumę liczb naturalnych od 1 do n (n podane przez użytkownika); • Wypisującą dzielniki liczby podanej przez użytkownika;
Zadania i = i +1 – kumulowanie 1 do i (dopisanie 1, bez usunięcia dotychczasowej wartości i); suma = …? - też nie chcemy, żeby znikła dotychczasowa wartość, ale żeby dodawał kolejne wartości do już istniejącej sumy wcześniejszych.
Instrukcja skoku • GoTo <etykieta> • Gdzies w kodzie: <etykieta>: <Instrukcje> • Może służyć jako pętla (skok do wcześniejszego miejsca) lub do ominięcia kodu (do dalszego). Ma sens tylko przy warunkowości wykonania (podobnie jak Exit For/Exit Sub/Exit Do Sub abc() Dim x As Byte petla: x = InputBox("Podaj liczbę:") If x <> 0 Then GoTo petla Else MsgBox ("Koniec programu!") End If End Sub