Programowanie w VBA Komunikacja z użytkownikiem. Komunikacja z arkuszem.

Download Report

Transcript Programowanie w VBA Komunikacja z użytkownikiem. Komunikacja z arkuszem.

Programowanie
w 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
– 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
n
i


i 1
n
i


i 1
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