Poradnik OpenOfice
Wstęp
Poradnik ten przeznaczony jest dla użytkowników początkujących jak też dla średnio zaawansowanych. Jako użytkownik średnio zaawansowany pakietu Openoffice postaram się tu wyjaśnić w sposób przystępny (łopatologiczny) zastosowanie makr w codziennym użytku, mających na celu ułatwienie normalnemu człowiekowi pracy. Jedni mądrzy ludzie tworzą program, który ma ułatwić życie a inni wydają poradniki, które są wstanie skomplikować nawet najprostszą czynność.
W tym poradniku skupię się przede wszystkim na arkuszu kalkulacyjnym Callc, gdyż to narzędzie jest najczęściej używane do przetwarzania danych. W procesie przetwarzania danych nieocenioną przysługę sprawi każdemu podstawowa znajomość pisania makropoleceń w basicu zaimplementowanym (dołączonym) w OpenOffice.
Nie będę tu szczegółowo opisywał wszystkich funkcji bo nie to jest moim celem. Po opis składni i znaczenie wszystkich dostępnych funkcji odsyłam do pomocy w języku polskim zawartej w pakiecie OpenOffice 2.1. Ja natomiast zajmę się praktycznym wykorzystaniem najczęściej stosowanych funkcji i pokazaniem na przykładach do jakiego celu możemy je zastosować.
Wszystkie przykładowe pliki są wykonane w OpenOffice 1.1.4 po to aby i ci z Was co mają słabsze komputery mogli skorzystać z tego poradnika.
W pierwszej części poradnika zajmiemy się podstawami pisania makropoleceń i przykładami ich zastosowania. W części drugiej znajdującej się na następnym CD zajmiemy się już bardziej zaawansowanymi przykładami tworzenia okiem dialogowych, które mogą być zastosowane jak profesjonalne programy.
II. Nagrywanie najprostszych makr.
Dla nauki otwieramy OpenOffice Calc i zapisujemy arkusz jako „test”.
Najprostsze makra możemy nagrać poprzez polecenie z menu Narzędzia/Makra/Zarejestruj makro. Po uruchomieniu tej funkcji wszystko (prawie wszystko) co będziemy wykonywać w arkuszu zostanie nagrane jak na magnetofon i potem można to w każdej chwili uruchomić. Po zakończeniu nagrywania program otworzy okienko w celu zapisania nagrania.
Nasz arkusz zapisaliśmy pod nazwą test.ods(dla OpenOffice 2.1 a dla OpenOffice 1.1 będzie to test.sxc) i aby zapisać nagrane makro w tym właśnie arkuszu to należy kliknąć na znaczek „+” i zobaczymy tam bibliotekę (tak to się nazywa) „Standard”. Zaznaczamy ją i w okienku powyżej „Nazwa makra” wpisujemy nazwę naszego makra. Klikamy na Zapis i program jeszcze zaproponuje nam nazwę modułu „Module1” i zapisze nasze makro. Można makro zapisać w innym miejscu, ale to już jest wyższa szkoła jazdy i wykracza poza zakres tego poradnika. Tak zapisane makro będzie zawsze dostępne w arkuszu zapisanym jako „test”.
Tak zapisane makro możemy wywołać do ponownego wykonania poprzez wybranie z menu Narzędzia/Makra/Wykonaj makro.
Wyszukujemy nasze makro i klikamy „Uruchom”. Wcześniej nagrane czynności zostaną ponownie wykonane.
W ten sposób nagrane makro może wykonywać proste zadania ale jest mało efektywne. Ma długi kod i nie zawsze spełnia nasze oczekiwania. Tym sposobem zostało nagrane makro wpisujące w komórki od A1 do A4 kolejne cyfry i kod tego makra przedstawia się następująco:
sub mojeMakro
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "1"
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(1) as new com.sun.star.beans.PropertyValue
args3(0).Name = "By"
args3(0).Value = 1
args3(1).Name = "Sel"
args3(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args3())
rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "StringName"
args4(0).Value = "2"
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args4())
rem ----------------------------------------------------------------------
dim args5(1) as new com.sun.star.beans.PropertyValue
args5(0).Name = "By"
args5(0).Value = 1
args5(1).Name = "Sel"
args5(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args5())
rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "StringName"
args6(0).Value = "3"
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args6())
rem ----------------------------------------------------------------------
dim args7(1) as new com.sun.star.beans.PropertyValue
args7(0).Name = "By"
args7(0).Value = 1
args7(1).Name = "Sel"
args7(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args7())
rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "StringName"
args8(0).Value = "4"
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args8())
rem ----------------------------------------------------------------------
dim args9(1) as new com.sun.star.beans.PropertyValue
args9(0).Name = "By"
args9(0).Value = 1
args9(1).Name = "Sel"
args9(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args9())
end sub
Proponuję tu nie wnikać w szczegóły tego kodu, gdyż jest mało zrozumiały a ma wykonywać prostą czynność. Poniżej małymi kroczkami dojdziemy do napisania makra wykonującego to samo w wiele prostszy sposób.
III. Pierwsze pisane własnoręcznie makro.
Pomoc w OpenOffice nakazuje deklarowanie zmiennych wykorzystywanych w makrach, jednak nie jest to warunek tak bardzo niezbędny przy pisaniu mniej skomplikowanych makr. Zainteresowanych zasadami deklaracji zmiennych odsyłam do Pomocy.
W celu pisania makra należy uruchomić OpenOffice Basic. W tym celu w menu wybieramy Narzędzia/Makra/Zarządzaj Makrami/OpenOffice Basic (dla OO 2.1) a dla OO 1.1.4 wybieramy Narzędzia/Makra/Makro i tam odszukujemy nazwę naszego arkusza i w bibliotece „Standard” klikamy „Nowy” akceptujemy to co się ukaże OK. i otworzy się okno Basic.
Teraz możemy zacząć pisać makro. Makro zaczynamy instrukcja SUB „nazwa” i kończymy End Sub:
Sub mojeMakro1
.
.
.
End Sub
1. Zaczniemy od makra, w którym odczytamy wartość z komórki arkusza i wyświetlimy w oknie informacyjnym.
Odczytanie wartości komórki A6
oDocument=ThisComponent 'wyróżnienie aktywnego dok. (=>Selection)
oSheet=oDocument.Sheets.getByName("Arkusz1") 'wyróżnienie arkusza nr1
oCell=oSheet.getCellByPosition(0,5) 'wyróżnienie komórki A6
Z=oCell.getValue ‘przypisanie wartości LICZBOWEJ do zmiennej Z
Natomiast:
Z=oCell.getString ‘przypisanie wartości TEKSTOWEJ do zmiennej Z
W przypadku próby przypisania wartości TEKSTOWEJ do zmiennej LICZBOWEJ otrzymamy „0” a w przypadku odwrotnym otrzymamy liczbę ale zapisaną jako tekst i nie będzie można na niej wykonywać działań.
W przykładzie powyżej, wyróżnienie komórki A6 jest dokonane poprzez podanie jej pozycji KOLUMNA=>0, WIERSZ=>5. W OO inaczej niż w Ecelu są numerowane kolumny i wiersze. Numeracja zaczyna się od „0”.
Tą samą komórkę A6 możemy wybrać poprzez rozkaz:
oCell=oSheet.getCellRangeByName(„A6”) 'wyróżnienie komórki A6
Zwróć uwagę, że oDocument, oSeet, oCell to też są zmienne do których są dopisane fragmenty kodu basic i całkiem poprawny będzie też zapis:
Z= ThisComponent.Sheets.getByName("Arkusz1").getCellByPosition(0,5).getValue
Ale taki zapis jest mało czytelny.
No to już wiemy jak odczytać zawartość komórki. Teraz musimy jakoś pokazać co odczytaliśmy. Do tego służy instrukcja MsgBox. W najprostszej formie będzie to wyglądać tak:
MsgBox Z
Cały kod naszego pierwszego makra wygląda tak:
Sub mojeMakro1
oDocument=ThisComponent 'wyróżnienie aktywnego dok. (=>Selection)
oSheet=oDocument.Sheets.getByName("Arkusz1") 'wyróżnienie arkusza nr1
oCell=oSheet.getCellByPosition(0,5) 'wyróżnienie komórki A6
Z=oCell.getValue 'przypisanie wartości LICZBOWEJ do zmiennej Z
MsgBox Z & " To jest zmienna typu LICZBA"
Z=oCell.getString 'przypisanie wartości TEKSTOWEJ do zmiennej Z
MsgBox Z & " To jest zmienna typu TEKSTOWEGO"
End Sub
Teraz aby nam się łatwo uruchamiało makro wstawimy do naszego arkusza przycisk i przypiszemy do niego nasze makro. Zakładam, że każdy sobie poradzi w odszukaniu Formatów Formularza i znajdzie tam ikonę wstawiania przycisku. Wstawiamy przycisk i klikamy na nim prawym klawiszem i wybieramy „Format” oraz przechodzimy do zakładki „Wydarzenia”. Wyszukujemy „Naciśnięto przycisk myszy” i klikamy na przycisk za polem edycyjnym. Pokaże się okno jak niżej:
Zaznaczamy tak jak na rysunku i klikamy „Przypisz” a potem OK. Mamy już przypisane makro do przycisku. Jeszcze tylko trzeba wyłączyć TRYB PROJEKTU i możemy wypróbować nasze makro.
Teraz proszę uruchomić arkusz Przykład_1.sxc i wpisać w żółte pole liczbę np.: 123,34 i nacisnąć przycisk.
Przy wpisanej liczbie praktycznie nie widać różnicy w obu komunikatach. Wpiszmy dla odmiany słowo TEKST. I teraz widzimy różnicę pomiędzy zmienną typu „Value” a „String”. W przypadku zmiennej typu „Value” zamiast tekstu wpisanego do komórki wynikiem jest „0”
2. Teraz uprościmy makro, które nagraliśmy na wstępie.
Wpierw nauczymy się przypisywać wartość ze zmiennej do komórki czyli coś odwrotnego od tego co robiliśmy wyżej.
oDocument=ThisComponent 'wyróżnienie aktywnego dok. (=>Selection)
oSheet=oDocument.Sheets.getByName("Arkusz1") 'wyróżnienie arkusza nr1
oCell=oSheet.getCellRangeByName(„A6”) 'wyróżnienie komórki A6
oCell.setValue (Z) 'przypisanie zmiennej LICZBOWEJ „Z” do komórki
Pobranie zmiennej z komórki jest poprzez Get.Value a przypisanie zmiennej do komórki poprzez SetValue.
Zamiast zmiennej możemy przypisać po prostu liczbę:
oCell.setValue (12) 'przypisanie liczby do komórki
Nasze makro zastępujące to z początku wykładu będzie wyglądać następująco:
Sub mojeMakro2
oDocument=ThisComponent 'wyróżnienie aktywnego dok. (=>Selection)
oSheet=oDocument.Sheets.getByName("Arkusz1") 'wyróżnienie arkusza nr1
oCell=oSheet.getCellRangeByName("A1") 'wyróżnienie komórki A1
oCell.setValue (1) 'przypisanie wartości LICZBOWEJ do komórki
oCell=oSheet.getCellRangeByName("A2") 'wyróżnienie komórki A2
oCell.setValue (2) 'przypisanie wartości LICZBOWEJ do komórki
oCell=oSheet.getCellRangeByName("A3") 'wyróżnienie komórki A3
oCell.setValue (3) 'przypisanie wartości LICZBOWEJ do komórki
oCell=oSheet.getCellRangeByName("A4") 'wyróżnienie komórki A4
oCell.setValue (4) 'przypisanie wartości LICZBOWEJ do komórki
End Sub
Prawda ze jest o wiele krótsze i bardziej przejrzyste!?