Moje doświadczenia z Excelem, Accesem i programowaniem w VBA

Wpisy z tagiem: funkcje użytkownika

środa, 27 kwietnia 2011

Matematyka, szczególnie ta nauczana na różnych etapach edukacji, ma swoje prawa i zwyczaje. Dobrym przykładem może być tu zapis liczb niewymiernych. Co z tego, że na kalkulatorze możemy wyznaczyć wartość √2 z dokładnością do wielu miejsc po przecinku? Zawsze będzie to tylko przybliżona wartość. Rozwiązując zadania - prawidłowy wynik często musi być więc liczbą niewymierną. Jeżeli pod pierwiastkiem mamy np. liczbę 12 - to w prosty sposób widzimy, ze jest to po prostu 2√3. Jeśli jednak mamy np. 4050? Moze być to już trudniejsze.
Może więc warto zrobić sobie mały programik, który za nas to wyliczy?

Jedna z propozycji wygląda tak:

Public Function LiczbaNiewymierna(JakaLiczba As Integer)
Dim PrzedPierwiastkiem
Dim PodPierwiastkiem
Dim Wynik
Dim MojaLiczba

PrzedPierwiastkiem = 1
PodPierwiastkiem = JakaLiczba
MojaLiczba = JakaLiczba
Wynik = 1

Do While Wynik <> 0
Wynik = Sprawdzliczbe(PodPierwiastkiem)
If Wynik > 0 Then
   PrzedPierwiastkiem = PrzedPierwiastkiem * Sqr(Wynik)
   PodPierwiastkiem = PodPierwiastkiem / Wynik
End If
Loop
LiczbaNiewymierna = PrzedPierwiastkiem & " V " & PodPierwiastkiem

End Function

-------------------------------------------------------------------------

Public Function Sprawdzliczbe(AnalizowanaLiczba)
Dim i As Integer
Dim CzyInt
Dim a
Dim b


For i = AnalizowanaLiczba To 2 Step -1
    If AnalizowanaLiczba Mod i = 0 Then
       CzyInt = Sqr(i) / (Int(Sqr(i)))
       If CzyInt = 1 Then
          Sprawdzliczbe = i
          Exit Function
        End If
    End If
Next
Sprawdzliczbe = 0

End Function

Funkcja SprawdzLiczbe jest tu podrzędną. Wprowadzony argument AnalizowanaLiczba jest dzielony przez kolejne liczby (malejąco o 1 aż do wartości równej 2). Jeżeli chwilowa wartość zmiennej i jest podzielnikiem AnalizowanejLiczby - następuje sprawdzenie - czy jej pierwiastek kwadratowy jest liczbą całkowitą (iloraz pierwiastka i cześci całkowitej z pierwiastka jest równy 1). Jeżeli znajdzie się taka liczba - następuje natychmiastowe wyjście z funkcji, a sama wartość funkcji jest równa tej liczbie.
Następnie zmienna PrzedPierwiastkiem zostaje pomnożona przez pierwiastek tej liczby, a zmienna PodPierwiastkiem - podzielona przez samą liczbę. I ponownie analizujemy to, co pod pierwiastkiem. Jeżeli finalnie PodPierwiastkiem nie da się już rozłożyć na 2 czynniki, z kórych jeden jest kwadratem liczby naturalnej - funkcja SprawdzLiczbe przyjmie wartość 0. Jest to warunek wyjścia z pętli w funkcji LiczbaNiewymierna i wyniku ostatecznego.

W praktyce wyglada to tak:

Liczba niewymierna

Wstawiając do komórki A1 wartość - w komórce C1 otrzymujemy pierwiastek z niej w zapisie liczby niewymiernej. komórca C1 - to funkcja użytkownika LiczbaNiewymierna. 
I już - o to chodziło, prawda? 

 

sobota, 20 marca 2010

Funkcja OR  w VBA jest odpowiednikiem Excelowej funkcji LUB.

Przykładowy zapis procedury z użyciem funkcji LUB:

Public Function MojaFunkcjaLUB (Warunek_1 As Boolean, Warunek_2 As Boolean) As Boolean
MojaFunkcjaLUB = Warunek_1 OR Warunek_2
End Function

Argumenty oraz wartość funkcji są typu Boolean.

piątek, 19 marca 2010

Funkcja AND  w VBA jest odpowiednikiem Excelowej funkcji ORAZ.  Zasada jej działania - dokładnie taka sama.

Przykładowy zapis procedury z użyciem funkcji AND:

Public Function MojaFunkcjaORAZ(Warunek_1 As Boolean, Warunek_2 As Boolean) As Boolean
MojaFunkcjaORAZ = Warunek_1 And Warunek_2
End Function


Argumenty oraz wartość funkcji są typu Boolean.

środa, 17 marca 2010

Funkcja Select Case jest tak naprawdę szczególnym przypadkiem funkcji If.. Then… (pisałam o oniej tu: Funkcja VBA: If...Then....)
W prosty sposób może zastąpić ją w bardziej złożonychprzypadkach . Zamiast kilkakrotnego zagnieżdżenia – mamy prostą funkcję, w której może wystąpić wiele różnych warunków decydujących o wyniku funkcji.

Przykładowy kod wygląda tak:

Public Function MojSelect(JakaLiczba As Single) As String

Select Case JakaLiczba 
  Case Is < 0                             'dla wartości<0  
      MojSelect = "ujemna”
  Case 0                                    'dla równej zero  
     MojSelect = "zero”
  Case Else                               'dla wszystkich pozostałych
    MojSelect = "dodatnia"
End Select

End Function

Podstawowy schemat działania funkcji polega na przypisaniu wartości argumentu JakaLiczba  odpowiadajacej mu wartości funkcji MojSelect (oczywiście w tym przypadku - to moja własna nazwa, każdy może to użyć własnych).
Słowo kluczowe Case Else oznacza warunek alternatywy dla wszystkich przypadków nie uwzględnionych w warunkach szczegółowych. 
A sama funkcja - często się przydaje jako fragment większego kodu. Warto ją zapamiętac.

poniedziałek, 15 marca 2010

Funkcja If... then... w kodzie VBA jest odpowiednikiem funkcji Jeżeli.. to... w Excelu. Pisałam oniej wcześniej w notce:
Funkcje logiczne Excela: Jeżeli... to...
Jak zapisać tamten przykład z użyciem funkcji VBA?

Public Function JakiZnakLiczby(PodanaLiczba As Single) As String
If PodanaLiczba < 0 Then JakiZnakLiczby = "-" Else JakiZnakLiczby = "+"
End Function

Po słowie kluczowym If występuje warunek, na który odpowiedź jest typu Prawda - Fałsz. Instrukcja do wykonania w przypadku, gdy zdanie to jest logicznie prawdziwe - następuje po słowie Then. Po słowie kluczowym Else - wpisujemy kod do wykonania dla fałszu.

Przedstawiony przykład możemy nieco rozbudować:

 Public Function JakiZnakLiczby(PodanaLiczba As Single) As String
 If PodanaLiczba < 0 Then            'Warunek 1: Czy jest mniejsza od zera?
    JakiZnakLiczby = "ujemna"        'Wynik= ujemna
 Else
     If PodanaLiczba = 0 Then        'Warunek 2: Czy równa zero?
        JakiZnakLiczby = "zero"        'Wynik= zero
       Else
        JakiZnakLiczby = "dodatnia"          'Wynik= dodatnia
     End If                                            'Koniec bloku warunku 2
 End If                                                'Koniec bloku warunku 1
End Function

Koniec bloku każdego z warunków jest wyznaczany przez słowa kluczowe
End If.

Jeśli są pytania - to proszę o komentarz.

niedziela, 14 marca 2010

Przy prostych funkcjach pisanych w VBA - nie ma potrzeby kontroli wartości pośrednich. Potrzeba taka może się jednak pojawić gdy funkcja jest bardziej skomplikowana, a chcemy mieć pewność, że wszystko działa prawidłowo - dobrze jest móc podejrzeć co się dzieje w trakcie wykonywania kodu. Metod jest kilka. W tej notce opiszę tewn, który sama najczęściej stosuję przy analizie kodu. 
Jako przykład może posłużyć funkcja PodwojonaSumaKomorek opisana tu:
Piszemy funkcję w VBA...
W edytorze VBA wstawiamy punkt przerwania w pierwszej linii programu (zaraz po bloku deklaracji zmiennych). Jak? Najszybciej poprzez kliknięcie na pasku obramowania z lewej strony tej linii. Punkt przerwania zostanie zaznaczony czerwoną kropką.

wstawianie punktu przerwania

W trakcie wykonywania kodu - edytor zatrzyma funkcję w tej linii. Samą funkcję wywołujemy w arkuszu Excela.

wstawianie punktu przerwania

Komórki A1 i B1 mają odpowiednio wartość 3 i 4 (akurat w tym przykładzie), natomiast komórka C1 jest wartością wyliczonej funkcji:
C1=PodwojonaSumaKomorek(A1;B1)
 
Teraz wystarczy kliknąc w znak funkcji na pasku:

wstawianie punktu przerwania

Pojawi się klasyczne okno dialogowe funkcji (już z wprowadzonymi wcześniej argumentami). Po naciśnięciu przycisku OK Excel zacznie wykonywać funkcję. Ponieważ w tym przypadku mamy do czynienia z funkcją własną uzytkownika - musi się odwołać do VBA, gdzie czeka punkt przerwania. Automatycznie zostaniemy więc przeniesieni do edytora VBA.

wstawianie punktu przerwania 

W punkcie przerwania pojawiło się żółte zaznaczenie linii. Oznacza to linię kodu, która będzie teraz wykonana. Warto jednak już w tym miejscu - podejrzeć wartości poszczególnych zmiennych. Wystarczy najechać myszką na dowolną zmienną w dowolnym miejscu kodu. Pojawi się etykietka, w której widoczna będzie aktualna wartość danej zmiennej. Na rysunku powyżej taka etykietka jest widoczna u samej góry - wartość zmiennej PierwszySkładnik=3. W identyczny sposób można oczywiscie skontrolować wartość pozostałych zmiennych. 
Wartości zmiennych Suma i PodwojonaSumaKomorek są w tej chwili równe zero. Teraz wystaczy nacisnąć przycisk F8 - czyli wykonanie kolejnego kroku programu. Efekt na ekranie będzie wygladał tak:

wstawianie punktu przerwania

Ponieważ kolejna linia programu została wykonana - wartość Sumy zmieniła się po wykonaniu działania z linii 3. Teraz równa sie akurat 7.
Kolejne kroki programu - kolejne naciśnięcia F8.
Przejście do końca programu (z wykonanie autmatycznym kolejnych kroków) - F5.

Po zakończeniu analizy programu - koniecznie pamiętajmy o zdjęciu punktu przerwania. Wystarczy kliknąć ponownie na kropkę oznaczającą ten punkt. Jeżeli tego nie zrobimy - za każdym razem będziemy trafiać do edytora.

Przykład jest prosty, ale sprawdza się w analizie skomplikowanych kodów. Zasada psotępowania jest taka sama. Zreszta nie tylko w Excelu, ale również w Accessie.

wtorek, 09 marca 2010

Pierwsza własna funkcja już napisana (notka: Piszemy funkcję VBA) , teraz pora na jej wykorzystanie w arkuszu Excela. Ja kto zrobić? Identycznie jak wstawianie każdej innej funkcji, wybierając z listy rodzajów funkcji - funkcje użytkownika:

wstawianie funkcji użytkownika

 Po wybraniu kategorii Użytkownika pojawia się lista wszystkich funkcji tej kategorii:

funkcje użytkownika

Lista jest alfabetyczna. W tym przypadku na jej końcu znajduje się funkcja PodwojonaSumaKomorek, której kod VBA opisywałam tu:
Piszemy funkcję w VBA

Wybieramy tę funkcję i wstawiamy dane jak do każdej zwykłej funkcji

wstawianie funkcji własnej użytkownika

Argumentami funkcji są PierwszySkladnik i DrugiSkladnik - czyli te zmienne, które w kodzie funkcji były wpisane w w pierwszej linii, przy deklaracji funkcji:

Public Function PodwojonaSumaKomorek(PierwszySkladnik As Integer, DrugiSkladnik As Integer) As Integer

Wstawiamy komórki w poszczególne pola funkcji i już - funkcja działa i oblicza.
Warto przy tym zwrócić uwagę, że w ramach kodu funkcji PodwojonaSumaKomorek - argumenty funkcji zostały zdeklarowane jako liczby typu Integer czyli całkowite. Jeżeli w komórkę wstawioną do funkcji wpiszemy liczbę rzeczywista - Excel odrzuci to co po przecinku i obliczy wartość funkcji tylko dla części całkowitej. Jeżeli pojawią się jednak np. wartość typu String - wynikiem działania funkcji będzie błąd.
Ale wszsytko przed nami - na obsługę błędów i zabezpieczenia przed nieprzewidywalnymi działaniami użytkowników też przyjdzie pora.....

poniedziałek, 08 marca 2010

Ja zacząć pisać funkcję w VBA? Przykład będzie bardzo prosty, ale chcę na nim pokazać podstawowe zasady. O wejściu do edytora VBA i wstawieniu nowej funkcji pisałam tu:
Excel - edytor Visual Basic

Zaprojektujmy prostą funkcję, która będzie sumowała wartości dwóch komórek, a nastepnie mnożyła wynik przez 2. .

Public Function PodwojonaSumaKomorek(PierwszySkladnik As Integer, DrugiSkladnik As Integer) As Integer              'linia 1

Dim Suma As Integer                                       'linia 2

Suma = PierwszySkladnik + DrugiSkladnik  'linia 3
PodwojonaSumaKomorek = 2 * Suma          'linia 4

End Function                                                      'linia 5

W oknie powyżej jest dokładnie skopiowany kod programu, łącznie z kolorami, które też mają swoje znaczenie. Można je zmienić, ale to już osobny temat na inną okazję.
kolor niebieski - słowa kluczowe VBA 
kolor zielony - wszystkie dodatkowe informacje, opisy - jednym słowem tekst własny programisty, w którym możemy wpisywac wszystkie uwagi. Zaczynają sie one od górnego apostrofu ' , kończą naciśnięciem Enter czyli przejściem do następnej linii. 
A teraz po kolei, linijkami:

linia 1 
Public Function  - to oznaczenie początku kodu funkcji. PodwojonaSumaKomorek - nazwa własna funkcji (wymyślona przez mnie). PierwszySkładnik i DrugiSkladnik - to nazwy zmiennych wymaganych (będzie to widoczne z poziomu arkusza Excel) . Ponieważ przy każdej z nich jest dopisek As Integer - oznacza to, że zmienne muszą być typu Integer.  Podobnie w przypadku wyniku całej funkcji - za nawiasem tez jest ten dopisek. Nie jest to warunek obowiązkowy, można nie deklarować typu zmiennych - wówczas będa one traktowane jako zmienne typu Variant.

linia 2
Blok (w tym przypadku tylko jedna linia) deklaracji zmiennych o charakterze lokalnym i pomocniczym, widocznych tylko w ramach kodu. Każda kolejna zmienna jest deklarowana w nowej linii, zaczynajacej się słowem kluczowym Dim.

linia 3
Zmienna Suma przyjmuje wartość PierwszySkladnik + DrugiSkladnik

linia 4
PodwojonaSumaKomorek (czyli wartość funkcji) przyjmuje wartość podwójnej Sumy.
Tak naprawdę - to można było to zapisać dużo prościej:
PodwojonaSumaKomorek=2*(PierwszySkladnik+DrugiSkladnik)
chodziło mi jednak o pokazanie róznicy pomiędzy zmiennymi wymaganymi, a blokiem zmiennych w ramach kodu.

linia 5
End Function - słowo kluczowe kończące kod funkcji.

Teraz wystarczy tylko zdebugować funkcję w edytorze VBA (czyli sprawdzić poprawność wpisanego kodu) i funkcję można wykorzystać.

kompilacja kodu VBA

Jeżeli w kodzie są błędy - pojawi się komunikat z zaznaczeniem miejsca, w którym błąd się pojawił. Jeżeli nie - komunikatu nie będzie, ale zaznaczona na obrazku opcja "Compile VBA Projekt" - stanie się nieaktywna. Przynajmniej do czasu, gdy nie wprowadzimy zmian w kodzie (nawet tych nieistotnych).

piątek, 05 marca 2010

Każdy, kto zaczyna pisać własny program - ma swoje przyzwyczajenia i nawyki, które stosuje i uważa za dobre. Myślę, że warto się z nimi zapoznać i może niektóre z nich zastosowac?

  •  nazwy własne procedur, makr, funkcji i zmiennych obowiązkowo nie mogą zaczynać się od cyfr. Nie można też tu używać znaków specjalnych typu kropka, przecinek itp. Wyjątkiem jest podkreślnik czyli " _ ".
    Ja dodatkowo przyjęłam zasadę, ze nie stosuję żadnych polskich liter z ogonkami
  • dobrze, jeżeli nazwy funkcji odzwierciedlają z grubsza - czemu służą. Czyli np. ObliczDlugosc czy OtworzPlik. Zdecydowanie łatwiej się nimi operuje niż przy zastosowaniu nomenklatury typu MojaFunkcja_1, Procedura_3 itp. Szczególnie, że pamięć bywa ulotna, a  po dłuższym czasie trudno będzie się zorientowac we własnym projekcie
  • przy nazwach złożoznych z kilku słow nie lubę stosować podkreślników oddzielających poszczególne słowa. Zamiast tego stosuję małe i duże litery. Czyli nie moja_funkcja lecz MojaFunkcja. Wizualnie Efekt ten sam, a pisze się łatwiej
  • już po zadeklarowaniu zmiennych, pisząc sam kod programu - używam tylko małych (najczęściej) liter. Jeżeli zmienną mam zadeklarowaną jako np. MojaSuma - to przy obliczeniach w dalszej części programu wpisuję mojasuma. Edytor VBA automatycznie sam poprawi nazwę na MojaSuma. Zasada ta dotyczy także wszystkich słów kluczowych VBA. Jeżeli czegoś nie poprawi - oznacza to,  że nie zna tego słowa. W praktyce - zrobiłam literówkę, którą łatwo da się dostrzec. Zawsze mniej błędów przy debugowaniu
  • warto stosować uwagi i opisy poszczególnych części programu. Stanie się w ten sposób łatwiej zrozumiały, również po dłuzszym czasie
  • programy bardzo mocno rozbudowane lepiej dzielić na kilka części i odwoływac się do nich w ramach kodu. Całość będzie zdecydowanie bardziej przejrzysta
  • przed napisaniem pierwszych, prostych programów - zawsze zaczynałam od narysowania algorytmu graficznego. Udawało mi się w ten sposób nie pogubić i uwzględnić wszystkie możliwe przypadki, które mogą umknąć. Teraz juz tego nie stosuję, ale tak naprawdę - to taki zgrubny algorytm mam w głowie przy pisaniu konkretnego programu

Tyle z uwag ogólnych. Bardziej szczegółowe rozwiązania przy konkretnych przykładach.

| < Październik 2014 > |
Pn Wt Śr Cz Pt So N
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    


Książki warte polecenia
zobacz szczegóły...


A tu oferta na dziś:





ministat liczniki.org



Napisz do mnie!


zBLOGowani.pl