Różnica pomiędzy stronami "Kara śmierci – cytaty/en" i "Terminarz"
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;">08.06.2021</div> |
− | |||
+ | Przedstawiamy niżej prosty, ale z pewnością użyteczny kod, który pozwoli użytkownikowi stworzyć terminarz obejmujący powtarzające się zadania oraz wydarzenia wypadające w ustalonych dniach roku. Kod składa się z pięciu podprogramów: funkcji MonthDays() i DzienTygodnia() oraz procedury RangeBorder() – te podprogramy zostały zdefiniowane wcześniej i Czytelnik może się z nimi łatwo zapoznać. Dodatkowo mamy procedurę główną Terminarz(), która określa, jak będzie budowany nasz terminarz i procedurę pomocniczą CellFormat(), która określa, jak zostanie sformatowana komórka, do której wpisujemy dane. | ||
+ | Wydarzenia wypadające w określonych dniach roku zostały zebrane w arkuszu o ustalonej nazwie „Dni” i nazwy tej nie należy zmieniać bez wprowadzenia odpowiedniej zmiany w kodzie procedury Terminarz(). Daty w kolumnie A arkusza „Dni", to kolejne dni dowolnego roku przestępnego. W kolumnie B wpisujemy tekst opisujący wydarzenie związane z określonym dniem miesiąca. Dla przykładu w kolumnie B zostały wpisane popularne imieniny i niektóre święta. Dane z arkusza „Dni” zostaną wpisane w tworzonym przez nas terminarzu w kolumnie F. | ||
+ | <b>Przed uruchomieniem</b> procedury Terminarz() musimy ustalić i wpisać do jej kodu wartości trzech zmiennych: <b>Start</b>, <b>Koniec</b> oraz <b>k</b>. Zmienna Start (typu Date) określa pierwszy dzień od którego zacznie się budowanie terminarza, zaś zmienna k (typu Long) określa <b>indeks</b> wiersza, od którego rozpocznie się budowanie terminarza i do którego zostanie wpisana wartość zmiennej Start. Zmienna Koniec (typu Date) określa ostatni dzień, który zostanie uwzględniony w tworzonym terminarzu. Należy pamiętać, że terminarz zostanie utworzony w pierwszym arkuszu naszego skoroszytu, zatem skoroszyt poza arkuszem „Dni” musi mieć przynajmniej jeden dodatkowy arkusz. | ||
− | + | Powtarzające się terminy można podzielić na takie, które wypadają w określonym dniu miesiąca i na takie, które wypadają w określonym dniu tygodnia. Sposoby badania, czy w danym dniu wypadają interesujące nas terminy, zostały pokazane w przykładowym kodzie procedury Terminarz(). Zdefiniowane przez nas terminy zostaną wpisane w utworzonym terminarzu w kolumnie D. | |
− | |||
+ | Link do skoroszytu [https://henryk-dabrowski.pl/pliki/terminarz/Terminarz.ods Terminarz.ods] | ||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Terminarz() | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> Licz <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, wiersz <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, t <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, MonthEnd <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> notatka <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> d <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span>, Start <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span>, Koniec <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oShtDni <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oColumns <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>, oCllA <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCllB <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oShtDni <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByName(<span style='color:#ff0000;'>"Dni"</span>) <span style='color:#707070;'>'uchwyt do arkusza o nazwie "Dni"</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> | ||
+ | Start <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(<span style='color:#ff0000;'>2021</span>, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'początek terminarza</span> | ||
+ | Koniec <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(<span style='color:#ff0000;'>2021</span>, <span style='color:#ff0000;'>12</span>, <span style='color:#ff0000;'>31</span>) <span style='color:#707070;'>'koniec terminarza</span> | ||
+ | k <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <span style='color:#707070;'>'UWAGA: k odpowiada indeksowi wiersza z datą Start</span> | ||
+ | d <span style='color:#000080;'>=</span> Start | ||
+ | <b><span style='color:#1f1c1b;'>Do While </span></b>d <= Koniec | ||
+ | Licz <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <span style='color:#707070;'>'zmienna Licz zlicza, ile wykonano wpisów pod tą samą datą w kolumnie D</span> | ||
+ | t <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Weekday</span>(d) <span style='color:#707070;'>'niedziela-1, sobota-7</span> | ||
+ | MonthEnd <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>MonthDays</span>( <span style='color:#0095ff;'>Year</span>(d), <span style='color:#0095ff;'>Month</span>(d) ) | ||
+ | oRow <span style='color:#000080;'>=</span> oSht.getRows().getByIndex(k) <span style='color:#707070;'>'uchwyt do wiersza o indeksie k</span> | ||
+ | oCllA <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>, k) <span style='color:#707070;'>'uchwyt do komórki A wiersza o indeksie k</span> | ||
+ | oCllB <span style='color:#000080;'>=</span> oSht.getCellByPosition(<span style='color:#ff0000;'>1</span>, k) <span style='color:#707070;'>'uchwyt do komórki B wiersza o indeksie k</span> | ||
+ | oCllA.Value <span style='color:#000080;'>=</span> d | ||
+ | <span style='color:#707070;'>'formatowanie komórki A:</span> | ||
+ | oCllA.NumberFormat <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>36</span> <span style='color:#707070;'>'format daty: 31.12.1999</span> | ||
+ | oCllA.VertJustify <span style='color:#000080;'>=</span> com.sun.star.table.CellVertJustify.CENTER <span style='color:#707070;'>'wyśrodkowanie tekstu w pionie</span> | ||
+ | |||
+ | oCllB.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DzienTygodnia</span>(d) | ||
+ | <span style='color:#707070;'>'formatowanie komórki B:</span> | ||
+ | oCllB.HoriJustify <span style='color:#000080;'>=</span> com.sun.star.table.CellHoriJustify.CENTER <span style='color:#707070;'>'wyśrodkowanie tekstu w poziomie</span> | ||
+ | oCllB.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;'>If </span></b>t <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span> <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#707070;'>'niedziela</span> | ||
+ | oRow.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;'>'czerwony kolor tła wiersza</span> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | |||
+ | <span style='color:#707070;'>'Informacja dotycząca wybranych dni roku z arkusza "Dni" (wpis w kolumnie F)</span> | ||
+ | wiersz <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(<span style='color:#ff0000;'>2000</span>, <span style='color:#0095ff;'>Month</span>(d), <span style='color:#0095ff;'>Day</span>(d)) - <span style='color:#ff0000;'>36526</span> <span style='color:#707070;'>'indeks wiersza w arkuszu "Dni" z notatką odpowiadającą dacie d</span> | ||
+ | notatka <span style='color:#000080;'>=</span> oShtDni.getCellByPosition(<span style='color:#ff0000;'>1</span>, wiersz).<span style='color:#000080;'>String</span> | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>notatka <> <span style='color:#ff0000;'>""</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | <b><span style='color:#000000;'>Call</span></b> CellFormat( oSht.getCellByPosition(<span style='color:#ff0000;'>5</span>, k), notatka, <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>204</span>, <span style='color:#ff0000;'>255</span>, <span style='color:#ff0000;'>204</span>) ) | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | |||
+ | <span style='color:#707070;'>'Powtarzające się terminy - dotyczące dni miesiąca (wpis w kolumnie D)</span> | ||
+ | |||
+ | <b><span style='color:#1f1c1b;'>If </span></b>Day(d) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>7</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | <b><span style='color:#000000;'>Call</span></b> CellFormat( oSht.getCellByPosition(<span style='color:#ff0000;'>3</span>, k + Licz), <span style='color:#ff0000;'>"Siódmy dzień miesiąca"</span>, <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>153</span>, <span style='color:#ff0000;'>204</span>, <span style='color:#ff0000;'>255</span>) ) | ||
+ | Licz <span style='color:#000080;'>=</span> Licz + <span style='color:#ff0000;'>1</span> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | |||
+ | <span style='color:#707070;'>'Powtarzające się terminy - dotyczące dni tygodnia (wpis w kolumnie D)</span> | ||
+ | |||
+ | <span style='color:#707070;'>'czwartek co dwa tygodnie począwszy od 07.01.2021</span> | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>t <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>5</span> <b><span style='color:#000000;'>AND</span></b> (d - <span style='color:#0095ff;'>DateSerial</span>(<span style='color:#ff0000;'>2021</span>, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>7</span>)) <b><span style='color:#000000;'>Mod</span></b> <span style='color:#ff0000;'>14</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | <b><span style='color:#000000;'>Call</span></b> CellFormat( oSht.getCellByPosition(<span style='color:#ff0000;'>3</span>, k + Licz), <span style='color:#ff0000;'>"Spotkanie w czwartek (co dwa tygodnie)"</span>, <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>204</span>, <span style='color:#ff0000;'>204</span>, <span style='color:#ff0000;'>204</span>) ) | ||
+ | Licz <span style='color:#000080;'>=</span> Licz + <span style='color:#ff0000;'>1</span> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | |||
+ | <span style='color:#707070;'>'pierwszy czwartek miesiąca</span> | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>t <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>5</span> <b><span style='color:#000000;'>AND</span></b> <span style='color:#0095ff;'>Day</span>(d) >= <span style='color:#ff0000;'>1</span> <b><span style='color:#000000;'>AND</span></b> <span style='color:#0095ff;'>Day</span>(d) <= <span style='color:#ff0000;'>7</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | <b><span style='color:#000000;'>Call</span></b> CellFormat( oSht.getCellByPosition(<span style='color:#ff0000;'>3</span>, k + Licz), <span style='color:#ff0000;'>"Pierwszy czwartek miesiąca"</span>, <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>255</span>, <span style='color:#ff0000;'>255</span>, <span style='color:#ff0000;'>204</span>) ) | ||
+ | Licz <span style='color:#000080;'>=</span> Licz + <span style='color:#ff0000;'>1</span> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | |||
+ | <span style='color:#707070;'>'ostatni czwartek miesiąca</span> | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>t <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>5</span> <b><span style='color:#000000;'>AND</span></b> <span style='color:#0095ff;'>Day</span>(d) >= MonthEnd-<span style='color:#ff0000;'>6</span> <b><span style='color:#000000;'>AND</span></b> <span style='color:#0095ff;'>Day</span>(d) <= MonthEnd <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | <b><span style='color:#000000;'>Call</span></b> CellFormat( oSht.getCellByPosition(<span style='color:#ff0000;'>3</span>, k + Licz), <span style='color:#ff0000;'>"Ostatni czwartek miesiąca"</span>, <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>123</span>, <span style='color:#ff0000;'>204</span>, <span style='color:#ff0000;'>153</span>) ) | ||
+ | Licz <span style='color:#000080;'>=</span> Licz + <span style='color:#ff0000;'>1</span> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | |||
+ | <span style='color:#707070;'>'Końcowe formatowanie wpisu - scalanie komórek</span> | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>Licz > <span style='color:#ff0000;'>1</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | oSht.getCellRangeByPosition(<span style='color:#ff0000;'>0</span>, k, <span style='color:#ff0000;'>0</span>, k + Licz - <span style='color:#ff0000;'>1</span>).merge(True) <span style='color:#707070;'>'scalamy komórki w kolumnach: A,B,C,E,F,G,H</span> | ||
+ | oSht.getCellRangeByPosition(<span style='color:#ff0000;'>1</span>, k, <span style='color:#ff0000;'>1</span>, k + Licz - <span style='color:#ff0000;'>1</span>).merge(True) | ||
+ | oSht.getCellRangeByPosition(<span style='color:#ff0000;'>2</span>, k, <span style='color:#ff0000;'>2</span>, k + Licz - <span style='color:#ff0000;'>1</span>).merge(True) | ||
+ | oSht.getCellRangeByPosition(<span style='color:#ff0000;'>4</span>, k, <span style='color:#ff0000;'>4</span>, k + Licz - <span style='color:#ff0000;'>1</span>).merge(True) | ||
+ | oSht.getCellRangeByPosition(<span style='color:#ff0000;'>5</span>, k, <span style='color:#ff0000;'>5</span>, k + Licz - <span style='color:#ff0000;'>1</span>).merge(True) | ||
+ | oSht.getCellRangeByPosition(<span style='color:#ff0000;'>6</span>, k, <span style='color:#ff0000;'>6</span>, k + Licz - <span style='color:#ff0000;'>1</span>).merge(True) | ||
+ | oSht.getCellRangeByPosition(<span style='color:#ff0000;'>7</span>, k, <span style='color:#ff0000;'>7</span>, k + Licz - <span style='color:#ff0000;'>1</span>).merge(True) | ||
+ | k <span style='color:#000080;'>=</span> k + Licz | ||
+ | <b><span style='color:#1f1c1b;'>Else</span></b> | ||
+ | k <span style='color:#000080;'>=</span> k + <span style='color:#ff0000;'>1</span> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | d <span style='color:#000080;'>=</span> d + <span style='color:#ff0000;'>1</span> | ||
+ | <b><span style='color:#1f1c1b;'>Loop</span></b> | ||
+ | |||
+ | oColumns <span style='color:#000080;'>=</span> oSht.getColumns() <span style='color:#707070;'>'uchwyt do kolumn pierwszego arkusza</span> | ||
+ | oColumns.getByIndex(<span style='color:#ff0000;'>2</span>).Width <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>500</span> <span style='color:#707070;'>'szerokość kolumny C - 5 mm</span> | ||
+ | oColumns.getByIndex(<span style='color:#ff0000;'>3</span>).Width <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>7000</span> <span style='color:#707070;'>'szerokość kolumny D - 70 mm</span> | ||
+ | oColumns.getByIndex(<span style='color:#ff0000;'>4</span>).Width <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1500</span> <span style='color:#707070;'>'szerokość kolumny E - 15 mm</span> | ||
+ | oColumns.getByIndex(<span style='color:#ff0000;'>5</span>).Width <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>7000</span> <span style='color:#707070;'>'szerokość kolumny F - 70 mm</span> | ||
+ | oColumns.getByIndex(<span style='color:#ff0000;'>6</span>).Width <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1500</span> <span style='color:#707070;'>'szerokość kolumny G - 15 mm</span> | ||
+ | oColumns.getByIndex(<span style='color:#ff0000;'>7</span>).Width <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>7000</span> <span style='color:#707070;'>'szerokość kolumny H - 70 mm</span> | ||
+ | MsgBox <span style='color:#ff0000;'>"Ukończono!"</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | '' | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>CellFormat(oCll <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, CellString <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>, CellColor <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>) |
− | + | <b><span style='color:#1f1c1b;'>Dim</span></b> CellRow <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | |
+ | CellRow <span style='color:#000080;'>=</span> oCll.getCellAddress().Row | ||
+ | oCll.Spreadsheet.getRows().getByIndex(CellRow).Height <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1000</span> <span style='color:#707070;'>'ustawia wysokość wiersza równą 10 mm</span> | ||
+ | oCll.<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> CellString <span style='color:#707070;'>'wpisuje tekst</span> | ||
+ | oCll.CellBackColor <span style='color:#000080;'>=</span> CellColor <span style='color:#707070;'>'ustawia kolor tła komórki</span> | ||
+ | oCll.CharHeight <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>11</span> <span style='color:#707070;'>'rozmiar czcionki</span> | ||
+ | oCll.CharWeight <span style='color:#000080;'>=</span> com.sun.star.awt.FontWeight.NORMAL <span style='color:#707070;'>'zwykła czcionka</span> | ||
+ | oCll.setPropertyValue( <span style='color:#ff0000;'>"IsTextWrapped"</span>, True ) <span style='color:#707070;'>'zawija tekst automatycznie</span> | ||
+ | oCll.HoriJustify <span style='color:#000080;'>=</span> com.sun.star.table.CellHoriJustify.CENTER <span style='color:#707070;'>'wyśrodkowanie tekstu w poziomie</span> | ||
+ | oCll.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:#000000;'>Call</span></b> RangeBorder(oCll, <span style='color:#0095ff;'>RGB</span>(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>), <span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>26</span>) <span style='color:#707070;'>'obramowanie komórki</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>MonthDays(myYear <b><span style='color:#1f1c1b;'>As</span></b> <span style='color:#000080;'>Long</span>, myMonth <b><span style='color:#1f1c1b;'>As</span></b> <span style='color:#000080;'>Long</span>) <b><span style='color:#1f1c1b;'>As</span></b> <span style='color:#000080;'>Long</span> | ||
+ | <span style='color:#707070;'>'znajduje liczbę dni w miesiącu danego roku</span> | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>myMonth <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>12</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | MonthDays <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>31</span> | ||
+ | <b><span style='color:#1f1c1b;'>Else</span></b> | ||
+ | MonthDays <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Day</span>(DateSerial(myYear, myMonth + <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>1</span>) - <span style='color:#ff0000;'>1</span>) | ||
+ | <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;'>Function </span></b>DzienTygodnia(Dzien <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span> | ||
+ | <span style='color:#707070;'>'funkcja zwraca nazwę dnia tygodnia</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> aNazwy() <span style='color:#707070;'>'deklaracja pustej tablicy</span> | ||
+ | <span style='color:#707070;'>'funkcja <span style='color:#0095ff;'>Array</span>() tworzy tablicę typu Variant i numeruje elementy od 0</span> | ||
+ | aNazwy <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Array</span>(<span style='color:#ff0000;'>"niedziela"</span>, <span style='color:#ff0000;'>"poniedziałek"</span>, <span style='color:#ff0000;'>"wtorek"</span>, <span style='color:#ff0000;'>"środa"</span>, <span style='color:#ff0000;'>"czwartek"</span>, <span style='color:#ff0000;'>"piątek"</span>, <span style='color:#ff0000;'>"sobota"</span>) | ||
+ | DzienTygodnia <span style='color:#000080;'>=</span> aNazwy( <span style='color:#0095ff;'>Weekday</span>(Dzien) - <span style='color:#ff0000;'>1</span> ) | ||
+ | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
+ | <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</span></b> New com.sun.star.table.BorderLine2 | ||
+ | oBorder.<b><span style='color:#000000;'>Color</span></b> <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> | ||
− | |||
− | |||
− | |||
− | |||
− | + | [[LibreOffice Calc – makra | <b>LibreOffice Calc – makra</b>]] [[Henryk Dąbrowski | <b>Strona główna</b>]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Aktualna wersja na dzień 21:36, 18 wrz 2022
Przedstawiamy niżej prosty, ale z pewnością użyteczny kod, który pozwoli użytkownikowi stworzyć terminarz obejmujący powtarzające się zadania oraz wydarzenia wypadające w ustalonych dniach roku. Kod składa się z pięciu podprogramów: funkcji MonthDays() i DzienTygodnia() oraz procedury RangeBorder() – te podprogramy zostały zdefiniowane wcześniej i Czytelnik może się z nimi łatwo zapoznać. Dodatkowo mamy procedurę główną Terminarz(), która określa, jak będzie budowany nasz terminarz i procedurę pomocniczą CellFormat(), która określa, jak zostanie sformatowana komórka, do której wpisujemy dane.
Wydarzenia wypadające w określonych dniach roku zostały zebrane w arkuszu o ustalonej nazwie „Dni” i nazwy tej nie należy zmieniać bez wprowadzenia odpowiedniej zmiany w kodzie procedury Terminarz(). Daty w kolumnie A arkusza „Dni", to kolejne dni dowolnego roku przestępnego. W kolumnie B wpisujemy tekst opisujący wydarzenie związane z określonym dniem miesiąca. Dla przykładu w kolumnie B zostały wpisane popularne imieniny i niektóre święta. Dane z arkusza „Dni” zostaną wpisane w tworzonym przez nas terminarzu w kolumnie F.
Przed uruchomieniem procedury Terminarz() musimy ustalić i wpisać do jej kodu wartości trzech zmiennych: Start, Koniec oraz k. Zmienna Start (typu Date) określa pierwszy dzień od którego zacznie się budowanie terminarza, zaś zmienna k (typu Long) określa indeks wiersza, od którego rozpocznie się budowanie terminarza i do którego zostanie wpisana wartość zmiennej Start. Zmienna Koniec (typu Date) określa ostatni dzień, który zostanie uwzględniony w tworzonym terminarzu. Należy pamiętać, że terminarz zostanie utworzony w pierwszym arkuszu naszego skoroszytu, zatem skoroszyt poza arkuszem „Dni” musi mieć przynajmniej jeden dodatkowy arkusz.
Powtarzające się terminy można podzielić na takie, które wypadają w określonym dniu miesiąca i na takie, które wypadają w określonym dniu tygodnia. Sposoby badania, czy w danym dniu wypadają interesujące nas terminy, zostały pokazane w przykładowym kodzie procedury Terminarz(). Zdefiniowane przez nas terminy zostaną wpisane w utworzonym terminarzu w kolumnie D.
Link do skoroszytu Terminarz.ods
Sub Terminarz()
Dim Licz as Long, wiersz as Long, k as Long, t as Long, MonthEnd as Long
Dim notatka as String
Dim d as Date, Start as Date, Koniec as Date
Dim oShtDni as Object, oSht as Object, oColumns as Object, oRow as Object, oCllA as Object, oCllB as Object
oShtDni = ThisComponent.getSheets().getByName("Dni") 'uchwyt do arkusza o nazwie "Dni"
oSht = ThisComponent.getSheets.getByIndex(0) 'uchwyt do pierwszego arkusza
ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
Start = DateSerial(2021, 1, 1) 'początek terminarza
Koniec = DateSerial(2021, 12, 31) 'koniec terminarza
k = 0 'UWAGA: k odpowiada indeksowi wiersza z datą Start
d = Start
Do While d <= Koniec
Licz = 0 'zmienna Licz zlicza, ile wykonano wpisów pod tą samą datą w kolumnie D
t = Weekday(d) 'niedziela-1, sobota-7
MonthEnd = MonthDays( Year(d), Month(d) )
oRow = oSht.getRows().getByIndex(k) 'uchwyt do wiersza o indeksie k
oCllA = oSht.getCellByPosition(0, k) 'uchwyt do komórki A wiersza o indeksie k
oCllB = oSht.getCellByPosition(1, k) 'uchwyt do komórki B wiersza o indeksie k
oCllA.Value = d
'formatowanie komórki A:
oCllA.NumberFormat = 36 'format daty: 31.12.1999
oCllA.VertJustify = com.sun.star.table.CellVertJustify.CENTER 'wyśrodkowanie tekstu w pionie
oCllB.String = DzienTygodnia(d)
'formatowanie komórki B:
oCllB.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER 'wyśrodkowanie tekstu w poziomie
oCllB.VertJustify = com.sun.star.table.CellVertJustify.CENTER 'wyśrodkowanie tekstu w pionie
If t = 1 Then 'niedziela
oRow.CellBackColor = RGB(255, 0, 0) 'czerwony kolor tła wiersza
End If
'Informacja dotycząca wybranych dni roku z arkusza "Dni" (wpis w kolumnie F)
wiersz = DateSerial(2000, Month(d), Day(d)) - 36526 'indeks wiersza w arkuszu "Dni" z notatką odpowiadającą dacie d
notatka = oShtDni.getCellByPosition(1, wiersz).String
If notatka <> "" Then
Call CellFormat( oSht.getCellByPosition(5, k), notatka, RGB(204, 255, 204) )
End If
'Powtarzające się terminy - dotyczące dni miesiąca (wpis w kolumnie D)
If Day(d) = 7 Then
Call CellFormat( oSht.getCellByPosition(3, k + Licz), "Siódmy dzień miesiąca", RGB(153, 204, 255) )
Licz = Licz + 1
End If
'Powtarzające się terminy - dotyczące dni tygodnia (wpis w kolumnie D)
'czwartek co dwa tygodnie począwszy od 07.01.2021
If t = 5 AND (d - DateSerial(2021, 1, 7)) Mod 14 = 0 Then
Call CellFormat( oSht.getCellByPosition(3, k + Licz), "Spotkanie w czwartek (co dwa tygodnie)", RGB(204, 204, 204) )
Licz = Licz + 1
End If
'pierwszy czwartek miesiąca
If t = 5 AND Day(d) >= 1 AND Day(d) <= 7 Then
Call CellFormat( oSht.getCellByPosition(3, k + Licz), "Pierwszy czwartek miesiąca", RGB(255, 255, 204) )
Licz = Licz + 1
End If
'ostatni czwartek miesiąca
If t = 5 AND Day(d) >= MonthEnd-6 AND Day(d) <= MonthEnd Then
Call CellFormat( oSht.getCellByPosition(3, k + Licz), "Ostatni czwartek miesiąca", RGB(123, 204, 153) )
Licz = Licz + 1
End If
'Końcowe formatowanie wpisu - scalanie komórek
If Licz > 1 Then
oSht.getCellRangeByPosition(0, k, 0, k + Licz - 1).merge(True) 'scalamy komórki w kolumnach: A,B,C,E,F,G,H
oSht.getCellRangeByPosition(1, k, 1, k + Licz - 1).merge(True)
oSht.getCellRangeByPosition(2, k, 2, k + Licz - 1).merge(True)
oSht.getCellRangeByPosition(4, k, 4, k + Licz - 1).merge(True)
oSht.getCellRangeByPosition(5, k, 5, k + Licz - 1).merge(True)
oSht.getCellRangeByPosition(6, k, 6, k + Licz - 1).merge(True)
oSht.getCellRangeByPosition(7, k, 7, k + Licz - 1).merge(True)
k = k + Licz
Else
k = k + 1
End If
d = d + 1
Loop
oColumns = oSht.getColumns() 'uchwyt do kolumn pierwszego arkusza
oColumns.getByIndex(2).Width = 500 'szerokość kolumny C - 5 mm
oColumns.getByIndex(3).Width = 7000 'szerokość kolumny D - 70 mm
oColumns.getByIndex(4).Width = 1500 'szerokość kolumny E - 15 mm
oColumns.getByIndex(5).Width = 7000 'szerokość kolumny F - 70 mm
oColumns.getByIndex(6).Width = 1500 'szerokość kolumny G - 15 mm
oColumns.getByIndex(7).Width = 7000 'szerokość kolumny H - 70 mm
MsgBox "Ukończono!"
End Sub
Sub CellFormat(oCll as Object, CellString as String, CellColor as Long)
Dim CellRow as Long
CellRow = oCll.getCellAddress().Row
oCll.Spreadsheet.getRows().getByIndex(CellRow).Height = 1000 'ustawia wysokość wiersza równą 10 mm
oCll.String = CellString 'wpisuje tekst
oCll.CellBackColor = CellColor 'ustawia kolor tła komórki
oCll.CharHeight = 11 'rozmiar czcionki
oCll.CharWeight = com.sun.star.awt.FontWeight.NORMAL 'zwykła czcionka
oCll.setPropertyValue( "IsTextWrapped", True ) 'zawija tekst automatycznie
oCll.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER 'wyśrodkowanie tekstu w poziomie
oCll.VertJustify = com.sun.star.table.CellVertJustify.CENTER 'wyśrodkowanie tekstu w pionie
Call RangeBorder(oCll, RGB(0, 0, 0), 0, 26) 'obramowanie komórki
End Sub
Function MonthDays(myYear As Long, myMonth As Long) As Long
'znajduje liczbę dni w miesiącu danego roku
If myMonth = 12 Then
MonthDays = 31
Else
MonthDays = Day(DateSerial(myYear, myMonth + 1, 1) - 1)
End If
End Function
Function DzienTygodnia(Dzien as Date) as String
'funkcja zwraca nazwę dnia tygodnia
Dim aNazwy() 'deklaracja pustej tablicy
'funkcja Array() tworzy tablicę typu Variant i numeruje elementy od 0
aNazwy = Array("niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota")
DzienTygodnia = aNazwy( Weekday(Dzien) - 1 )
End Function
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
LibreOffice Calc – makra Strona główna