Komunikacja z arkuszem. Iteracje. Funkcje. 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; 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> Sub a() Dim x As Byte petla: x = InputBox("Podaj liczbę:") If x <> 0 Then GoTo petla Else MsgBox ("Koniec programu!") End If End Sub
Abc = <zwracana do komórki wartość funkcji> 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 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”;