260 likes | 412 Views
Programowanie w VBA. Komunikacja z arkuszem. Iteracje. Funkcje. 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;
E N D
Programowaniew VBA Komunikacja z arkuszem. Iteracje. Funkcje.
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 While <wyrażenie logiczne> <instrukcje jeśli wyrażenie = prawda> Wend 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ą.
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
Funkcje • Funkcja to podstawowy sposób wykonywania operacji na komórkach w MS Excel; • Funkcja przenosi wartość przez swoją nazwę, a więc funkcja Abc wewnątrz swojego kodu musi zawierać instrukcję: Abc = <zwracana do komórki wartość funkcji>
Funkcja jednej i więcej zmiennych • Pobiera argument(y), które są potrzebne do obliczenia i zwrócenia jej wartości; • Funkcja powinna mieć przypisany typ, wtedy trudniej o błąd; Function T_absolutna(T_Celsjusz) As Single T_absolutna = T_Celsjusz + 273.15 End Function
Funkcja stała • Zwraca wartość stałą, np. funkcja: Function Avogadro() Avogadro = 6.022E+23 End Function Po wpisaniu do komórki „=Avogadro()” otrzymamy wynik: „6.022E+23”
Idiotoodporność • Idiotoodporność (foolproof)! – warto stosować, abyśmy sami mogli stwierdzić, gdzie leży błąd w programie; • Na czym polega? Należy przewidzieć wszystkie potencjalne błędy i możliwości, jakie mogą wystąpić przy przyjmowaniu danych wejściowych do programu. Każdą potencjalną opcję sprawdzać instrukcją warunkową i w przypadku wystąpienia błędu nie dopuszczać do jego wystąpienia, tylko odsyłać, na przykład, do wypisania własnego tekstu informującego o błędzie i z czego on wynika; • Aby móc używać tej „techniki”, trzeba możliwie szeroko definiować zmienne wejściowe – np. poprzez typ Variant, a w miarę upewniania się co do prawidłowości danej zawartej w takiej zmiennej (przez komendy typu Is...) – przenosić ją do kolejnych bardziej zawężonych typów i operacji wykonywanych na niej.
Funkcje Przydatne komendy: • IsNumeric(<zmienna>) – zwraca prawdę, jeśli zmienna jest liczbą (jeśli jest, można zmienną wsadzić do typu liczbowego); • IsArray(<zmienna>) – prawda, jeśli zmienna jest tablicą (wektorem); • IsEmpty(<komórka>) – prawda, jeśli komórka jest pusta (zmienna typu Range); • IsDate (<zmienna>) – prawda, jeśli zmienna może być zapisana jako data; • Len(<string>) – zwraca długość ciągu znaków; • Rnd() – zwraca liczbę losową z zakresu <0;1)
Przykład Function przyklad(zakres As Variant) As String Dim tablica As Range If IsArray(zakres) Then Set tablica = zakres przyklad ="Liczba wierszy: " & tablica.rows.count End If End Function
Przykład Function przyklad(liczba As Variant) As String If IsNumeric(liczba) Then If liczba = liczba \ 1 Then przyklad = "calkowita" Else przyklad = "niecalkowita" End If End If End Function
Zadania do domu Napisz funkcję: • Obliczającą sumę liczb od 1 do n (gdzie n jest argumentem funkcji); • Obliczającą ciśnienie jednego mola gazu doskonałego na podstawie temperatury i objętości (dwa argumenty); • Obliczającą n-ty element ciągu Fibonaciego; Napisz program: • Wypełniający zakres komórek (kolejne komórki w zakresie rzędami) kolejnymi liczbami zaczynając od 1 używając pętli typu „for each element in zakres”; • Wypełniający zakres komórek (kolejne komórki w zakresie rzędami) kolejnymi liczbami zaczynając od 1 używając pętli typu „For i = 1 to zakres.rows.count”;