Programowanie w VBA Komunikacja z uytkownikiem Komunikacja z
Programowanie w VBA Komunikacja z użytkownikiem. Komunikacja z arkuszem. Iteracje. Funkcje.
Komunikacja z użytkownikiem (w procedurach) • Msg. Box(<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: vb. Ok. Only – klawisz Ok; vb. Ok. Cancel – klawisze Ok i Cancel; vb. Yes. No – klawisze Yes i No; vb. Critical – ikonka krytyczna; vb. Question – ikonka pytania; vb. Exclamation – ikonka wykrzyknika; vb. Information – ikonka informacji; wpisanie np. : vb. Ok. Cancel + vb. Question da dwa przyciski (Ok i Cancel) i ikonke znaku zapytania
Msg. Box ("Pierwiastek równania x = " & x 1) • st = Msg. Box("Czy liczymy dalej? ", vb. Yes. No. Cancel + vb. Question, "Decyzja") • If st = vb. No Then Exit Sub
Prośba do użytkownika • Input. Box – 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; • Input. Box(<tekst>, <ew. tytuł formularza>, <ew. domyślny tekst wpisany w formularz>) Dim dana As Variant dana = Input. Box(„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 = Input. Box(”Podaj a”) b = Input. Box(”Podaj b”) c = Input. Box(”Podaj c”) If a <> 0 Then delta = b^2 – 4*a*c Msg. Box (”Delta równania kwadratowego wynosi: ” & delta) Else Msg. Box (”Wspolczynnik a musi być rozny od 0!”) End If End Sub
Zadania – 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 • Active. Cell – 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 • Active. Cell. Value – zwraca wartość tej komórki lub umożliwia przypisanie jej wartości: Dim dana As Variant dana = Active. Cell. Value = dana * 2 • Można też używać znanych z rejestracji makr metod związanych z formatowaniem: Active. Cell. Font, Active. Cell. Font. Size, itd. • Active. Cell. Row – zwraca numer wiersza zaznaczonej komórki; • Active. Cell. 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("A 1: B 2") • Range("A 1: B 2"). Rows. Count • Range("A 1: B 2"). Select • Range("A 1: B 2"). Copy • Range("A 1: B 2"). 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 A 1 do B 1, 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 Msg. Box("bum") Loop Do Msg. Box("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 • Go. To <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 = Input. Box("Podaj liczbę: ") If x <> 0 Then Go. To petla Else Msg. Box ("Koniec programu!") End If End Sub
- Slides: 23