Różnica pomiędzy stronami "Liczby losowe – metoda odwracania dystrybuanty" i "Komórki"
m (1 wersja) |
m (1 wersja) |
||
Linia 1: | Linia 1: | ||
− | <div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;"> | + | <div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">03.05.2020</div> |
− | |||
− | |||
− | + | == Uchwyt do komórek przez indeks lub przez nazwę, wpisywanie danych do komórek == | |
− | ::< | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki1() |
+ | <span style='color:#707070;'>'wpisywanie do komórek liczb, tekstu i formuł</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oA1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oB2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oC3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht = ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'uaktywnienie pierwszego arkusza</span> | ||
+ | oSht.getColumns().insertByIndex(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>4</span>) <span style='color:#707070;'>'dodajemy cztery kolumny na pozycję pierwszą</span> | ||
+ | |||
+ | <span style='color:#707070;'>'komórki możemy uchwycić przez indeks lub przez nazwę, dla komórek A1, B2 i C3 będziemy mieli:</span> | ||
+ | oA1 = oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do komórki A1 przez indeks</span> | ||
+ | oB2 = oSht.getCellRangebyName(<span style='color:#ff0000;'>"B2"</span>) <span style='color:#707070;'>'uchwyt do komórki B2 przez nazwę</span> | ||
+ | oC3 = oSht.getCellByPosition(<span style='color:#ff0000;'>2</span>, <span style='color:#ff0000;'>2</span>) <span style='color:#707070;'>'uchwyt do komórki C3 przez indeks</span> | ||
+ | |||
+ | <span style='color:#707070;'>'mając dostęp do komórek możemy wpisywać do nich liczby, tekst i formuły;</span> | ||
+ | <span style='color:#707070;'>'zauważmy, że nie musimy korzystać ze zdefiniowanych wyżej obiektów oA1, oB2 i oC3</span> | ||
+ | oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>).Value = <span style='color:#ff0000;'>3</span>/<span style='color:#ff0000;'>2</span> <span style='color:#707070;'>'wpisujemy liczbę do komórki A1 - nie korzystamy z obiektu oA1</span> | ||
+ | oB2.<span style='color:#000080;'>String</span> = <span style='color:#ff0000;'>"komórka B2"</span> <span style='color:#707070;'>'wpisujemy tekst do komórki B2</span> | ||
+ | oC3.Formula = <span style='color:#ff0000;'>"=2*A1"</span> <span style='color:#707070;'>'wpisujemy do komórki C3 formułę, która podwaja wartość komórki A1</span> | ||
+ | |||
+ | MsgBox oSht.getCellRangebyName(<span style='color:#ff0000;'>"B2"</span>).<span style='color:#000080;'>String</span> | ||
+ | MsgBox oC3.Value <span style='color:#707070;'>'mamy dostęp do wartości, która wynika z wpisanej do komórki formuły</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | + | Uchwyt przez nazwę jest bardzo czytelny, zdefiniowanie obiektu związanego z komórką skraca kod i upraszcza dostęp do komórki, ale uchwyt przez indeks ma ogromną przewagę: umożliwia przetwarzanie komórek za pomocą instrukcji For ... Next i z tego prostego powodu jest najczęściej stosowany. | |
− | |||
− | |||
− | |||
+ | == Sprawdzanie zawartości komórki i określanie jej typu == | ||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>TypKomorki(oCell <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span> | |
+ | <span style='color:#707070;'>'informuje o rodzaju danych zapisanych w komórce ([http://www.openoffice.org/api/docs/common/ref/com/sun/star/table/CellContentType.html LINK1]), ([https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1table.html LINK2])</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> s <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span> | ||
+ | <b><span style='color:#1f1c1b;'>Select Case</span></b> oCell.<b><span style='color:#1f1c1b;'>Type </span></b> | ||
+ | <b><span style='color:#1f1c1b;'>Case</span></b> com.sun.star.table.CellContentType.EMPTY | ||
+ | s = <span style='color:#ff0000;'>"Pusta"</span> | ||
+ | <b><span style='color:#1f1c1b;'>Case</span></b> com.sun.star.table.CellContentType.VALUE | ||
+ | s = <span style='color:#ff0000;'>"Liczba"</span> | ||
+ | <b><span style='color:#1f1c1b;'>Case</span></b> com.sun.star.table.CellContentType.TEXT | ||
+ | s = <span style='color:#ff0000;'>"Tekst"</span> | ||
+ | <b><span style='color:#1f1c1b;'>Case</span></b> com.sun.star.table.CellContentType.FORMULA | ||
+ | s = <span style='color:#ff0000;'>"Formuła"</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Select</span></b> | ||
+ | TypKomorki = s | ||
+ | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
− | ::< | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki2() |
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span> | ||
+ | MsgBox <span style='color:#0095ff;'>TypKomorki</span>( oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>0</span>) ) <span style='color:#707070;'>'A1</span> | ||
+ | MsgBox <span style='color:#0095ff;'>TypKomorki</span>( oSht.getCellByPosition(<span style='color:#ff0000;'>1</span>,<span style='color:#ff0000;'>1</span>) ) <span style='color:#707070;'>'B2</span> | ||
+ | MsgBox <span style='color:#0095ff;'>TypKomorki</span>( oSht.getCellByPosition(<span style='color:#ff0000;'>2</span>,<span style='color:#ff0000;'>2</span>) ) <span style='color:#707070;'>'C3</span> | ||
+ | MsgBox <span style='color:#0095ff;'>TypKomorki</span>( oSht.getCellByPosition(<span style='color:#ff0000;'>3</span>,<span style='color:#ff0000;'>3</span>) ) <span style='color:#707070;'>'D4</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
Linia 31: | Linia 69: | ||
− | == | + | == Wpisywanie daty do komórki == |
− | + | Datę możemy wpisać do komórki używając dwóch funkcji: '''DateSerial()''' i '''DateValue()'''. Parametrami dla funkcji DateSerial() są liczby całkowite: rok, miesiąc i dzień danej daty i wywołujemy ją następująco '''DateSerial(YYYY, MM, DD)'''. Parametrem dla funkcji '''DateValue()''' jest tekst zawierający te same dane i wywołujemy tę funkcję następująco '''DateValue("YYYY‑RR‑DD")'''. | |
− | ::< | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki3() |
− | + | <span style='color:#707070;'>'wpisywanie daty</span> | |
− | + | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA5 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA6 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | |
− | + | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | |
− | + | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span> | |
+ | oA5 <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>4</span>) <span style='color:#707070;'>'uchwyt do komórki A5</span> | ||
+ | oA6 <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>5</span>) <span style='color:#707070;'>'uchwyt do komórki A6</span> | ||
+ | oA5.Value <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(<span style='color:#ff0000;'>2000</span>, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'A5</span> | ||
+ | oA6.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(<span style='color:#ff0000;'>2000</span>, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'A6</span> | ||
+ | MsgBox oA5.Value + <span style='color:#ff0000;'>7</span> <span style='color:#707070;'>'36533 - liczba odpowiadająca dacie 08.01.2000</span> | ||
+ | MsgBox oA6.<span style='color:#000080;'>String</span> + <span style='color:#ff0000;'>7</span> <span style='color:#707070;'>'ciąg znaków "01.01.20007"</span> | ||
+ | <span style='color:#707070;'>'formuły wpisane do arkusza, które wykonują takie same obliczenia jak wyżej, nie zwrócą otrzymanych wyżej wartości</span> | ||
+ | oSht.getCellByPosition(<span style='color:#ff0000;'>1</span>,<span style='color:#ff0000;'>4</span>).Formula <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"=A5 + 7"</span> <span style='color:#707070;'>'36533 - wynik w komórce B5</span> | ||
+ | oSht.getCellByPosition(<span style='color:#ff0000;'>1</span>,<span style='color:#ff0000;'>5</span>).Formula <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"=A6 + 7"</span> <span style='color:#707070;'>'36533 - wynik w komórce B6</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | + | Datę wpisujemy jako wartość (.Value). W komórce pojawi się liczba całkowita odpowiadająca danej dacie i dopiero zmiana formatu komórki (Formatuj komórki → Liczby → Kategoria → Data) sprawi, że zostanie pokazana data w wybranym formacie. | |
− | + | Wpisanie daty jako ciąg znaków (.String) jest możliwe. Data zostanie zapisana w komórce jako tekst (standardowo dosunięty do lewej krawędzi komórki). Oczywiście wszelkie obliczenia na tak zapisanej dacie nie będą już możliwe. Wynika to stąd, że kod makra jest precyzyjny – musimy określić typ wartości zapisanej w komórce (.Value, .String, .Formula), do której się odwołujemy. | |
− | |||
− | |||
− | |||
− | |||
+ | W arkuszu wygląda to zupełnie inaczej, bo formuła odwołuje się do komórki, ale w komórce może być wpisana liczba, tekst lub formuła. Problem ten rozwiązano, przyjmując zasadę, że w arkuszu wszystko, co da się zinterpretować jako liczba, należy tak interpretować. | ||
− | + | Dlatego w arkuszu zostanie wykonane dodawanie: "777" + 1 = 778, jak również dodawanie: "01.01.2000" + 7 = 8.01.2000 | |
− | |||
− | |||
− | |||
+ | == Wpisywanie daty i formatowanie postaci, w jakiej zostanie wyświetlona == | ||
+ | Możemy wpisać do komórki datę i ustawić format, w jakim zostanie wyświetlona. W tym celu należy dla komórki, do której wpisujemy datę, określić jej własność '''NumberFormat'''. Poniżej podaję jakie liczby trzeba wpisać dla najbardziej popularnych formatów daty w przypadku języka polskiego: | ||
+ | 36 – 31.12.1999<br/> | ||
+ | 37 – 31.12.99<br/> | ||
+ | 38 – piątek 31 grudnia 1999<br/> | ||
+ | 76 – 31 grudnia 1999<br/> | ||
+ | 81 – 31 grudnia 1999 r.<br/> | ||
+ | 84 – 1999-12-31<br/> | ||
− | + | Inne wartości łatwo znaleźć rejestrując makro i zmieniając formatowanie komórki. W kodzie zarejestrowanego makra odnajdziemy zawsze tekst '''NumberFormatValue''' i odpowiednią liczbę poniżej. Przykład formatowania: | |
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki4() | |
+ | <span style='color:#707070;'>'wpisywanie daty i formatowanie postaci w jakiej zostanie wyświetlona</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA7 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span> | ||
+ | oA7 <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>6</span>) <span style='color:#707070;'>'uchwyt do komórki A7</span> | ||
+ | oA7.Value <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateValue</span>(<span style='color:#ff0000;'>"1999-12-31"</span>) <span style='color:#707070;'>'36525 - liczba odpowiadająca dacie 31.12.1999</span> | ||
+ | oA7.NumberFormat <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>36</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | |||
− | + | == Wpisywanie wartości logicznej do komórki == | |
− | |||
− | |||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki5() | |
+ | <span style='color:#707070;'>'wpisywanie wartości logicznej</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span> | ||
+ | oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>9</span>).Value <span style='color:#000080;'>=</span> True <span style='color:#707070;'>'A10</span> | ||
+ | oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>10</span>).Value <span style='color:#000080;'>=</span> False <span style='color:#707070;'>'A11</span> | ||
+ | MsgBox <span style='color:#ff0000;'>"W komórkach A10 i A11 widoczne są liczby: -1 i 0"</span> | ||
+ | <span style='color:#707070;'>'formatujemy komórki, aby zamiast liczb -1 i 0 zostały wyświetlone słowa PRAWDA / TRUE i FAŁSZ / FALSE</span> | ||
+ | oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>9</span>).NumberFormat <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>99</span> <span style='color:#707070;'>'A10</span> | ||
+ | oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>10</span>).NumberFormat <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>99</span> <span style='color:#707070;'>'A11</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | + | Wartości logiczne wpisujemy tylko jako wartość (.Value). Standardowo wartości logicznej PRAWDA odpowiada liczba -1, a wartości logicznej FAŁSZ odpowiada liczba 0. Należy pamiętać, że każda liczba różna od zera zostanie zinterpretowana jako wartość logiczna PRAWDA, a tylko liczbie zero odpowiada wartość logiczna FAŁSZ. | |
− | |||
− | |||
− | |||
+ | == Wpisywanie tekstu do komórki i podstawowe formatowanie == | ||
+ | Wpisany do komórki tekst wymaga zazwyczaj ustawienia wielu rożnych opcji formatowania. W tym przykładzie podajemy tylko podstawowe, a w następnym podamy kolejne. | ||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki6() | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oCll <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oCll <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>).getCellByPosition(<span style='color:#ff0000;'>2</span>, <span style='color:#ff0000;'>2</span>) | ||
+ | oCll.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"abcd"</span> | ||
+ | oCll.CellBackColor <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>255</span>, <span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'kolor tła komórki</span> | ||
+ | |||
+ | <span style='color:#707070;'>'ustawienie tekstu w poziomie (STANDARD, LEFT, CENTER, RIGHT, BLOCK, REPEAT) ([https://www.openoffice.org/api/docs/common/ref/com/sun/star/table/CellHoriJustify.html LINK1]), ([https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1table.html LINK2])</span> | ||
+ | oCll.HoriJustify <span style='color:#000080;'>=</span> com.sun.star.table.CellHoriJustify.RIGHT | ||
+ | |||
+ | <span style='color:#707070;'>'ustawienie tekstu w pionie (STANDARD, TOP, CENTER, BOTTOM) ([https://www.openoffice.org/api/docs/common/ref/com/sun/star/table/CellVertJustify.html LINK1]), ([https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1table.html LINK2])</span> | ||
+ | oCll.VertJustify <span style='color:#000080;'>=</span> com.sun.star.table.CellVertJustify.BOTTOM | ||
+ | |||
+ | <span style='color:#707070;'>'orientacja tekstu</span> | ||
+ | oCll.RotateAngle <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>9000</span> <span style='color:#707070;'>'90 stopni obrotu w lewo</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | + | Uwaga: | |
+ | <span style="color: green">oRows.getByIndex(<span style='color:#ff0000;'>0</span>).CellBackColor <span style='color:#000080;'>=</span> -<span style='color:#ff0000;'>1</span> <span style='color:#707070;'>'ustawia brak koloru</span></span> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | == Wpisywanie tekstu do komórki i dalsze formatowanie == | |
− | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki7() | ||
+ | <span style='color:#707070;'>'wpisywanie tekstu do komórki i formatowanie komórki</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRow <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA15 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span> | ||
+ | oRow <span style='color:#000080;'>=</span> oSht.getRows().getByIndex(<span style='color:#ff0000;'>14</span>) <span style='color:#707070;'>'uchwyt do wiersza o indeksie 14</span> | ||
+ | oRow.Height <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1500</span> <span style='color:#707070;'>'ustawia wysokość wiersza równą 15 mm</span> | ||
+ | oA15 <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>14</span>) <span style='color:#707070;'>'uchwyt do komórki A15</span> | ||
+ | oA15.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"Komórka A15"</span> | ||
+ | oA15.CellBackColor <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>204</span>, <span style='color:#ff0000;'>153</span>, <span style='color:#ff0000;'>102</span>) <span style='color:#707070;'>'kolor tła komórki</span> | ||
+ | oA15.CharHeight <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>14</span> <span style='color:#707070;'>'rozmiar czcionki</span> | ||
+ | |||
+ | <span style='color:#707070;'>'grubość czcionki (DONTKNOW, THIN, ULTRALIGHT, LIGHT, SEMILIGHT, NORMAL, SEMIBOLD, BOLD, ULTRABOLD, BLACK) ([http://www.openoffice.org/api/docs/common/ref/com/sun/star/style/CharacterProperties.html LINK1]), ([http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/FontWeight.html LINK2])</span> | ||
+ | oA15.CharWeight <span style='color:#000080;'>=</span> com.sun.star.awt.FontWeight.BOLD | ||
+ | |||
+ | oA15.setPropertyValue( <span style='color:#ff0000;'>"IsTextWrapped"</span>, True ) <span style='color:#707070;'>'zawija tekst automatycznie</span> | ||
+ | oA15.HoriJustify <span style='color:#000080;'>=</span> com.sun.star.table.CellHoriJustify.CENTER <span style='color:#707070;'>'wyśrodkowanie tekstu w poziomie</span> | ||
+ | oA15.VertJustify <span style='color:#000080;'>=</span> com.sun.star.table.CellVertJustify.CENTER <span style='color:#707070;'>'wyśrodkowanie tekstu w pionie</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | == Formatowanie komórki liczbowej == | |
− | + | Funkcja oblicza liczbę całkowitą, która określa, jak zostanie sformatowana komórka liczbowa. Najłatwiej kod formatu (parametr sNumFormat) uzyskać wykorzystując okno "Formatuj komórki". Wybieramy potrzebne ustawienia (liczba miejsc po przecinku, separator tysięcy itd.), kopiujemy otrzymany kod i wykorzystujemy go jako parametr sNumFormat. ([https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Formatting_Spreadsheet_Documents LINK]) | |
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>NumberFormatId( sNumFormat <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>, sLanguage <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>, sCountry <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span> ) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | ||
+ | <span style='color:#707070;'>'Dla USA: sLanguage="en", sCountry="us"</span> | ||
+ | <span style='color:#707070;'>'Przykładowo: sNumFormat="# ###,00"</span> | ||
+ | <span style='color:#707070;'>'Sposób użycia: Cell.NumberFormat <span style='color:#000080;'>=</span> NumberFormatId("# ###,00", "pl", "pl")</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> LocalSettings <b><span style='color:#1f1c1b;'>As</span></b> New com.sun.star.lang.Locale | ||
+ | |||
+ | LocalSettings.Language <span style='color:#000080;'>=</span> sLanguage | ||
+ | LocalSettings.Country <span style='color:#000080;'>=</span> sCountry | ||
+ | NumberFormatId <span style='color:#000080;'>=</span> ThisComponent.NumberFormats.queryKey(sNumFormat, LocalSettings, True) | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>NumberFormatId <span style='color:#000080;'>=</span> -<span style='color:#ff0000;'>1</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | NumberFormatId <span style='color:#000080;'>=</span> ThisComponent.NumberFormats.addNew(sNumFormat, LocalSettings) | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
− | === | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki8() |
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oA1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oA1 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>).getCellRangeByName(<span style='color:#ff0000;'>"A1"</span>) <span style='color:#707070;'>'uchwyt do komórki A1 przez nazwę</span> | ||
+ | oA1.Value <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>12345.6789</span> | ||
+ | oA1.NumberFormat <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>NumberFormatId</span>(<span style='color:#ff0000;'>"# ###,00"</span>, <span style='color:#ff0000;'>"pl"</span>, <span style='color:#ff0000;'>"pl"</span>) | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | |||
− | + | == Odczytywanie zawartości komórki i operacje na takich danych == | |
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki9() | ||
+ | <span style='color:#707070;'>'odczytywanie wartości komórki i opercje na tych wartościach</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oA1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oC1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oC2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> x <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>, y <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> s <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span> | ||
+ | oA1 <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyty do komórek</span> | ||
+ | oA2 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"A2"</span>) | ||
+ | oA3 <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>2</span>) | ||
+ | oC1 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"C1"</span>) | ||
+ | oC2 <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>2</span>, <span style='color:#ff0000;'>1</span>) | ||
+ | |||
+ | oA1.Value <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>5</span> <span style='color:#707070;'>'zapisujemy liczbę w komórce A1</span> | ||
+ | oA2.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"To jest formuła: "</span> <span style='color:#707070;'>'zapisujemy tekst w komórce A2</span> | ||
+ | oA3.Formula <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"=2*A1"</span> <span style='color:#707070;'>'zapisujemy formułę w komórce A3</span> | ||
+ | |||
+ | x <span style='color:#000080;'>=</span> oA1.Value <span style='color:#707070;'>'odczytujemy liczbę zapisaną w komórce A1</span> | ||
+ | s <span style='color:#000080;'>=</span> oA2.<span style='color:#000080;'>String</span> <span style='color:#707070;'>'odczytujemy tekst zapisany w komórce A2</span> | ||
+ | y <span style='color:#000080;'>=</span> oA3.Value <span style='color:#707070;'>'odczytujemy LICZBĘ wyliczoną z formuły zapisanej w komórce A3</span> | ||
+ | |||
+ | oC1.Value <span style='color:#000080;'>=</span> x + y <span style='color:#707070;'>'zapisujemy sumę liczb z komórek A1 i A3</span> | ||
+ | oC2.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> s & oA3.Formula <span style='color:#707070;'>'zapisujemy połączone teksty: z komórki A2 i odczytaną formułę z komórki A3</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | : | + | Jeszcze jeden przykład: |
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki10() | |
+ | <span style='color:#707070;'>'operacje na wartościach odczytanych z komórek</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oA1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oA4 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oB1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oB2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oB3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oB4 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span> | ||
+ | oSht.getColumns().insertByIndex(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>3</span>) <span style='color:#707070;'>'dodajemy trzy kolumny na pozycję pierwszą</span> | ||
+ | oA1 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"A1"</span>) <span style='color:#707070;'>'uchwyt do komórki A1 przez nazwę</span> | ||
+ | oA2 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"A2"</span>) | ||
+ | oA3 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"A3"</span>) | ||
+ | oA4 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"A4"</span>) | ||
+ | oB1 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"B1"</span>) | ||
+ | oB2 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"B2"</span>) | ||
+ | oB3 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"B3"</span>) | ||
+ | oB4 <span style='color:#000080;'>=</span> oSht.getCellRangebyName(<span style='color:#ff0000;'>"B4"</span>) | ||
+ | |||
+ | <span style='color:#707070;'>'wpisywanie danych</span> | ||
+ | oA1.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"abc"</span> | ||
+ | oA2.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"123"</span> | ||
+ | oB1.Value <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>5</span> | ||
+ | oB2.Value <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>7</span> | ||
+ | |||
+ | <span style='color:#707070;'>'wpisywanie sumy odczytanych wartości do nowej komórki ([https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Operators LINK])</span> | ||
+ | oA3.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> oA1.<span style='color:#000080;'>String</span> & oA2.<span style='color:#000080;'>String</span> | ||
+ | oB3.Value <span style='color:#000080;'>=</span> oB1.Value + oB2.Value | ||
+ | |||
+ | <span style='color:#707070;'>'operator + można stosować do tekstu, a operator & do liczb - zobacz rezultat ([https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Operators LINK])</span> | ||
+ | oA4.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> oA1.<span style='color:#000080;'>String</span> + oA2.<span style='color:#000080;'>String</span> | ||
+ | oB4.Value <span style='color:#000080;'>=</span> oB1.Value & oB2.Value | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
+ | == Ważne własności komórki == | ||
− | + | Dysponując uchwytem do komórki, możemy uzyskać uchwyt do arkusza, z którego pochodzi komórka. Poza tym możemy poznać indeks tego arkusza oraz indeks kolumny i wiersza, w których komórka jest położona. | |
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki11() | |
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oCll <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>).getCellByPosition(<span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>2</span>) | ||
+ | oSht <span style='color:#000080;'>=</span> oCll.Spreadsheet <span style='color:#707070;'>'uchwyt do arkusza komórki</span> | ||
+ | MsgBox oSht.getName() | ||
+ | |||
+ | <span style='color:#707070;'>'indeks arkusza, kolumny i wiersza</span> | ||
+ | MsgBox oCll.getCellAddress().Sheet | ||
+ | MsgBox oCll.getCellAddress().Column | ||
+ | MsgBox oCll.getCellAddress().Row | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | + | == Obramowanie wokół komórek == | |
− | |||
+ | Procedura pozwala utworzyć obramowanie wokół komórki. Zauważmy od razu, że procedurę można łatwo rozbudować: | ||
+ | ::* w przypadku LStyle = 3 (linia podwójna) możemy ustawić szerokość każdej z linii i odległość między nimi – dodając nowe parametry możemy w pełni wykorzystać te możliwości | ||
+ | ::* zamiast jednego obiektu oBorder możemy utworzyć cztery różne obiekty: oBorder1, oBorder2, oBorder3, oBorder4 i przypisać je osobno do każdej krawędzi komórki: górnej, prawej, dolnej i lewej | ||
+ | Przedstawiamy wariant najprostszy, wystarczający w większości przypadków, ale warto pamiętać o możliwości łatwego napisania bardziej skomplikowanych wersji. | ||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>RangeBorder(oRng <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, LColor <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, LStyle <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, LWidth <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>) | ||
+ | <span style='color:#707070;'>'LStyle: 0-ciągła, 1-kropkowana, 2-przerywana, 3-podwójna, ... ([https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1table_1_1BorderLineStyle.html LINK])</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oBorder <b><span style='color:#1f1c1b;'>as New</span></b> com.sun.star.table.BorderLine2 | ||
+ | oBorder.Color <span style='color:#000080;'>=</span> LColor | ||
+ | oBorder.LineStyle <span style='color:#000080;'>=</span> LStyle | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>LStyle <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>3</span> <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#707070;'>'DOUBLE</span> | ||
+ | <span style='color:#707070;'>'InnerLineWidth - szerokość linii wewnętrznej w 1/100 mm (gdy równa zero, rysowana jest tylko jedna linia)</span> | ||
+ | <span style='color:#707070;'>'LineDistance - odległość między linią wewnętrzną i linią zewnętrzną w 1/100 mm</span> | ||
+ | <span style='color:#707070;'>'OuterLineWidth - szerokość pojedynczej linii lub szerokość linii zewnętrznej w 1/100 mm</span> | ||
+ | <span style='color:#707070;'>'(gdy równa zero, żadna linia nie jest rysowana)</span> | ||
+ | oBorder.InnerLineWidth <span style='color:#000080;'>=</span> LWidth | ||
+ | oBorder.LineDistance <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>2</span> * LWidth | ||
+ | oBorder.OuterLineWidth <span style='color:#000080;'>=</span> LWidth | ||
+ | <b><span style='color:#1f1c1b;'>Else</span></b> | ||
+ | <span style='color:#707070;'>'LineWidth - szerokość linii w 1/100 mm (gdy równa zero, żadna linia nie jest rysowana)</span> | ||
+ | <span style='color:#707070;'>'szerokość linii możemy ustawić dla LStyle <span style='color:#000080;'>=</span> 0, 1, 2, 14, 16, 17</span> | ||
+ | oBorder.LineWidth <span style='color:#000080;'>=</span> LWidth | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | <b><span style='color:#1f1c1b;'>With</span></b> oRng | ||
+ | .TopBorder <span style='color:#000080;'>=</span> oBorder | ||
+ | .RightBorder <span style='color:#000080;'>=</span> oBorder | ||
+ | .BottomBorder <span style='color:#000080;'>=</span> oBorder | ||
+ | .LeftBorder <span style='color:#000080;'>=</span> oBorder | ||
+ | <b><span style='color:#1f1c1b;'>End With</span></b> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | == | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki12() |
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, n <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRng <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getCurrentController().getActiveSheet() <span style='color:#707070;'>'uchwyt do aktywnego arkusza</span> | ||
+ | oSht.getColumns().insertByIndex(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>20</span>) <span style='color:#707070;'>'dodajemy dwadzieścia kolumn na pozycję pierwszą</span> | ||
+ | <b><span style='color:#1f1c1b;'>For </span></b>n <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>4</span> | ||
+ | oSht.getCellByPosition(<span style='color:#ff0000;'>2</span>*n, <span style='color:#ff0000;'>0</span>).Value <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>20</span>*n | ||
+ | <b><span style='color:#1f1c1b;'>For </span></b>k <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>17</span> | ||
+ | oSht.getCellByPosition(n, <span style='color:#ff0000;'>2</span>*k+<span style='color:#ff0000;'>2</span>).Value <span style='color:#000080;'>=</span> k | ||
+ | oRng <span style='color:#000080;'>=</span> oSht.getCellRangeByPosition(<span style='color:#ff0000;'>2</span>*n, <span style='color:#ff0000;'>2</span>*k+<span style='color:#ff0000;'>2</span>, <span style='color:#ff0000;'>2</span>*n, <span style='color:#ff0000;'>2</span>*k+<span style='color:#ff0000;'>2</span>) | ||
+ | <b><span style='color:#000000;'>Call</span></b> RangeBorder(oRng, <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>), k, <span style='color:#ff0000;'>20</span>*n) | ||
+ | <b><span style='color:#1f1c1b;'>Next </span></b>k | ||
+ | <b><span style='color:#1f1c1b;'>Next </span></b>n | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | == Kasowanie zawartości komórki == | ||
− | + | Nim wykonamy kasowanie zawartości komórki, musimy ustalić co chcemy skasować. Różnym typom zawartości przypisane zostały różne liczby:<br/> | |
+ | VALUE (1) - liczby niesformatowane jako data i czas<br/> | ||
+ | DATETIME (2) - liczby sformatowane jako data i czas<br/> | ||
+ | STRING (4) - tekst<br/> | ||
+ | ANNOTATION (8) - komentarze<br/> | ||
+ | FORMULA (16) - formuły<br/> | ||
+ | Zobacz więcej: ([http://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/CellFlags.html LINK]) | ||
− | + | Ustalamy, co chcemy skasować, wybieramy odpowiednie liczby i sumujemy. Znaleziona suma jest parametrem dla metody '''clearContents'''. | |
− | |||
− | |||
− | |||
− | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki13() | ||
+ | <span style='color:#707070;'>'usuwanie zawartości komórki</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | oCll <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"A1"</span>) <span style='color:#707070;'>'tworzymy uchwyt do komórki</span> | ||
+ | oCll.clearContents(<span style='color:#ff0000;'>7</span>) <span style='color:#707070;'>'usuwa liczby, liczby sformatowane jako data i czas oraz tekst</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | == | + | == Kopiowanie komórek == |
− | + | Musimy przygotować uchwyty do każdej z komórek (kopiowanej i docelowej), a następnie wywołać metodę arkusza '''copyRange''' z odpowiednimi parametrami ([https://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangeMovement.html#copyRange LINK]). | |
− | |||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki14() | |
+ | <span style='color:#707070;'>'kopiowanie komórki Cll1 do komórki Cll2</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | |||
+ | <span style='color:#707070;'>'tworzymy uchwyty do obydwu komórek:</span> | ||
+ | oCll1 <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"A1"</span>) | ||
+ | oCll2 <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"B2"</span>) | ||
+ | |||
+ | <span style='color:#707070;'>'kopiowanie wymaga wywołania metody arkusza '''copyRange''' z następującymi parametrami:</span> | ||
+ | oSht.copyRange( oCll2.getCellAddress(), oCll1.getRangeAddress() ) | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
+ | Gdybyśmy z jakiegoś powodu nie mieli uchwytu do arkusza, z którego wzięliśmy komórki, to możemy zrobić tak: | ||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki15() | ||
+ | <span style='color:#707070;'>'kopiowanie komórki Cll1 do komórki Cll2</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oCll1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oCll1 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>).getCellRangeByName(<span style='color:#ff0000;'>"A1"</span>) | ||
+ | oCll2 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>).getCellRangeByName(<span style='color:#ff0000;'>"B2"</span>) | ||
+ | oCll1.Spreadsheet.copyRange( oCll2.getCellAddress(), oCll1.getRangeAddress() ) | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
+ | Jeżeli chcemy komórkę przekopiować do innego arkusza, to postępujemy analogicznie: | ||
− | == | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki16() |
+ | <span style='color:#707070;'>'kopiowanie komórki Cll1 pierwszego arkusza do komórki Cll2 drugiego arkusza</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oSht2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht1 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | oSht2 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'uchwyt do drugiego arkusza</span> | ||
+ | |||
+ | <span style='color:#707070;'>'tworzymy uchwyty do obydwu komórek:</span> | ||
+ | oCll1 <span style='color:#000080;'>=</span> oSht1.getCellRangeByName(<span style='color:#ff0000;'>"A1"</span>) | ||
+ | oCll2 <span style='color:#000080;'>=</span> oSht2.getCellRangeByName(<span style='color:#ff0000;'>"B2"</span>) | ||
+ | |||
+ | <span style='color:#707070;'>'tak samo, jak to uczyniliśmy wyżej, wywołujemy metodę '''copyRange''' (dowolnego arkusza):</span> | ||
+ | oSht1.copyRange( oCll2.getCellAddress(), oCll1.getRangeAddress() ) | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | == Przesuwanie komórek == | ||
− | + | Przesuwanie komórek z jednego miejsca arkusza w inne lub z jednego arkusza na drugi wykonujemy dokładnie tak samo, jak kopiowanie. Musimy tym razem użyć metody arkusza '''moveRange''' ([https://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangeMovement.html#moveRange LINK]). Dlatego poprzestaniemy na jednym przykładzie. | |
− | + | Musimy przygotować uchwyty do każdej z komórek (kopiowanej i docelowej), a następnie wywołać metodę arkusza '''moveRange''' z odpowiednimi parametrami. | |
− | |||
− | |||
− | |||
− | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki17() | ||
+ | <span style='color:#707070;'>'przesuwanie komórki Cll1 w miejsce komórki Cll2</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | |||
+ | <span style='color:#707070;'>'tworzymy uchwyty do obydwu komórek:</span> | ||
+ | oCll1 <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"A1"</span>) | ||
+ | oCll2 <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"B2"</span>) | ||
+ | |||
+ | <span style='color:#707070;'>'przesuwanie wymaga wywołania metody arkusza '''moveRange''' z następującymi parametrami:</span> | ||
+ | oSht.moveRange( oCll2.getCellAddress(), oCll1.getRangeAddress() ) | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | == | + | == Usuwanie komórek == |
− | + | Metoda arkusza '''removeRange''' usuwa "fizycznie" wybraną komórkę (jeśli można tak powiedzieć o komórce, która istnieje tylko wirtualnie). Dlatego musimy określić jakie dodatkowe działanie zostanie wykonane, aby w arkuszu nie pozostała "dziura". Mamy do wyboru następujące opcje: | |
+ | ::*NONE - '''removeRange''' nie robi nic | ||
+ | ::*UP - komórka zostaje usunięta, komórki leżące poniżej zostaną przesunięte w górę | ||
+ | ::*LEFT - komórka zostaje usunięta, komórki leżące na prawo zostaną przesunięte w lewo | ||
+ | ::*ROWS - komórka zostaje usunięta, wiersze leżące poniżej zostaną przesunięte w górę | ||
+ | ::*COLUMNS - komórka zostaje usunięta, kolumny leżące na prawo zostaną przesunięte w lewo | ||
− | |||
+ | Opcja ROWS odpowiada usunięciu wiersza, w którym położona była komórka. Opcja COLUMNS odpowiada usunięciu kolumny, w której położona była komórka. ([https://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangeMovement.html#removeRange LINK1]), ([https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Cells_and_Ranges LINK2]) | ||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Komorki18() | |
+ | <span style='color:#707070;'>'usuwanie komórki B2</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | ||
+ | oCll <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"B2"</span>) <span style='color:#707070;'>'uchwyt do komórki B2</span> | ||
+ | oSht.removeRange( oCll.getRangeAddress(), com.sun.star.sheet.CellDeleteMode.UP ) <span style='color:#707070;'>'metoda '''removeRange''' z parametrem UP</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
Linia 264: | Linia 499: | ||
− | == | + | == Polecane strony internetowe == |
− | + | [https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Cells_and_Ranges BASIC Guide – Cells and Ranges] | |
− | : | + | [https://wiki.openoffice.org/wiki/Spreadsheet_common#Working_with_cells Spreadsheet common – Working with cells] |
− | |||
− | |||
− | |||
− | + | [http://www.openoffice.org/api/docs/common/ref/com/sun/star/table/CellProperties.html Apache OpenOffice – service CellProperties] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | [[LibreOffice Calc – makra | <b>LibreOffice Calc – makra</b>]] [[Henryk Dąbrowski | <b>Strona główna</b>]] | ||
Aktualna wersja na dzień 22:36, 18 wrz 2022
Uchwyt do komórek przez indeks lub przez nazwę, wpisywanie danych do komórek
Sub Komorki1()
'wpisywanie do komórek liczb, tekstu i formuł
Dim oSht as Object
Dim oA1 as Object, oB2 as Object, oC3 as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'uaktywnienie pierwszego arkusza
oSht.getColumns().insertByIndex(0, 4) 'dodajemy cztery kolumny na pozycję pierwszą
'komórki możemy uchwycić przez indeks lub przez nazwę, dla komórek A1, B2 i C3 będziemy mieli:
oA1 = oSht.getCellByPosition(0, 0) 'uchwyt do komórki A1 przez indeks
oB2 = oSht.getCellRangebyName("B2") 'uchwyt do komórki B2 przez nazwę
oC3 = oSht.getCellByPosition(2, 2) 'uchwyt do komórki C3 przez indeks
'mając dostęp do komórek możemy wpisywać do nich liczby, tekst i formuły;
'zauważmy, że nie musimy korzystać ze zdefiniowanych wyżej obiektów oA1, oB2 i oC3
oSht.getCellByPosition(0, 0).Value = 3/2 'wpisujemy liczbę do komórki A1 - nie korzystamy z obiektu oA1
oB2.String = "komórka B2" 'wpisujemy tekst do komórki B2
oC3.Formula = "=2*A1" 'wpisujemy do komórki C3 formułę, która podwaja wartość komórki A1
MsgBox oSht.getCellRangebyName("B2").String
MsgBox oC3.Value 'mamy dostęp do wartości, która wynika z wpisanej do komórki formuły
End Sub
Uchwyt przez nazwę jest bardzo czytelny, zdefiniowanie obiektu związanego z komórką skraca kod i upraszcza dostęp do komórki, ale uchwyt przez indeks ma ogromną przewagę: umożliwia przetwarzanie komórek za pomocą instrukcji For ... Next i z tego prostego powodu jest najczęściej stosowany.
Sprawdzanie zawartości komórki i określanie jej typu
Function TypKomorki(oCell as Object) as String
'informuje o rodzaju danych zapisanych w komórce (LINK1), (LINK2)
Dim s as String
Select Case oCell.Type
Case com.sun.star.table.CellContentType.EMPTY
s = "Pusta"
Case com.sun.star.table.CellContentType.VALUE
s = "Liczba"
Case com.sun.star.table.CellContentType.TEXT
s = "Tekst"
Case com.sun.star.table.CellContentType.FORMULA
s = "Formuła"
End Select
TypKomorki = s
End Function
Sub Komorki2()
Dim oSht as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
MsgBox TypKomorki( oSht.getCellByPosition(0,0) ) 'A1
MsgBox TypKomorki( oSht.getCellByPosition(1,1) ) 'B2
MsgBox TypKomorki( oSht.getCellByPosition(2,2) ) 'C3
MsgBox TypKomorki( oSht.getCellByPosition(3,3) ) 'D4
End Sub
Wpisywanie daty do komórki
Datę możemy wpisać do komórki używając dwóch funkcji: DateSerial() i DateValue(). Parametrami dla funkcji DateSerial() są liczby całkowite: rok, miesiąc i dzień danej daty i wywołujemy ją następująco DateSerial(YYYY, MM, DD). Parametrem dla funkcji DateValue() jest tekst zawierający te same dane i wywołujemy tę funkcję następująco DateValue("YYYY‑RR‑DD").
Sub Komorki3()
'wpisywanie daty
Dim oSht as Object, oA5 as Object, oA6 as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
oA5 = oSht.getCellByPosition(0,4) 'uchwyt do komórki A5
oA6 = oSht.getCellByPosition(0,5) 'uchwyt do komórki A6
oA5.Value = DateSerial(2000, 1, 1) 'A5
oA6.String = DateSerial(2000, 1, 1) 'A6
MsgBox oA5.Value + 7 '36533 - liczba odpowiadająca dacie 08.01.2000
MsgBox oA6.String + 7 'ciąg znaków "01.01.20007"
'formuły wpisane do arkusza, które wykonują takie same obliczenia jak wyżej, nie zwrócą otrzymanych wyżej wartości
oSht.getCellByPosition(1,4).Formula = "=A5 + 7" '36533 - wynik w komórce B5
oSht.getCellByPosition(1,5).Formula = "=A6 + 7" '36533 - wynik w komórce B6
End Sub
Datę wpisujemy jako wartość (.Value). W komórce pojawi się liczba całkowita odpowiadająca danej dacie i dopiero zmiana formatu komórki (Formatuj komórki → Liczby → Kategoria → Data) sprawi, że zostanie pokazana data w wybranym formacie.
Wpisanie daty jako ciąg znaków (.String) jest możliwe. Data zostanie zapisana w komórce jako tekst (standardowo dosunięty do lewej krawędzi komórki). Oczywiście wszelkie obliczenia na tak zapisanej dacie nie będą już możliwe. Wynika to stąd, że kod makra jest precyzyjny – musimy określić typ wartości zapisanej w komórce (.Value, .String, .Formula), do której się odwołujemy.
W arkuszu wygląda to zupełnie inaczej, bo formuła odwołuje się do komórki, ale w komórce może być wpisana liczba, tekst lub formuła. Problem ten rozwiązano, przyjmując zasadę, że w arkuszu wszystko, co da się zinterpretować jako liczba, należy tak interpretować.
Dlatego w arkuszu zostanie wykonane dodawanie: "777" + 1 = 778, jak również dodawanie: "01.01.2000" + 7 = 8.01.2000
Wpisywanie daty i formatowanie postaci, w jakiej zostanie wyświetlona
Możemy wpisać do komórki datę i ustawić format, w jakim zostanie wyświetlona. W tym celu należy dla komórki, do której wpisujemy datę, określić jej własność NumberFormat. Poniżej podaję jakie liczby trzeba wpisać dla najbardziej popularnych formatów daty w przypadku języka polskiego:
36 – 31.12.1999
37 – 31.12.99
38 – piątek 31 grudnia 1999
76 – 31 grudnia 1999
81 – 31 grudnia 1999 r.
84 – 1999-12-31
Inne wartości łatwo znaleźć rejestrując makro i zmieniając formatowanie komórki. W kodzie zarejestrowanego makra odnajdziemy zawsze tekst NumberFormatValue i odpowiednią liczbę poniżej. Przykład formatowania:
Sub Komorki4()
'wpisywanie daty i formatowanie postaci w jakiej zostanie wyświetlona
Dim oSht as Object, oA7 as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
oA7 = oSht.getCellByPosition(0,6) 'uchwyt do komórki A7
oA7.Value = DateValue("1999-12-31") '36525 - liczba odpowiadająca dacie 31.12.1999
oA7.NumberFormat = 36
End Sub
Wpisywanie wartości logicznej do komórki
Sub Komorki5()
'wpisywanie wartości logicznej
Dim oSht as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
oSht.getCellByPosition(0,9).Value = True 'A10
oSht.getCellByPosition(0,10).Value = False 'A11
MsgBox "W komórkach A10 i A11 widoczne są liczby: -1 i 0"
'formatujemy komórki, aby zamiast liczb -1 i 0 zostały wyświetlone słowa PRAWDA / TRUE i FAŁSZ / FALSE
oSht.getCellByPosition(0,9).NumberFormat = 99 'A10
oSht.getCellByPosition(0,10).NumberFormat = 99 'A11
End Sub
Wartości logiczne wpisujemy tylko jako wartość (.Value). Standardowo wartości logicznej PRAWDA odpowiada liczba -1, a wartości logicznej FAŁSZ odpowiada liczba 0. Należy pamiętać, że każda liczba różna od zera zostanie zinterpretowana jako wartość logiczna PRAWDA, a tylko liczbie zero odpowiada wartość logiczna FAŁSZ.
Wpisywanie tekstu do komórki i podstawowe formatowanie
Wpisany do komórki tekst wymaga zazwyczaj ustawienia wielu rożnych opcji formatowania. W tym przykładzie podajemy tylko podstawowe, a w następnym podamy kolejne.
Sub Komorki6()
Dim oCll as Object
oCll = ThisComponent.getSheets().getByIndex(0).getCellByPosition(2, 2)
oCll.String = "abcd"
oCll.CellBackColor = RGB(255, 0, 0) 'kolor tła komórki
'ustawienie tekstu w poziomie (STANDARD, LEFT, CENTER, RIGHT, BLOCK, REPEAT) (LINK1), (LINK2)
oCll.HoriJustify = com.sun.star.table.CellHoriJustify.RIGHT
'ustawienie tekstu w pionie (STANDARD, TOP, CENTER, BOTTOM) (LINK1), (LINK2)
oCll.VertJustify = com.sun.star.table.CellVertJustify.BOTTOM
'orientacja tekstu
oCll.RotateAngle = 9000 '90 stopni obrotu w lewo
End Sub
Uwaga:
oRows.getByIndex(0).CellBackColor = -1 'ustawia brak koloru
Wpisywanie tekstu do komórki i dalsze formatowanie
Sub Komorki7()
'wpisywanie tekstu do komórki i formatowanie komórki
Dim oSht as Object, oRow as Object, oA15 as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
oRow = oSht.getRows().getByIndex(14) 'uchwyt do wiersza o indeksie 14
oRow.Height = 1500 'ustawia wysokość wiersza równą 15 mm
oA15 = oSht.getCellByPosition(0,14) 'uchwyt do komórki A15
oA15.String = "Komórka A15"
oA15.CellBackColor = RGB(204, 153, 102) 'kolor tła komórki
oA15.CharHeight = 14 'rozmiar czcionki
'grubość czcionki (DONTKNOW, THIN, ULTRALIGHT, LIGHT, SEMILIGHT, NORMAL, SEMIBOLD, BOLD, ULTRABOLD, BLACK) (LINK1), (LINK2)
oA15.CharWeight = com.sun.star.awt.FontWeight.BOLD
oA15.setPropertyValue( "IsTextWrapped", True ) 'zawija tekst automatycznie
oA15.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER 'wyśrodkowanie tekstu w poziomie
oA15.VertJustify = com.sun.star.table.CellVertJustify.CENTER 'wyśrodkowanie tekstu w pionie
End Sub
Formatowanie komórki liczbowej
Funkcja oblicza liczbę całkowitą, która określa, jak zostanie sformatowana komórka liczbowa. Najłatwiej kod formatu (parametr sNumFormat) uzyskać wykorzystując okno "Formatuj komórki". Wybieramy potrzebne ustawienia (liczba miejsc po przecinku, separator tysięcy itd.), kopiujemy otrzymany kod i wykorzystujemy go jako parametr sNumFormat. (LINK)
Function NumberFormatId( sNumFormat as String, sLanguage as String, sCountry as String ) as Long
'Dla USA: sLanguage="en", sCountry="us"
'Przykładowo: sNumFormat="# ###,00"
'Sposób użycia: Cell.NumberFormat = NumberFormatId("# ###,00", "pl", "pl")
Dim LocalSettings As New com.sun.star.lang.Locale
LocalSettings.Language = sLanguage
LocalSettings.Country = sCountry
NumberFormatId = ThisComponent.NumberFormats.queryKey(sNumFormat, LocalSettings, True)
If NumberFormatId = -1 Then
NumberFormatId = ThisComponent.NumberFormats.addNew(sNumFormat, LocalSettings)
End If
End Function
Sub Komorki8()
Dim oA1 as Object
oA1 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("A1") 'uchwyt do komórki A1 przez nazwę
oA1.Value = 12345.6789
oA1.NumberFormat = NumberFormatId("# ###,00", "pl", "pl")
End Sub
Odczytywanie zawartości komórki i operacje na takich danych
Sub Komorki9()
'odczytywanie wartości komórki i opercje na tych wartościach
Dim oSht as Object
Dim oA1 as Object, oA2 as Object, oA3 as Object
Dim oC1 as Object, oC2 as Object
Dim x as Double, y as Double
Dim s as String
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
oA1 = oSht.getCellByPosition(0, 0) 'uchwyty do komórek
oA2 = oSht.getCellRangebyName("A2")
oA3 = oSht.getCellByPosition(0, 2)
oC1 = oSht.getCellRangebyName("C1")
oC2 = oSht.getCellByPosition(2, 1)
oA1.Value = 5 'zapisujemy liczbę w komórce A1
oA2.String = "To jest formuła: " 'zapisujemy tekst w komórce A2
oA3.Formula = "=2*A1" 'zapisujemy formułę w komórce A3
x = oA1.Value 'odczytujemy liczbę zapisaną w komórce A1
s = oA2.String 'odczytujemy tekst zapisany w komórce A2
y = oA3.Value 'odczytujemy LICZBĘ wyliczoną z formuły zapisanej w komórce A3
oC1.Value = x + y 'zapisujemy sumę liczb z komórek A1 i A3
oC2.String = s & oA3.Formula 'zapisujemy połączone teksty: z komórki A2 i odczytaną formułę z komórki A3
End Sub
Jeszcze jeden przykład:
Sub Komorki10()
'operacje na wartościach odczytanych z komórek
Dim oSht as Object
Dim oA1 as Object, oA2 as Object, oA3 as Object, oA4 as Object
Dim oB1 as Object, oB2 as Object, oB3 as Object, oB4 as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
oSht.getColumns().insertByIndex(0, 3) 'dodajemy trzy kolumny na pozycję pierwszą
oA1 = oSht.getCellRangebyName("A1") 'uchwyt do komórki A1 przez nazwę
oA2 = oSht.getCellRangebyName("A2")
oA3 = oSht.getCellRangebyName("A3")
oA4 = oSht.getCellRangebyName("A4")
oB1 = oSht.getCellRangebyName("B1")
oB2 = oSht.getCellRangebyName("B2")
oB3 = oSht.getCellRangebyName("B3")
oB4 = oSht.getCellRangebyName("B4")
'wpisywanie danych
oA1.String = "abc"
oA2.String = "123"
oB1.Value = 5
oB2.Value = 7
'wpisywanie sumy odczytanych wartości do nowej komórki (LINK)
oA3.String = oA1.String & oA2.String
oB3.Value = oB1.Value + oB2.Value
'operator + można stosować do tekstu, a operator & do liczb - zobacz rezultat (LINK)
oA4.String = oA1.String + oA2.String
oB4.Value = oB1.Value & oB2.Value
End Sub
Ważne własności komórki
Dysponując uchwytem do komórki, możemy uzyskać uchwyt do arkusza, z którego pochodzi komórka. Poza tym możemy poznać indeks tego arkusza oraz indeks kolumny i wiersza, w których komórka jest położona.
Sub Komorki11()
Dim oSht as Object, oCll as Object
oCll = ThisComponent.getSheets().getByIndex(0).getCellByPosition(1, 2)
oSht = oCll.Spreadsheet 'uchwyt do arkusza komórki
MsgBox oSht.getName()
'indeks arkusza, kolumny i wiersza
MsgBox oCll.getCellAddress().Sheet
MsgBox oCll.getCellAddress().Column
MsgBox oCll.getCellAddress().Row
End Sub
Obramowanie wokół komórek
Procedura pozwala utworzyć obramowanie wokół komórki. Zauważmy od razu, że procedurę można łatwo rozbudować:
- w przypadku LStyle = 3 (linia podwójna) możemy ustawić szerokość każdej z linii i odległość między nimi – dodając nowe parametry możemy w pełni wykorzystać te możliwości
- zamiast jednego obiektu oBorder możemy utworzyć cztery różne obiekty: oBorder1, oBorder2, oBorder3, oBorder4 i przypisać je osobno do każdej krawędzi komórki: górnej, prawej, dolnej i lewej
Przedstawiamy wariant najprostszy, wystarczający w większości przypadków, ale warto pamiętać o możliwości łatwego napisania bardziej skomplikowanych wersji.
Sub RangeBorder(oRng as Object, LColor as Long, LStyle as Long, LWidth as Long)
'LStyle: 0-ciągła, 1-kropkowana, 2-przerywana, 3-podwójna, ... (LINK)
Dim oBorder as New com.sun.star.table.BorderLine2
oBorder.Color = LColor
oBorder.LineStyle = LStyle
If LStyle = 3 Then 'DOUBLE
'InnerLineWidth - szerokość linii wewnętrznej w 1/100 mm (gdy równa zero, rysowana jest tylko jedna linia)
'LineDistance - odległość między linią wewnętrzną i linią zewnętrzną w 1/100 mm
'OuterLineWidth - szerokość pojedynczej linii lub szerokość linii zewnętrznej w 1/100 mm
'(gdy równa zero, żadna linia nie jest rysowana)
oBorder.InnerLineWidth = LWidth
oBorder.LineDistance = 2 * LWidth
oBorder.OuterLineWidth = LWidth
Else
'LineWidth - szerokość linii w 1/100 mm (gdy równa zero, żadna linia nie jest rysowana)
'szerokość linii możemy ustawić dla LStyle = 0, 1, 2, 14, 16, 17
oBorder.LineWidth = LWidth
End If
With oRng
.TopBorder = oBorder
.RightBorder = oBorder
.BottomBorder = oBorder
.LeftBorder = oBorder
End With
End Sub
Sub Komorki12()
Dim k as Long, n as Long
Dim oSht as Object, oRng as Object
oSht = ThisComponent.getCurrentController().getActiveSheet() 'uchwyt do aktywnego arkusza
oSht.getColumns().insertByIndex(0, 20) 'dodajemy dwadzieścia kolumn na pozycję pierwszą
For n = 0 To 4
oSht.getCellByPosition(2*n, 0).Value = 20*n
For k = 0 To 17
oSht.getCellByPosition(n, 2*k+2).Value = k
oRng = oSht.getCellRangeByPosition(2*n, 2*k+2, 2*n, 2*k+2)
Call RangeBorder(oRng, RGB(0, 0, 0), k, 20*n)
Next k
Next n
End Sub
Kasowanie zawartości komórki
Nim wykonamy kasowanie zawartości komórki, musimy ustalić co chcemy skasować. Różnym typom zawartości przypisane zostały różne liczby:
VALUE (1) - liczby niesformatowane jako data i czas
DATETIME (2) - liczby sformatowane jako data i czas
STRING (4) - tekst
ANNOTATION (8) - komentarze
FORMULA (16) - formuły
Zobacz więcej: (LINK)
Ustalamy, co chcemy skasować, wybieramy odpowiednie liczby i sumujemy. Znaleziona suma jest parametrem dla metody clearContents.
Sub Komorki13()
'usuwanie zawartości komórki
Dim oSht as Object, oCll as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
oCll = oSht.getCellRangeByName("A1") 'tworzymy uchwyt do komórki
oCll.clearContents(7) 'usuwa liczby, liczby sformatowane jako data i czas oraz tekst
End Sub
Kopiowanie komórek
Musimy przygotować uchwyty do każdej z komórek (kopiowanej i docelowej), a następnie wywołać metodę arkusza copyRange z odpowiednimi parametrami (LINK).
Sub Komorki14()
'kopiowanie komórki Cll1 do komórki Cll2
Dim oSht as Object, oCll1 as Object, oCll2 as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
'tworzymy uchwyty do obydwu komórek:
oCll1 = oSht.getCellRangeByName("A1")
oCll2 = oSht.getCellRangeByName("B2")
'kopiowanie wymaga wywołania metody arkusza copyRange z następującymi parametrami:
oSht.copyRange( oCll2.getCellAddress(), oCll1.getRangeAddress() )
End Sub
Gdybyśmy z jakiegoś powodu nie mieli uchwytu do arkusza, z którego wzięliśmy komórki, to możemy zrobić tak:
Sub Komorki15()
'kopiowanie komórki Cll1 do komórki Cll2
Dim oCll1 as Object, oCll2 as Object
oCll1 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("A1")
oCll2 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("B2")
oCll1.Spreadsheet.copyRange( oCll2.getCellAddress(), oCll1.getRangeAddress() )
End Sub
Jeżeli chcemy komórkę przekopiować do innego arkusza, to postępujemy analogicznie:
Sub Komorki16()
'kopiowanie komórki Cll1 pierwszego arkusza do komórki Cll2 drugiego arkusza
Dim oSht1 as Object, oSht2 as Object, oCll1 as Object, oCll2 as Object
oSht1 = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
oSht2 = ThisComponent.getSheets().getByIndex(1) 'uchwyt do drugiego arkusza
'tworzymy uchwyty do obydwu komórek:
oCll1 = oSht1.getCellRangeByName("A1")
oCll2 = oSht2.getCellRangeByName("B2")
'tak samo, jak to uczyniliśmy wyżej, wywołujemy metodę copyRange (dowolnego arkusza):
oSht1.copyRange( oCll2.getCellAddress(), oCll1.getRangeAddress() )
End Sub
Przesuwanie komórek
Przesuwanie komórek z jednego miejsca arkusza w inne lub z jednego arkusza na drugi wykonujemy dokładnie tak samo, jak kopiowanie. Musimy tym razem użyć metody arkusza moveRange (LINK). Dlatego poprzestaniemy na jednym przykładzie.
Musimy przygotować uchwyty do każdej z komórek (kopiowanej i docelowej), a następnie wywołać metodę arkusza moveRange z odpowiednimi parametrami.
Sub Komorki17()
'przesuwanie komórki Cll1 w miejsce komórki Cll2
Dim oSht as Object, oCll1 as Object, oCll2 as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
'tworzymy uchwyty do obydwu komórek:
oCll1 = oSht.getCellRangeByName("A1")
oCll2 = oSht.getCellRangeByName("B2")
'przesuwanie wymaga wywołania metody arkusza moveRange z następującymi parametrami:
oSht.moveRange( oCll2.getCellAddress(), oCll1.getRangeAddress() )
End Sub
Usuwanie komórek
Metoda arkusza removeRange usuwa "fizycznie" wybraną komórkę (jeśli można tak powiedzieć o komórce, która istnieje tylko wirtualnie). Dlatego musimy określić jakie dodatkowe działanie zostanie wykonane, aby w arkuszu nie pozostała "dziura". Mamy do wyboru następujące opcje:
- NONE - removeRange nie robi nic
- UP - komórka zostaje usunięta, komórki leżące poniżej zostaną przesunięte w górę
- LEFT - komórka zostaje usunięta, komórki leżące na prawo zostaną przesunięte w lewo
- ROWS - komórka zostaje usunięta, wiersze leżące poniżej zostaną przesunięte w górę
- COLUMNS - komórka zostaje usunięta, kolumny leżące na prawo zostaną przesunięte w lewo
Opcja ROWS odpowiada usunięciu wiersza, w którym położona była komórka. Opcja COLUMNS odpowiada usunięciu kolumny, w której położona była komórka. (LINK1), (LINK2)
Sub Komorki18()
'usuwanie komórki B2
Dim oSht as Object, oCll as Object
oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
oCll = oSht.getCellRangeByName("B2") 'uchwyt do komórki B2
oSht.removeRange( oCll.getRangeAddress(), com.sun.star.sheet.CellDeleteMode.UP ) 'metoda removeRange z parametrem UP
End Sub
Polecane strony internetowe
BASIC Guide – Cells and Ranges
Spreadsheet common – Working with cells
Apache OpenOffice – service CellProperties
LibreOffice Calc – makra Strona główna