Funkcja KwotaSlownie w różnych językach programowania i środowiskach programistycznych. Spis treści. { TC \l 3 } 1. PROBLEM... 2



Podobne dokumenty
Aplikacje w środowisku VBA. Visual Basic for Aplications

Zastanawiałeś się może, dlaczego Twój współpracownik,

Makropolecenia w Excelu

Projekt Hurtownia, realizacja skojarzeń dostawców i produktów

Przygotowanie własnej procedury... 3 Instrukcja msgbox wyświetlanie informacji w oknie... 6 Sposoby uruchamiania makra... 8

3 Delegacje. 3.1 Tworzenie delegacji. 3.2 Skojarzenie delegacji z procedurą czy funkcją

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Informatyka II. Laboratorium Aplikacja okienkowa

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

2. Kliknij Insert->Userform. Jeżeli Toolbox nie pojawi się automatycznie, kliknij View -> Toolbox. Otrzymany widok powinien być jak poniżej.

Programowanie obiektowe

Visual Basic for Applications. Wstęp

Języki skryptowe w programie Plans

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

LibreOffice Calc VBA

Zakres tematyczny dotyczący podstaw programowania Microsoft Office Excel za pomocą VBA

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Projekt Hurtownia, realizacja rejestracji dostaw produktów

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Programowanie Obiektowe GUI

1 Podstawy c++ w pigułce.

Makropolecenia w PowerPoint Spis treści

Tablice. Jones Stygar na tropie zmiennych

Tablice, DataGridView

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Scenariusz lekcji. Scenariusz lekcji 1 TEMAT LEKCJI: 2 CELE LEKCJI: 2.1 Wiadomości: 2.2 Umiejętności: 3 METODY NAUCZANIA: 4 ŚRODKI DYDAKTYCZNE:

AUTOMATYZACJA PRACY Z UŻYCIEM MAKR. Tom XII NPV WSP.KORELACJI ROZKŁ.EXP JEŻELI COS KOMÓRKA VBA DNI.ROBOCZE ILOCZYN LOG SUMA CZY.

1 Podstawy c++ w pigułce.

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

Modelowanie obiektowe - Ćw. 1.

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Nagrywanie Makr. Na karcie Dostosowywanie Wstążki zaznaczamy kartę Deweloper.

Plik->Opcje->Zakladka Główne->Dostosuj Wstążkę Zaznaczamy kwadracik Developer na liscie po prawej stronie. Klikamy OK.

Wprowadzenie (17) Część I. Makra w Excelu - podstawy (23)

Materiały do laboratorium MS ACCESS BASIC

VBA praca z makrami w Excelu

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Działki Przygotowanie organizacyjne

Algorytmika i Programowanie VBA 1 - podstawy

Edytor tekstu OpenOffice Writer Podstawy

Przewodnik Szybki start

Laboratorium 1 - Programowanie proceduralne i obiektowe

Programowanie w języku Python. Grażyna Koba

Programowanie w języku C++ Grażyna Koba

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

PHP: bloki kodu, tablice, obiekty i formularze

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Kolumna Zeszyt Komórka Wiersz Tabela arkusza Zakładki arkuszy

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Zaawansowane aplikacje internetowe - laboratorium

TABLICA (ang. array) pojedyncza zmienna z wieloma komórkami, w których można zapamiętać wiele wartości tego samego typu danych.

5.2. Pierwsze kroki z bazami danych

Ćwiczenia nr 4. Arkusz kalkulacyjny i programy do obliczeń statystycznych

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

Ćwiczenia nr 2. Edycja tekstu (Microsoft Word)

Użycie Visual Basic for Applications ("VBA")

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Arkusz kalkulacyjny EXCEL

Umieszczanie kodu. kod skryptu

Trik 1 Edycja wykresu bezpośrednio w dokumencie Worda

Symfonia Mała Księgowość 2013 Specyfikacja zmian

INSTRUKCJA OTWIERANIA PLIKU DPT (data point table)

Lokalizacja jest to położenie geograficzne zajmowane przez aparat. Miejsce, w którym zainstalowane jest to urządzenie.

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Autor: dr inż. Katarzyna Rudnik

Edytor materiału nauczania

Zadanie. Menu Plik niech posiada dwie pozycje: Tekstowy i Excel, a każda z nich niech posiada dwie pozycje Otwórz i Zapisz, patrz rys. 2.

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

lekcja 8a Gry komputerowe MasterMind

Wykład 2 Składnia języka C# (cz. 1)

Część I: Przypisanie makr do obiektu (przycisku).

Program szkolenia PODSTAWY VBA (VISUAL BASIC FOR APPLICATIONS) I FORMULARZE.

Maxima i Visual Basic w Excelu

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

Wprowadzenie do projektu QualitySpy

Pracownia Informatyczna Instytut Technologii Mechanicznej Wydział Inżynierii Mechanicznej i Mechatroniki. Podstawy Informatyki i algorytmizacji

Dokumentacja programu. Zoz. Uzupełnianie kodów terytorialnych w danych osobowych związanych z deklaracjami POZ. Wersja

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Zajęcia: VBA TEMAT: VBA PROCEDURY NUMERYCZNE Metoda bisekcji i metoda trapezów

Formatowanie tekstu za pomocą zdefiniowanych stylów. Włączanie okna stylów. 1. zaznaczyć tekst, który chcemy formatować

Zacznijmy więc pracę z repozytorium. Pierwsza konieczna rzecz do rozpoczęcia pracy z repozytorium, to zalogowanie się w serwisie:

Podstawy programowania skrót z wykładów:

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

VBA praca z makrami w Excelu

Projekt ZSWS. Instrukcja uŝytkowania narzędzia SAP Business Explorer Analyzer. 1 Uruchamianie programu i raportu. Tytuł: Strona: 1 z 31

Podstawy Programowania 2

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Program szkolenia VBA (VISUAL BASIC FOR APPLICATIONS) W EXCELU PODSTAWOWY.

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1)

Platformy Programowania

Transkrypt:

Funkcja KwotaSlownie w różnych językach programowania i środowiskach programistycznych Spis treści 1. PROBLEM... 2 2. ROZWIĄZANIE W VBA EXCEL... 2 2.1. UTWORZENIE TABLICY LICZEBNIKÓW... 2 2.2. JAK MA DZIAŁAĆ FUNKCJA?... 3 2.3. IMPLEMENTACJA FUNKCJI.... 4 2.4. KOSMETYKA KODU... 7 2.5. UTWORZENIE KLASY CSLOWNIE... 8 3. ROZWIĄZANIE W GOOGLE DOCS... 11 3.1. JĘZYK PROGRAMOWANIA JAVASCRIPT... 11 3.2. IMPLEMENTACJA FUNKCJI SLOWNIEKWOTA... 11 3.2.1. Ograniczenia w porównaniu z rozwiązaniem VBA... 12 3.2.2. Funkcje dające dostęp do liczebników... 12 3.2.3. Pomocnicze funkcje pomocplus i Pomoc... 15 3.2.4. Pomocnicza funkcja cotojest... 16 3.2.5. Funkcja slowniekwota... 17 3.2.6. Weryfikacja i sprawdzenie funkcjonowania... 18 3. ROZWIĄZANIE W VISUALBASIC.NET... 20 3.1 APLIKACJA TESTOWA TESTUJEMYKWOTESLOWNIE.VB... 20 3.1.1. Otwarcie nowego projektu... 20 3.1.2. Dodanie klasy... 21 3.1.3. Projekt formularza testowego... 24 3.1.4. Testowanie utworzonej klasy... 26 3.2. UTWORZENIE BIBLIOTEKI CSLOWNIE.DLL... 27 3.3. WYKORZYSTANIE BIBLIOTEKI CSLOWNIE.DLL... 31 { TC \l 3 }

1. Problem Jedną z niezmiernie istotnych funkcji w zastosowaniach biznesowych jest funkcja zwracająca słowną wartość kwoty. Funkcja taka może być utworzona w aplikacjach MS Office z wykorzystaniem języka VBA, może być utworzona w Google Docs w języku JavaScript, może być także napisana w środowisku Visual Studio z wykorzystaniem języka Visual Basic czy Visual C#. W języku polskim istotną trudnością w zaimplementowaniu takiej funkcji jest odmiana polskich liczebników oraz odmiana takich słów jak złoty i groszy. Rozwiązaniem będzie wykorzystanie tablicy tych liczebników, która pokazana jest niżej (jako tablica Excela). W zależności do użytego języka i środowiska tabela ta będzie w różny sposób wykorzystana w implementacji funkcji KwotaSlownie. Generalnie będzie chodziło o takie rozwiązanie, aby tabela taka była budowana tylko raz, przy pierwszym wywołaniu omawianej funkcji. 2. Rozwiązanie w VBA Excel W przypadku Excela najlepszym rozwiązaniem będzie zbudowanie tej funkcji w skoroszycie makr osobistych, czyli pliku o nazwie Personal.xla lub Pesrosnal.xlsb, który standardowo jest umieszczany w folderze XLSTART zainstalowanej wersji pakietu Office. Plik Personal jest wtedy uruchamiany przy otwarciu Excela, przy czym możemy sterować pokazaniem tego pliku lub jego ukryciem. Dla nas istotny jest fakt, że wszystkie funkcje utworzone w pliku Personal są dostępne dla każdego otwartego skoroszytu jako funkcje użytkownika.. 2.1. Utworzenie tablicy liczebników Otwieramy istniejący skoroszyt Personal (lub nowy, pusty skoroszyt, jeżeli nie mamy pliku tego typu). Dodajemy w nim nowy arkusz, któremu nadajemy nazwę Liczebniki: i wpisujemy w nim w obszarze A1:I10 pokazane wyżej liczebniki. Otwieramy teraz edytor VBA kombinacją klawiszy (lewy) Alt+F11, poniżej widok okna edytora. Po lewej stronie widoczne jest okno Project Explorer w nim pokazane są wszystkie aktualnie otwarte projekty (skoroszyty Excela) oraz obiekty aktywnego projektu. W pokazanej sytuacji aktywnym projektem jest skoroszyt o nazwie SlownieInaczej-Kopia.xls, to w nim będziemy budować funkcję KwotaSlownie (równie dobrze może to być skoroszyt Personal lub inny pusty skoroszyt, który zapiszemy później jako plik Personal). Jako obiekty aktywnego skoroszytu pokazane są trzy arkusze o nazwach domyślnych (czyli Arkusz1 do Arkusz3, ale jeden z nich ma zmienioną nazwie na Liczebniki. Dla wyjaśnienia: jeżeli nie jest zdefiniowana właściwość Name arkusza, to system wykorzystuje nazwę domyślną, czyli Arkusz z aktualnym numerem (jest to numer ostatniego dodanego arkusza w danej sesji).

Po prawej stronie widoczne jest okno, w którym będziemy tworzyć kod naszej funkcji. Okno to nie ma formalnej nazwy, ale jest jednym z najważniejszych w edytorze VBA. Kod, czyli zestaw instrukcji jako poleceń dla systemu operacyjnego może być przechowywany w różnych obiektach projektu, a wybór miejsca zależy od przeznaczenia kodu, który chcemy wprowadzić. Instrukcje wprowadzone do obiektu typu arkusz będą oddziaływały wyłącznie na arkusz, w którym zostały wprowadzone. Z kolei kod wprowadzony w obiekcie ThisWorkbook (ten skoroszyt) będą dotyczyły wszystkich arkuszy tego skoroszytu. Jeżeli chcemy, aby kod był dostępny w dowolnych obiektach (także w innych skoroszytach), to musimy do rozwiązania dodać specjalny obiekt typu Module (dodajemy taki obiekt poprzez polecenie Insert z menu edytora). Nazwę tak wprowadzonego modułu możemy zmienić korzystając z okna właściwości (Properties Window). Okno to możemy otworzyć na wiele sposobów: F4, menu View jak i klik przycisku w pasku narzędziowym edytora. Do projektu można dodać jeszcze jeden typ obiektu, a mianowicie obiekt o nazwie Class Modules, w którym możemy zdefiniować obiekt będący tzw. klasą Klasa, to w uproszczeniu obiekt złożony z kodu i danych opisujących jego właściwości. Klasa to domena języków wyższego poziomu (np. C, C++, VisualStudio), ale w pewnym zakresie można z klas korzystać także w VBA. Cechą charakterystyczną dla klas są takie pojęcia jak abstrakcja, hermetyzacja, dziedziczenie i polimorfizm. Pierwsze z tych dwóch cech są dostępne w VBA i w tym materiale pokażemy także wykorzystanie klas do realizacji funkcji KwotaSlownie. 2.2. Jak ma działać funkcja? Powiedzmy, że chcemy znaleźć słowny odpowiednik kwoty x=987654321,12. Możemy zamienić tę liczbę na jej odpowiednik tekstowy, otrzymamy wtedy zmienną tekstową zawierającą taki ciąg znaków t = 987654321.12 (funkcja VBA o nazwie Str(liczba) zamienia przecinek na kropkę). Możemy teraz kolejno odcinać od lewej strony po jednym znaku i ustalać, jaki mu odpowiada liczebnik. W przypadku VBA będziemy korzystali z funkcji Mid(string, start, ile_znaków), która odcina z tekstu string ile_znaków zaczynając od pozycji start. Przykładowo Mid(t,2,1) zwraca 8, a Mid(t,4,2) zwraca 65, jeżeli t = 987654321.12. Zwrócony znak (cyfry) możemy zamienić na jego wartość numeryczną korzystając z funkcji VBA o nazwie Val(string), gdzie string reprezentuje ciąg cyfr. Przykładowo Val(Mid(t,1,1)) zwraca liczbę 9, która może być wskaźnikiem do odpowiedniego wiersza naszej tabeli z liczebnikami. Poza zwróceniem poprawnej formy liczebnika musimy jeszcze zadbać o poprawne zwroty dotyczące wielkości kwoty, czyli milionów i tysięcy złotych. Na dodatek w każdej grupie cyfr opisujących miliony, tysiące czy jedności musimy rozwiązać problem poprawnego zwrotu liczebnika w sytuacji, gdy chodzi o kilkanaście (milionów, tysięcy czy złotych). Rozwiązanie znajdziemy, jeżeli zauważymy, że taka sytuacja ma miejsce wtedy, gdy drugi znak w takiej trójce jest jedynką. Sytuacja staję się jeszcze trudniejsza, jeżeli zauważymy, że nasze rozwiązanie musi być dobre na sytuacje, gdy nasza liczba jest nieujemna i nie większa od 999999999,99. Nasze rozwiązanie musi być tak napisane, aby cięcie reprezentacji tekstowej kwoty mogło być wykonane maksymalnie 9 razy w sytuacji, gdy chodzi o kwotę rzędu setek milionów lub raz, jeżeli chodzi o kwotę mniejszą od 10 zł. Uwaga powyższa dotyczy pocięcia tekstu odpowiadającego części całkowitej kwoty. Rozwiążemy nasz problem korzystając z pętli For Next (tzw. pętla z licznikiem), przy czym licznik pętli będzie biegł od 1 do długości tekstu reprezentującego część całkowitą kwoty. Wykorzystanie tego pomysłu wymaga rozdzielenia reprezentacji tekstowej kwoty na dwa teksty reprezentujące część całkowitą i część ułamkową. Punktem wyjściowym jest ustalenie położenia kropki w reprezentacji tekstowej kwoty, co możemy ustalić z pomocą instrukcji InStr(string,znak). Jeżeli znak nie został znaleziony, to funkcja zwraca wartość zero. Przykładowo k=instr(t,. ) zwróci liczbę 10, jeżeli t = 987654321.12. Korzystając z funkcji Mid możemy teraz wydzielić część całkowitą oraz część ułamkową. Przykładowo t1=mid(t,1,k-1) będzie zawierać ciąg znaków 987654321 (jeżeli k=10), a zmienna t2=mid(t,k+1,len(t)-k) będzie zawierać ciąg 12. Funkcja Len(string) zwraca długość (liczbę znaków) zmiennej string. Możemy już podać konstrukcję pętli typu For Next, która przeanalizuje nam reprezentacją części całkowitej liczby niezależnie od tego, czy zawiera ona 9 znaków czy 1 znak: KwotaSlownie= For i=1 to len(t2) Podprogram_analizujący_znak_na pozycji_i Next i

Jak widzimy nasz problem nie jest jeszcze rozwiązany, musimy bowiem napisać zestaw instrukcji, który będzie wykonywany przy każdym obrocie pętli. Podprogram to fragment kodu, który może być wielokrotnie wykonany. Generalnie podprogram będziemy nazywać procedurą, przy czym będziemy rozróżniać procedury zwracające wartość i wtedy będziemy je nazywać funkcjami (function) i na takie procedury, które nie zwracają wartości dla nich rezerwujemy słowo procedura (sub). Zasadnicza różnica między funkcją a procedurą jest taka, że funkcja może wystąpić jedynie w przypisaniu (po prawej stronie znaku równości) lub jako warunek w instrukcjach warunkowych (If, Select case, Choose). Do procedury (i funkcji) można przekazać szereg argumentów, na których procedura będzie pracować. Argumenty te mogą być przekazane dwojako, albo przez kopię oryginalnej wartości zmiennej przekazanej jako argument (ByVal) lub przez jej referencję (ByRef). W pierwszym przypadku oryginalna wartość zmiennej nie ulega modyfikacji, a w drugim tak. W przypadku klasycznej procedury przekazując argument przez referencję powodujemy, że procedura może modyfikować oryginalną wartość tego argumentu. Generalnie nie jest to najlepsze rozwiązanie, ale w niektórych przypadkach można z niego skorzystać. W naszym przypadku napiszemy procedurę o nazwie CoToJest, do której przekażemy ciąg znaków do przeanalizowania, licznik pętli, liczbę określającą wielkość kwoty i opcjonalnie parametr wykorzystywany do analizy części ułamkowej (groszy). Dokładna postać tego podprogramu jak i pomocniczej funkcji o nazwie PowiekszTekst będzie przedstawiona w dalszej części. 2.3. Implementacja funkcji. Tworzenie kodu naszej funkcji zaczniemy od zadeklarowania kilku zmiennych w takim miejscu, aby miały one zasięg modułu, czyli bezpośrednio na samej górze okna kodu. Instrukcja deklaracji zmiennej zaczyna się od słowa Dim, po nim następuje nazwa zmiennej, spacja, słowo kluczowe As, spacja, tym zmiennej. Inteligentny system podpowiedzi po słowie kluczowym As wyświetla dostępne słowa kluczowe, znajdziemy tam typy zmiennych: Range obszar; String tekst, Integer liczba całkowita, Single liczba pojedynczej precyzji, Double liczba podwójnej precyzji, Boolean typ logiczny, Variant typ ogólny, Date typ daty itd. Poniżej widok okna podpowiedzi pozwalającego na wybór typu zmiennej (w tym przypadku). Zmienna myt będzie przechowywać referencję (adres) do tablicy liczebników, zmienna KwS będzie zawierać budowany ciąg znaków zawierający słowną reprezentację kwoty, zmienna ii będzie wykorzystana jako licznik pętli analizującej poszczególne znaki tekstowej reprezentacji kwoty. Zmienna ta jest zadeklarowana w tym miejscu, będziemy ją bowiem modyfikować w pomocniczej procedurze. Pomocnicza procedura PowiększTekst została napisana jako namiastka skróconego operatora zwiększającej zmienną tekstową tp o zmienną t. Proszę zauważyć, że argument tp został przekazany przez referencję, czyli procedura będzie modyfikować jego oryginalną wartość.

Poniżej kod procedury CoTJest odpowiedzialnej za analizę pojedynczego znaku.

Możemy już napisać kod publicznej funkcji KwotaSlownie.

Pozostało już tylko pokazanie jak można korzystać z utworzonej funkcji. 2.4. Kosmetyka kodu W kodzie procedury CoToJest powtarzają się pewne fragmenty kodu co ich konstrukcji (zaznaczone czerwoną linią). Kod tej procedury znacznie się uprości, jeżeli napiszemy pomocniczą procedurę realizującą zadania tych trzech fragmentów kodu. Analiza wskazanych fragmentów pokazuje, że do tej nowej procedury muszę przekazać dwa warunki oraz trzy pary współrzędnych do odszukania odpowiedniego liczebnika w zmiennej obszarowej myt. Przed napisaniem tej procedury zauważmy jeszcze, że pierwsza instrukcja w trzecim fragmencie może mieć postać: PowiekszTekst KwS, & myt.cells(1, 7)

niżej. Pomocnicza procedura zastępująca każdy z zaznaczonych fragmentów kodu ma postać taką, jak pokazana Pokazany niżej fragment kodu występuje wprawdzie tylko raz, ale w dążeniu do uporządkowania kodu też możemy go zastąpić pomocniczą procedurą. A tak wygląda druga pomocnicza procedura porządkująca kod procedury CoToJest. Ostatecznie fragment kodu, który poddaliśmy zabiegowi uporządkowania wygląda teraz tak (proszę go porównać z kodem ze strony 6). Mogę ten fragment podsumować tak: zawsze po sprawdzeniu, że utworzony kod pracuje zgodnie z naszymi oczekiwaniami powinniśmy popracować nad uporządkowaniem kodu, czyli nad jego uproszczeniem i dodaniem komentarzy. 2.5. Utworzenie klasy CSlownie Pokażę teraz, jak można utworzyć klasę z publiczną metodą (funkcją) realizującą to samo zadanie co omówiona wcześniej funkcja KwotaSlownie. Pracę zaczniemy od dodania do naszego projektu obiektu typu Class Module, którego nazwę zmienimy na CSlownie. Przyjmiemy taką zasadę, że nazwy klas będą zawsze zaczynać się od dużej litery C, a po niej będzie nazwa opisująca skrótowo przeznaczenie klasy. Pierwsza litera tej nazwy jest także duża. W klasie możemy zdefiniować zmienne prywatne, będą one dostępne dla wszystkich procedur danej klasy, ale nie będą dostępne spoza klasy. Poniżej widok sekcji deklaracji z deklaracją zmiennych prywatnych. Pierwsza i trzecia zmienna jest analogiczna do zmiennych zadeklarowanych w module Slownie, w przypadku zmiennej mi zastosowałem zalecany sposób nazewnictwa zmiennych prywatnych.

Procedury pomocnicze o nazwach PowiekszTekst, Pomoc i PomocGrosze są analogiczne jak w poprzednim rozwiązaniu (jak w module Slownie). Procedura CoToJest jest prawie też taka sama, jedyna różnica między poprzednim rozwiązaniem a klasą polega na zastąpieniu zmiennej ii zmienną mi. Publiczna funkcja KwotaSlownie z modułu Slownie została zastąpiona publiczną funkcją o nazwie Slownie, której kod pokazany jest niżej. Musimy teraz dodać dodatkowy moduł do naszego rozwiązania, napiszemy w nim publiczną funkcję o nazwie ckwotaslownie (musimy zadbać o unikalność nazw), jej zadaniem będzie utworzenie instancji klasy CSlownie i wywołanie jej metody Slownie. Zaczniemy od dodania nowego modułu i od zmiany jego nazwy na SlownieC (nie może być CSlownie, bo mielibyśmy dwa moduły o tej samej nazwie). W oknie kodu modułu SlownieC piszemy kod publicznej funkcji o nazwie ckwotaslownie, przekażemy do niej jako argument zmienną typu Double, a funkcja zwróci wartość typu String. Funkcja zaczyna swoją pracę od sprawdzenia, czy kwota jest z dopuszczalnego zakresu, jeżeli nie, to zwraca stosowny komunikat. Jeżeli tak, to jest deklarowany i tworzony obiekt klasy CSlownie, a następnie zwracany wynik metody Slownie. Poniżej kod tej funkcji.

Pozostało pokazanie jak ta klasa działa.

3. Rozwiązanie w Google Docs W przypadku Google Docs utworzenie funkcji będącej odpowiednikiem omawianej wcześniej funkcji KwotaSlownie jest znacznie bardziej skomplikowane, w znacznej mierze z uwagi na funkcjonowanie tego pakietu w tzw. chmurze i braku odpowiednika takiego rozwiązania jakim jest skoroszyt Personal w MS Excel. Stosunkowo prostym rozwiązaniem będzie utworzenie arkusza o nazwie np., MojPlikPersonal, który będzie zawierał kody funkcji użytkownika. Plik ten formalnie można zapisać jako szablon, ale będzie on publicznie dostępny dla wszystkich użytkowników Google Docs. Alternatywnym rozwiązaniem może być takie działanie, w którym otwieramy odpowiedni plik ze zdefiniowanymi funkcjami użytkownika, a następnie tworzymy jego kopię i dalej pracujemy na tej kopii. W efekcie mamy taką sytuację, jak przy użyciu klasycznych szablonów w pakiecie MS Office (no prawie taką samą). 3.1. Język programowania JavaScript Język programowania w JavaScript różni się dość istotnie od używanego w VBA czy VisualBasic, co nie oznacza, że osoba znająca podstawy programowania nie jest w stanie programować w tym języku. Podstawowe różnice dotyczą: Każda instrukcja (z pewnymi wyjątkami kończy się symbolem średnika; Deklaracja zmiennych zaczyna się od słowa kluczowego var nazwa_zmiennej; W deklaracji zmiennej nie określa się jawnie jej typu; Zmienna przed jej użyciem musi być zainicjowana wartością, możliwe jest zainicjowanie zmiennej w momencie jej deklaracji, np. var mojazmienna=0; Blok instrukcji tworzących pewną całość ujmuje się w parę nawiasów sześciennych; Procedura występuje w postaci funkcji, czyli musi mieć miejsce przypisanie; Inna jest konstrukcja warunków logicznych, zamiast znaku = używamy ==, zamiast And używamy &&, a zamiast <> używamy ; W przypadku ciągu znaków będziemy używać takich funkcji jak: o string.length (zwraca długość tekstu); o string.substr(pozycja, ile_znaków) zwraca ciąg znaków zaczynając od pozycji (indeksowanie od zera); o string.indexof(znaki) zwraca pozycję pierwszego wystąpienia tekstu znaki w tekście string (zwraca -1, jeżeli nie ma wystąpienia); o string.valueof() zwraca dziesiętną reprezentację ciągu znaków string (muszą reprezentować liczbę). W sieci można znaleźć wiele stron poświęconych JavaScript, przykładowo mogę polecić takie pozycje http://www.w3schools.com/js/default.asp i http://www.tutorialspoint.com/javascript/index.htm. 3.2. Implementacja funkcji slowniekwota Kod tej funkcji będziemy tworzyć w oknie edytora skryptów, który otwieramy korzystając z menu Narzędzia i dalej Edytor skryptów. Domyślnie otwierany jest projekt o nazwie Kod.gs, tak jak pokazano to niżej.

3.2.1. Ograniczenia w porównaniu z rozwiązaniem VBA W wolnym miejscu edytora możemy zacząć pracować nad kodem naszej funkcji, ja zacznę do rozwiązania problemu dostępu do tablicy liczebników, co wcale nie będzie prostym rozwiązaniem z kilku powodów: Ponieważ nie uda nam się zbudować skoroszytu typu Personal to nie chcę wykorzystywać jednego z arkuszy skoroszytu, który ma pełnić (z ograniczeniami) rolę pliku Personal do przechowywania tablicy liczebników; Alternatywnie chciałem wykorzystać znaną z VBA funkcję Choose(), ale nie znalazłem jej odpowiednika w JavaScript; Nie chciałem wykorzystywać tablicy (Array), bo standardowo można definiować tylko tablice jednowymiarowe (standardowo, bo można utworzyć tablicę tablic). Zbudowanie tabeli tablic i dostarczenie do nich liczebników prawdopodobnie trwało by dość długo, a byłoby wykonywane przy każdym wywołaniu naszej funkcji. 3.2.2. Funkcje dające dostęp do liczebników W tej sytuacji zdecydowałem się na utworzenie dziewięciu funkcji zwracających potrzebny liczebnik. Poniżej kody tych funkcji, cyfra w ich nazwie wskazuje odpowiednik numeru kolumny w naszej tabeli liczebników. Każda z nich wykorzystuje słowo kluczowe switch (zmienna) do zbudowania serii przypadków za pomocą słowa kluczowego case wartość_zmiennej. Jeżeli warunek jest spełniony, to realizowany jest ciąg instrukcji po symbolu dwukropku. Słowo kluczowe break powoduje wyjście z bloku instrukcji switch. Instrukcja return p powoduje, że funkcja zwraca wartość zmiennej p.

3.2.3. Pomocnicze funkcje pomocplus i Pomoc Koleiny krok to zaimplementowanie odpowiednika procedury Pomoc, która została zaprojektowana w rozwiązaniu VBA na etapie porządkowania kodu. Wcześniej musimy jeszcze napisać funkcję, która będzie potrafiła odczytać właściwy liczebnik wykorzystując przedstawione wyżej dziewięć funkcji. Teraz już można napisać funkcję będącą odpowiednikiem procedury Pomoc.

3.2.4. Pomocnicza funkcja cotojest Po tych przygotowaniach można napisać funkcję będącą odpowiednikiem procedury CoToJest z rozwiązania VBA.

3.2.5. Funkcja slowniekwota Pozostało napisanie kodu funkcji slowniekwota.

Musimy jeszcze zadeklarować zmienną KwotaSlownie w takim miejscu, aby zmienna ta była dostępna dla wszystkich funkcji utworzonych na potrzeby funkcji slowniekwota. Warunek ten będzie spełniony, jeżeli zmienna ta będzie zadeklarowana na początku kodu, przed innymi funkcjami. 3.2.6. Weryfikacja i sprawdzenie funkcjonowania Pozostaje sprawdzenie, czy nie popełniliśmy błędu przy kodowaniu, zrobimy to wywołując z menu edytora skryptów polecenie Uruchom i wskazując funkcję slowniekwota. Jeżeli weryfikacja przebiegła bez problemu, to możemy powrócić do arkusza kalkulacyjnego i sprawdzić funkcjonowanie napisanej funkcji. Jeżeli nie, to musimy pracowicie szukać błędu.

W naszym przypadku wszystko jest OK., możemy pokazać efekty pracy napisanej funkcji.

3. Rozwiązanie w VisualBasic.Net VisualBasic.Net jest jednym z kilku języków programowania dostępnych w Visual Studio, środowisku programistycznym zbudowanym na platformie.net. Platforma ta zabezpiecza pełne programowanie obiektowe (czyli takie, które zapewnia abstrakcję, hermetyzację, dziedziczenie i polimorfizm) i doskonałe środowisko programistyczne pozwalające na stosunkowo łatwe tworzenie aplikacji windowsowych jak i internetowych. W tym podrozdziale zajmiemy się zaimplementowaniem funkcji KwotaSlownie w VisualBasic, przy czym zrobimy to z wykorzystaniem pełnego programowania obiektowego. W pierwszym etapie zbudujemy aplikację testową, w której utworzymy klasę dającą dostęp do publicznej metody KwotaSlownie. Po sprawdzeniu poprawnego funkcjonowania tej klasy zbudujemy aplikację typu biblioteki DLL, co pozwoli nam na wykorzystywanie zbudowanej klasy w innych aplikacjach poprzez wskazanie referencji do zbudowanej biblioteki DLL. 3.1 Aplikacja testowa TestujemyKwoteSlownie.vb 3.1.1. Otwarcie nowego projektu Po uruchomieniu Visual Studio (tu w wersji 2010) korzystając z polecenia New Project otwieramy okno szablonów projektów, wskazujemy (jeżeli potrzeba szablon Windows Form Application, wpisujemy w polu tekstowym Name nazwę nowego projektu i zatwierdzamy przyciskiem OK. Efektem jest otwarcie nowego projektu, który na tym etapie zawiera dwa obiekty: My Project dający dostęp do szeregu właściwości projektu oraz plik Form1.vb zawierający definicję formularza ekranowego.

3.1.2. Dodanie klasy Korzystając z menu Project i polecenia Add Class dodajemy do projektu kolejny obiekt, w którym utworzymy klasę o nazwie CSlownie (a obiekt, który dodamy otrzyma nazwę CSlownie.vb). W otwartym oknie kodu klasy CSlownie między instrukcjami Public Class CSlownie i End Class zawrzemy teraz wszystkie instrukcje tworzące tę klasę (zabezpieczającą jej zamierzoną funkcjonalność). Zaczynamy od zadeklarowania zmiennych prywatnych klasy, pierwsza z nich to zmienna tablicowa, która będzie zawierać tablice liczebników, a druga to zmienna tekstowa, w niej będzie stopniowo powstawać tekst kwoty słownie. Zmienna tablicowa zostanie zadeklarowana ze słowem kluczowym Shared, dzięki temu będzie istniała tylko jedna kopia tej zmiennej (dokładnie w momencie tworzenia instancji tej klasy zmienna ta zostanie zbudowana i będzie dostępna dla innych instancji tej klasy). Możemy już utworzyć procedury zapewniające funkcjonalność tej klasy, a pierwszą z nich będzie procedura uruchamiana w momencie tworzenia instancji klasy, czyli jej konstruktor. Procedura będąca konstruktorem klasy ma ustaloną nazwę New, może mieć parametry lub nie. Wybiegając powiem, że klasa może zawierać wiele konstruktorów, czyli procedur o tej samej nazwie New, ale wtedy muszą różnić się zestawem parametrów (nosi to nazwę przeciążenia konstruktora). W naszym przypadku zadaniem konstruktora będzie wypełnienie zmiennej tablicowej o nazwie mliczebniki potrzebnymi liczebnikami. Wykorzystam w tym celu pomocniczą zmienną tablicową typu string, którą będę inicjował potrzebnymi liczebnikami, a następnie przenosił je do odpowiedniej kolumny tablicy mliczebniki z wykorzystaniem pętli typu For Next.

Tworzymy prywatną procedurę Pomoc jako odpowiednik analogicznej procedury z rozwiązania VBA. Kolejny krok to prywatna procedura CoToJest, która jest odpowiednikiem procedury o tej samej nazwie z rozwiązania VBA. Procedura ta otrzymuje jeden z parametrów metodą przez referencję (ByRef), jest to licznik pętli, który będzie modyfikowany w tych sytuacjach, znak analizowany będzie na pozycji kilkanaście. Odcinanie wskazanego znaku jest realizowane za pomocą funkcji Substring zmiennej tekstowej, która ma indeksowanie znaków od zera (a nie od 1 jak funkcja Mid w VBA).

Pozostało już tylko napisanie publicznej metody KwotaSlownie. Metoda ta (funkcja) wykorzystuje systemową metodę ToString do zbudowania reprezentacji tekstowej kwoty przekazanej parametrem x. Do ustalenia położenia separatora części ułamkowej (w Visual Studio w Polsce jest to przecinek) wykorzystana jest funkcja IndexOf, która zwraca -1, jeżeli poszukiwany fragment tekstu nie został odnaleziony. Warto jeszcze zwrócić uwagę na funkcję IsNumeric, która bada, czy parametr x jest liczbą. Funkcja ta zwraca prawdę, jeżeli warunek jest spełniony lub fałsz w przeciwnym wypadku.

Kod klasy jest gotowy, musimy teraz wrócić do obiektu Form1.vb i przygotować formularz testowy. 3.1.3. Projekt formularza testowego Po przejściu do formularza Form1.vb możemy zmienić jego nazwę, np. na frmtestslownie (via okno Solution Explorer), a następnie dodamy do niego następujące kontrolki (korzystając z przybornika Tools). 1. Label (etykieta) lblkwota z tekstem Kwota: opisze pole tekstowe, gdzie będziemy wpisywali kwotę; 2. TextBox (pole tekstowe) txtkwota tu wprowadzimy wartość numeryczną kwoty; 3. Label (etykieta) lblslownie tu zwrócimy reprezentację słowną kwoty; 4. Button (przycisk) btnwykonaj z tekstem Wykonaj jego klik wywoła procedurę konwertującą kwotę na jej słowny odpowiednik. Poniże widok formularza z kontrolkami. Pozostało nam jeszcze napisanie procedury, która będzie obsługiwała klik przycisku btnwykonaj. Tworzenie tej procedury możemy rozpocząć na kilka sposobów, a najprostszym będzie podwójny klik tego przycisku, co spowoduje otwarcie okna kodu tego formularza.

Proszę zwrócić uwagę na słowo kluczowe Handles, po którym jest nazwa obiektu i nazwa zdarzenia, które ta procedura będzie obsługiwać. Wynika z tego, że nazwa procedury nie ma żadnego znaczenia, wystarczy, że będzie zgodna z regułami tworzenia nazw i będzie unikalna w swoim zasięgu. Poniżej pełna postać procedury obsługującej zdarzenie Click przycisku btnwykonaj. Przed przejściem do testów możemy jeszcze zmienić właściwość Text naszego formularza (korzystamy z okna Properties). W polu tej właściwości wpisujemy tekst Formularz testowy klasy CSlownie, który pojawi się jako jej tytuł.

3.1.4. Testowanie utworzonej klasy Możemy już uruchomić nasz projekt klawiszem F5 lub poprzez klik przycisku edytora Visual Studio, zobaczymy utworzony formularz. w pasku narzędziowym Do pola tekstowego wpisujemy kwotę np. 314412,16 i klikamy przycisk Wykonaj. Jak widzimy coś jest nie tak przy opisie pozycji kilkanaście, jest czternaście tysięce zamiast czternaście tysięcy, podobnie dwanaście złote zamiast dwanaście złotych, ale w przypadku groszy jest dobrze!. Błędu musimy szukać w kodzie klasy CSlownie w procedurze CoToJest obsługującej sytuację kilkanaście. Fragment tego kodu jest pokazany niżej jako zaznaczony. Jego analiza pokazuje, że brakuje przypisania do zmiennej bw wartości True, uzupełniamy ten fragment do postaci jak niżej: i uruchamiamy testowanie ponownie wpisując tekst Jak widzimy wszystko jest już OK.

Kilka dalszych sprawdzianów. DLL. Myślę, że klasa została poprawnie zaimplementowana, co pozwoli nam na zbudowanie biblioteki typu 3.2. Utworzenie biblioteki CSlownie.dll Sensem programowania obiektowego jest budowanie aplikacji z pewnych, gotowych fragmentów. Jeżeli mamy pewien fragment kodu, który realizuje całościowo pewne zadanie (tak jak nasza klasa CSlownie), to możemy utworzyć dynamicznie dołączaną bibliotekę (*.dll). W jej konstrukcji wykorzystamy dotychczasowy kod po dość istotnej modyfikacji dotyczącej przeniesienia walidacji argumentu do klasy, a nie do jej wywołania. Zaczynamy od otwarcia nowego projektu, tym razem w oknie szablonów wybierzemy szablon Class Library, nadamy mu nazwę CSlownie i otwieramy projekt przyciskiem OK.

Po otwarciu projektu w oknie Solution Explorer zmieniamy nazwę klasy z domyślnej na CSlownie.vb, tak jak to pokazano niżej. Po zmianie nazwy między instrukcje Public Class CSlownie i End Class wklejamy zawartość klasy CSlownie z poprzedniego rozwiązania. Możemy teraz przebudować dotychczasową implementację metody KwotaSlownie, zaczynamy od zmiany nazwy i typu parametru (z Decimal na String). Zmiana ta pozwoli nam na zastosowanie bloku Try- Catch do obsługi ewentualnego błędu konwersji. Pokazany niżej kod wykorzystuje prywatną procedurę Ustal, została ona wprowadzona głównie dla zachowania przejrzystości kodu. I kod wspomnianej wcześniej procedury Ustal.

Pozostała ostania rzecz do zrobienia przed utworzeniem pliku *.dll zmienimy nazwę przestrzeni nazw (Root namespaces) z domyślnej CSlownie (jak nazwa klasy) na CSlownieJG. Zmianę zaczynamy od wywołania okna właściwości projektu (z menu Project lub z menu kontekstowego projektu w oknie Solution Explorer), a następnie w zakładce Application zmieniamy nazwę przestrzeni nazw. Kolejny krok to zapamiętanie projektu na dysku poprzez polecenie Save As (w moim przypadku będzie to na dysku E w folderze CSlownie.

Ostatnia czynność to zbudowanie biblioteki DLL poprzez klik w menu Build polecenia (w tym przypadku) Build CSlownie. Pomyślne wykonanie potwierdzane jest stosownym komunikatem w linii statusu Visual Studio. W folderze E:\CSlownie\CSlownie\bin\Release zostały utworzone pokazane niżej pliki, pierwszy z nich zawiera skompilowany kod naszej klasy.

3.3. Wykorzystanie biblioteki CSlownie.dll Tworzymy w Visual Studio nowy projekt windowsowy, możemy nadać mu dowolną nazwę (w moim przypadku będzie to WykorzystanieBiblioteki. Po jego otwarciu dodajemy do formularza te same kontrolki, co w poprzednim projekcie o nazwie TestujemyKwoteSlownie (z tymi samymi nazwami). Przed napisaniem kodu procedury obsługującej zdarzenie Click przycisku btnwykonaj musimy otworzyć okno właściwości w celu dodania referencji do biblioteki CSlownie.dll. W oknie właściwości projektu przechodzimy do zakładki References w celu wskazania lokalizacji biblioteki CSlownie.dll. Klik przycisku Add otwiera kolejne okno, w którym przechodzimy do zakładki Browse i wskazujemy lokalizację pliku biblioteki. Poniżej pokazana jest ta lokalizacja w moim przypadku. Po wskazaniu pliku CSlownie.dll i zatwierdzeniu wyboru referencja zostaje dodana do listy dotychczasowych referencji.

Możemy już przejść do napisania procedury zdarzenia Click przycisku btnwykonaj. Zaczynamy od uaktywnienia formularza (w trybie Design), a następnie otwieramy okno klasy tego formularza (klawisz F7, polecenie Code z menu View lub polecenie View Code z menu kontekstowego), Musimy jako pierwszą instrukcję wstawić polecenie zaimportowania przestrzeni nazw CSlownieJG, co pozwoli nam na posługiwanie się słabą nazwą klasy. Ustawiamy kursor na początku słowa Public i naciskamy klawisz Enter, w efekcie mamy wolny wiersz. Ustawiamy w nim kursor i wpisujemy słowo kluczowe Imports, dalej spację i w tym momencie mamy otwarte okienko podpowiedzi. Wybieramy z niego nazwę CSlownieJG (poprzez klik) i mamy zaimportowaną przestrzeń nazw (w której zdefiniowana jest klasa CSlownie). Możemy już utworzyć procedurę zdarzenia Click przycisku btnwykonaj. Szkielet tej procedury możemy mieć jak pamiętamy po podwójnym kliku tego przycisku w trybie Design formularza, można także postąpić inaczej. Z lewej listy wybieramy obiekt formularza,czyli btnwykonaj, a z prawej listy zdarzenie Click (w tej kolejności).

Efekt końcowy będzie taki sam, jak z podwójnego kliku. Wewnątrz procedury wpisujemy dwie krótkie instrukcje, pierwsza z nich deklaruje i tworzy instancję klasy CSlownie, a druga przypisuje do właściwości Text to, co zwróci metoda KwotaSlownie po przekazaniu jako parametr zawartości pola txtkwota. Poniżej pełna postać instrukcji w klasie formularza frmtestslownie. Pozostało tylko uruchomienie projektu i mały test poprawności.