Różnica pomiędzy stronami "Arkusze" i "Funkcje daty i czasu"
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;">02.10.2020</div> |
Linia 5: | Linia 5: | ||
+ | == Nazwa dnia tygodnia == | ||
+ | Prosta funkcja pozwoli nam określić nazwę dnia tygodnia w języku polskim dla argumentu typu data. | ||
− | == | + | <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 Array() 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> | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>DataCzas1() |
− | + | MsgBox <span style='color:#0095ff;'>DzienTygodnia</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;'>'sobota</span> | |
− | + | MsgBox <span style='color:#0095ff;'>DzienTygodnia</span>( <span style='color:#0095ff;'>Date</span>() ) <span style='color:#707070;'>'dzisiejszy dzień tygodnia</span> | |
− | |||
− | |||
− | |||
− | |||
− | |||
<b><span style='color:#1f1c1b;'>End Sub</span></b></span> | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
Linia 22: | Linia 25: | ||
− | |||
− | <span style="color: green"><b><span style='color:#1f1c1b;'> | + | == Liczba dni w miesiącu == |
− | + | ||
− | <b><span style='color:#1f1c1b;'> | + | Równie prosta funkcja pozwala określić liczbę dni w określonym miesiącu. Oczywiście musimy również podać rok ze względu na lata przestępne. |
− | + | ||
− | + | <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>( <span style='color:#0095ff;'>DateSerial</span>(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;'>Sub </span></b>DataCzas2() | ||
+ | MsgBox <span style='color:#0095ff;'>MonthDays</span>(<span style='color:#ff0000;'>1900</span>, <span style='color:#ff0000;'>2</span>) | ||
+ | MsgBox <span style='color:#0095ff;'>MonthDays</span>(<span style='color:#ff0000;'>2000</span>, <span style='color:#ff0000;'>2</span>) | ||
+ | MsgBox <span style='color:#0095ff;'>MonthDays</span>(<span style='color:#ff0000;'>2100</span>, <span style='color:#ff0000;'>2</span>) | ||
<b><span style='color:#1f1c1b;'>End Sub</span></b></span> | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
Linia 34: | Linia 48: | ||
− | |||
− | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b> | + | == Wyznaczanie daty Wielkanocy == |
+ | |||
+ | Wyznaczenie daty Wielkanocy nie jest rzeczą prostą. LibreOffice ma wbudowaną funkcję arkusza EASTERSUNDAY(), która podaje prawidłową datę Wielkanocy dla lat 1583 – 9956 (dla lat większych od 9956 występuje błąd). Funkcje arkusza mogą być wykorzystywane w makrach, ale nie możemy tego uczynić bezpośrednio. Funkcja myWielkanoc() pokazuje nam jak uzyskać dostęp do funkcji arkusza w makrach. Podajemy też prostą funkcję EasterDate(), która wyznacza prawidłowe daty Wielkanocy dla lat 1900 – 2099 ([https://www.extendoffice.com/documents/excel/3654-excel-calculate-easter-date.html LINK]). Inne algorytmy Czytelnik znajdzie na stronie Wikipedii ([https://pl.wikipedia.org/wiki/Wielkanoc LINK]). | ||
+ | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>myWielkanoc(Rok <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;'>Date</span> <span style='color:#707070;'>'[[Co zrobić, jeśli funkcja jest dostępna w arkuszu, ale nie jest dostępna w makrach?|LINK]]</span> | ||
+ | <span style='color:#707070;'>'oblicza datę Wielkanocy dla lat 1583 – 9956</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> oFuncAcc <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | ||
+ | oFuncAcc <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>CreateUnoService</span>(<span style='color:#ff0000;'>"com.sun.star.sheet.FunctionAccess"</span>) | ||
+ | myWielkanoc <span style='color:#000080;'>=</span> oFuncAcc.callFunction( <span style='color:#ff0000;'>"EASTERSUNDAY"</span>, <span style='color:#0095ff;'>Array</span>(Rok) ) | ||
+ | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
+ | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>EasterDate(Rok <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;'>Date</span> <span style='color:#707070;'>'[https://www.extendoffice.com/documents/excel/3654-excel-calculate-easter-date.html LINK]</span> | ||
+ | <span style='color:#707070;'>'oblicza datę Wielkanocy dla lat 1900 – 2099</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> N <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | ||
+ | N <span style='color:#000080;'>=</span> (((<span style='color:#ff0000;'>255</span> - <span style='color:#ff0000;'>11</span> * (Rok <b><span style='color:#000000;'>MOD</span></b> <span style='color:#ff0000;'>19</span>)) - <span style='color:#ff0000;'>21</span>) <b><span style='color:#000000;'>MOD</span></b> <span style='color:#ff0000;'>30</span>) + <span style='color:#ff0000;'>21</span> | ||
+ | EasterDate <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(Rok, <span style='color:#ff0000;'>3</span>, <span style='color:#ff0000;'>1</span>) + N + (N > <span style='color:#ff0000;'>48</span>) + <span style='color:#ff0000;'>6</span> - ((Rok + <span style='color:#0095ff;'>Int</span>(Rok/<span style='color:#ff0000;'>4</span>) + N + (N > <span style='color:#ff0000;'>48</span>) + <span style='color:#ff0000;'>1</span>) <b><span style='color:#000000;'>MOD</span></b> <span style='color:#ff0000;'>7</span>) | ||
+ | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
+ | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>DataCzas3() | ||
<b><span style='color:#1f1c1b;'>Dim</span></b> n <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | <b><span style='color:#1f1c1b;'>Dim</span></b> n <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | ||
− | <b><span style='color:#1f1c1b;'> | + | <b><span style='color:#1f1c1b;'>For </span></b>n <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1895</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>2105</span> |
− | + | <b><span style='color:#1f1c1b;'>If</span></b> <span style='color:#0095ff;'>myWielkanoc</span>(n) <> <span style='color:#0095ff;'>EasterDate</span>(n) <b><span style='color:#1f1c1b;'>Then</span></b> MsgBox n | |
− | + | <b><span style='color:#1f1c1b;'>Next </span></b>n | |
− | |||
− | |||
− | |||
− | |||
<b><span style='color:#1f1c1b;'>End Sub</span></b></span> | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
+ | Wielkanoc jest świętem ruchomym. Najwcześniej wypada 22 marca, zaś najpóźniej 25 kwietnia ([https://pl.wikipedia.org/wiki/Wielkanoc LINK]). Korzystając z funkcji myWielkanoc() łatwo znajdujemy, że w okresie do roku 2500 Wielkanoc wypada:<br/> | ||
+ | 22 marca w latach: 1598, 1693, 1761, 1818, 2285, 2353, 2437<br/> | ||
+ | 25 kwietnia w latach: 1666, 1734, 1886, 1943, 2038, 2190, 2258, 2326, 2410<br/> | ||
+ | |||
+ | Do obliczeń wykorzystujemy następującą procedurę, która zapisuje uzyskane wyniki do pliku: | ||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Wielkanoc_daty_skrajne() | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> DataWielkanocy <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> FileNumber <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> FileName <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span> | ||
+ | FileNumber <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Freefile</span>() | ||
+ | FileName <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"c:/data.txt"</span> <span style='color:#707070;'>'podaj właściwą ścieżkę do pliku!</span> | ||
+ | <b><span style='color:#1f1c1b;'>If</span></b> <span style='color:#0095ff;'>FileExists</span>(FileName) <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#0095ff;'>Kill</span>(FileName) <span style='color:#707070;'>'kasujemy plik, jeżeli taki istnieje</span> | ||
+ | |||
+ | <b><span style='color:#1f1c1b;'>Open</span></b> FileName <b><span style='color:#1f1c1b;'>For Binary As</span></b> <span style='color:#aa5500;'>#FileNumber</span> <span style='color:#707070;'>'otwarcie pliku</span> | ||
+ | <b><span style='color:#000000;'>Put</span></b> <span style='color:#aa5500;'>#FileNumber</span>,, <span style='color:#ff0000;'>"Wielkanoc w dniu 22 marca wypada w latach:"</span> <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) | ||
+ | <b><span style='color:#1f1c1b;'>For </span></b>n <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1583</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>2500</span> | ||
+ | DataWielkanocy <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>myWielkanoc</span>(n) | ||
+ | <b><span style='color:#1f1c1b;'>If</span></b> <span style='color:#0095ff;'>Month</span>(DataWielkanocy) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>3</span> <b><span style='color:#000000;'>AND</span></b> <span style='color:#0095ff;'>Day</span>(DataWielkanocy) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>22</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | <b><span style='color:#000000;'>Put</span></b> <span style='color:#aa5500;'>#FileNumber</span>,, <span style='color:#0095ff;'>CStr</span>( <span style='color:#0095ff;'>Year</span>(DataWielkanocy) ) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>", "</span> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | <b><span style='color:#1f1c1b;'>Next </span></b>n | ||
+ | <b><span style='color:#000000;'>Put</span></b> <span style='color:#aa5500;'>#FileNumber</span>,, <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>"Wielkanoc w dniu 25 kwietnia wypada w latach:"</span> <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) | ||
+ | <b><span style='color:#1f1c1b;'>For </span></b>n <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1583</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>2500</span> | ||
+ | DataWielkanocy <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>myWielkanoc</span>(n) | ||
+ | <b><span style='color:#1f1c1b;'>If</span></b> <span style='color:#0095ff;'>Month</span>(DataWielkanocy) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>4</span> <b><span style='color:#000000;'>AND</span></b> <span style='color:#0095ff;'>Day</span>(DataWielkanocy) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>25</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | <b><span style='color:#000000;'>Put</span></b> <span style='color:#aa5500;'>#FileNumber</span>,, <span style='color:#0095ff;'>CStr</span>( <span style='color:#0095ff;'>Year</span>(DataWielkanocy) ) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>", "</span> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | <b><span style='color:#1f1c1b;'>Next </span></b>n | ||
+ | <b><span style='color:#1f1c1b;'>Close</span></b> <span style='color:#aa5500;'>#FileNumber</span> <span style='color:#707070;'>'zamknięcie pliku</span> | ||
+ | MsgBox <span style='color:#ff0000;'>"Koniec"</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | == Czy dany dzień jest dniem ustawowo wolnym od pracy == | |
− | |||
− | |||
+ | W Polsce mamy trzynaście dni ustawowo wolnych od pracy, z których dwa (Wielkanoc i Zesłanie Ducha Świętego) zawsze wypadają w niedzielę. Poniższa funkcja sprawdza, czy badany dzień jest jednym z dni ustawowo wolnych od pracy. Uwaga: funkcja korzysta ze zdefiniowanej wyżej funkcji EasterDate(). | ||
− | == | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>CzySwieto(RRRR <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, MM <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, DD <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>) <b><span style='color:#1f1c1b;'>as</span></b> Boolean |
− | + | <span style='color:#707070;'>'sprawdza czy podany dzień jest dniem ustwowo wolnym od pracy dla lat 1900 – 2099</span> | |
− | <b><span style='color:#1f1c1b;'>Dim</span></b> | + | <b><span style='color:#1f1c1b;'>Dim</span></b> DniWolne(<span style='color:#ff0000;'>1</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>13</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span> |
− | + | <b><span style='color:#1f1c1b;'>Dim</span></b> DataWielkanocy <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span>, Dzien <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span> | |
− | + | <b><span style='color:#1f1c1b;'>Dim</span></b> n <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | |
− | + | ||
− | + | DataWielkanocy <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>EasterDate</span>(RRRR) <span style='color:#707070;'>'funkcja EasterDate() oblicza prawidłową datę Wielkanocy tylko dla lat 1900 – 2099</span> | |
− | + | DniWolne(<span style='color:#ff0000;'>1</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'Nowy Rok</span> | |
− | + | DniWolne(<span style='color:#ff0000;'>2</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>6</span>) <span style='color:#707070;'>'Święto Trzech Króli</span> | |
− | + | DniWolne(<span style='color:#ff0000;'>3</span>) <span style='color:#000080;'>=</span> DataWielkanocy <span style='color:#707070;'>'Wielkanoc</span> | |
− | + | DniWolne(<span style='color:#ff0000;'>4</span>) <span style='color:#000080;'>=</span> DataWielkanocy + <span style='color:#ff0000;'>1</span> <span style='color:#707070;'>'Poniedziałek Wielkanocny</span> | |
+ | DniWolne(<span style='color:#ff0000;'>5</span>) <span style='color:#000080;'>=</span> DataWielkanocy + <span style='color:#ff0000;'>49</span> <span style='color:#707070;'>'Zesłanie Ducha Świętego (Zielone Świątki)</span> | ||
+ | DniWolne(<span style='color:#ff0000;'>6</span>) <span style='color:#000080;'>=</span> DataWielkanocy + <span style='color:#ff0000;'>60</span> <span style='color:#707070;'>'Boże Ciało</span> | ||
+ | DniWolne(<span style='color:#ff0000;'>7</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>5</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'Święto Pracy</span> | ||
+ | DniWolne(<span style='color:#ff0000;'>8</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>5</span>, <span style='color:#ff0000;'>3</span>) <span style='color:#707070;'>'Święto Konstytucji 3 Maja</span> | ||
+ | DniWolne(<span style='color:#ff0000;'>9</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>8</span>, <span style='color:#ff0000;'>15</span>) <span style='color:#707070;'>'Wniebowzięcie Najświętszej Maryi Panny</span> | ||
+ | DniWolne(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>11</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'Wszystkich Świętych</span> | ||
+ | DniWolne(<span style='color:#ff0000;'>11</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>11</span>, <span style='color:#ff0000;'>11</span>) <span style='color:#707070;'>'Narodowe Święto Niepodległości </span> | ||
+ | DniWolne(<span style='color:#ff0000;'>12</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>12</span>, <span style='color:#ff0000;'>25</span>) <span style='color:#707070;'>'Boże Narodzenie</span> | ||
+ | DniWolne(<span style='color:#ff0000;'>13</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, <span style='color:#ff0000;'>12</span>, <span style='color:#ff0000;'>26</span>) <span style='color:#707070;'>'drugi dzień Świąt Bożego Narodzenia</span> | ||
+ | |||
+ | CzySwieto <span style='color:#000080;'>=</span> False | ||
+ | Dzien <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(RRRR, MM, DD) | ||
+ | <b><span style='color:#1f1c1b;'>For </span></b>n <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>13</span> | ||
+ | <b><span style='color:#1f1c1b;'>If </span></b>Dzien <span style='color:#000080;'>=</span> DniWolne(n) <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | CzySwieto <span style='color:#000080;'>=</span> True | ||
+ | <b><span style='color:#1f1c1b;'>Exit For</span></b> | ||
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | <b><span style='color:#1f1c1b;'>Next </span></b>n | ||
+ | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
+ | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>DataCzas4() | ||
+ | MsgBox CzySwieto(<span style='color:#ff0000;'>2000</span>, <span style='color:#ff0000;'>5</span>, <span style='color:#ff0000;'>1</span>) | ||
+ | MsgBox CzySwieto(<span style='color:#ff0000;'>2020</span>, <span style='color:#ff0000;'>4</span>, <span style='color:#ff0000;'>12</span>) | ||
<b><span style='color:#1f1c1b;'>End Sub</span></b></span> | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
Linia 87: | Linia 155: | ||
− | |||
− | + | == Wyznaczanie daty Wielkanocy (uzupełnienie) == | |
+ | |||
+ | Przedstawimy niżej funkcję znajdującą datę Wielkanocy dla dowolnego roku nie mniejszego niż 1583. Korzystamy z algorytmu podanego w książce Jeana Meeusa ''Astronomical Algorithms'' na stronie 67. Musimy być bardzo ostrożni przy wyznaczaniu części całkowitej ilorazu i reszty z dzielenia dwóch liczb. Funkcja Int() zwraca część całkowitą liczby, ale zwracana jest liczba typu Double. Operacja obliczania reszty z dzielenia też jest dostępna w LibreOffice, ale dopuszcza nietypowe argumenty (np. 11 MOD 2.5 jest równe 1). Dlatego zdefiniowaliśmy własne funkcje Quotient() i Remainder(), które znajdują część całkowitą ilorazu i resztę z dzielenia. Zapisanie algorytmu nie przedstawia większych trudności. Czytelnik łatwo sprawdzi zgodność tej funkcji z funkcją EASTERSUNDAY() dla lat 1583 – 9956. | ||
+ | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>Quotient(N <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, D <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;'>'oblicza część całowitą ilorazu liczb całkowitych N i D</span> | ||
+ | Quotient <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>CLng</span>( <span style='color:#0095ff;'>Int</span>(N/D) ) <span style='color:#707070;'>'funkcja Int zwraca liczbę typu Double</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>Remainder(N <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, D <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;'>'oblicza resztę z dzielenia liczb całkowitych N i D</span> | ||
+ | Remainder <span style='color:#000080;'>=</span> N - <span style='color:#0095ff;'>CLng</span>( <span style='color:#0095ff;'>Int</span>(N/D) ) * D | ||
+ | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>DataWielkanocy(Year <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;'>Date</span> | |
+ | <span style='color:#707070;'>'oblicza datę Wielkanocy dla lat nie mniejszych niż 1583</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> a <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, c <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, d <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, e <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> f <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, g <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, h <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, i <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | ||
+ | <b><span style='color:#1f1c1b;'>Dim</span></b> k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, l <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, m <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>, p <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | ||
+ | a <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Remainder</span>(Year, <span style='color:#ff0000;'>19</span>) | ||
+ | b <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Quotient</span>(Year, <span style='color:#ff0000;'>100</span>) | ||
+ | c <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Remainder</span>(Year, <span style='color:#ff0000;'>100</span>) | ||
+ | d <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Quotient</span>(b, <span style='color:#ff0000;'>4</span>) | ||
+ | e <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Remainder</span>(b, <span style='color:#ff0000;'>4</span>) | ||
+ | f <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Quotient</span>(b + <span style='color:#ff0000;'>8</span>, <span style='color:#ff0000;'>25</span>) | ||
+ | g <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Quotient</span>(b - f + <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>3</span>) | ||
+ | h <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Remainder</span>(<span style='color:#ff0000;'>19</span>*a + b - d - g + <span style='color:#ff0000;'>15</span>, <span style='color:#ff0000;'>30</span>) | ||
+ | i <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Quotient</span>(c, <span style='color:#ff0000;'>4</span>) | ||
+ | k <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Remainder</span>(c, <span style='color:#ff0000;'>4</span>) | ||
+ | l <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Remainder</span>(<span style='color:#ff0000;'>2</span>*e + <span style='color:#ff0000;'>2</span>*i - h - k + <span style='color:#ff0000;'>32</span>, <span style='color:#ff0000;'>7</span>) | ||
+ | m <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Quotient</span>(a + <span style='color:#ff0000;'>11</span>*h + <span style='color:#ff0000;'>22</span>*l, <span style='color:#ff0000;'>451</span>) | ||
+ | n <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Quotient</span>(h + l - <span style='color:#ff0000;'>7</span>*m + <span style='color:#ff0000;'>114</span>, <span style='color:#ff0000;'>31</span>) | ||
+ | p <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Remainder</span>(h + l - <span style='color:#ff0000;'>7</span>*m + <span style='color:#ff0000;'>114</span>, <span style='color:#ff0000;'>31</span>) | ||
+ | DataWielkanocy <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(Year, n, p + <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>DataCzas5() | |
+ | MsgBox <span style='color:#0095ff;'>DataWielkanocy</span>(<span style='color:#ff0000;'>10000</span>) <span style='color:#707070;'>'16.04.10000</span> | ||
+ | MsgBox <span style='color:#0095ff;'>DataWielkanocy</span>(<span style='color:#ff0000;'>15000</span>) <span style='color:#707070;'>'06.04.15000</span> | ||
+ | MsgBox <span style='color:#0095ff;'>DataWielkanocy</span>(<span style='color:#ff0000;'>20000</span>) <span style='color:#707070;'>'23.04.20000</span> | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
Wersja z 17:26, 17 paź 2020
Nazwa dnia tygodnia
Prosta funkcja pozwoli nam określić nazwę dnia tygodnia w języku polskim dla argumentu typu data.
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 DataCzas1()
MsgBox DzienTygodnia( DateSerial(2000, 1, 1) ) 'sobota
MsgBox DzienTygodnia( Date() ) 'dzisiejszy dzień tygodnia
End Sub
Liczba dni w miesiącu
Równie prosta funkcja pozwala określić liczbę dni w określonym miesiącu. Oczywiście musimy również podać rok ze względu na lata przestępne.
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
Sub DataCzas2()
MsgBox MonthDays(1900, 2)
MsgBox MonthDays(2000, 2)
MsgBox MonthDays(2100, 2)
End Sub
Wyznaczanie daty Wielkanocy
Wyznaczenie daty Wielkanocy nie jest rzeczą prostą. LibreOffice ma wbudowaną funkcję arkusza EASTERSUNDAY(), która podaje prawidłową datę Wielkanocy dla lat 1583 – 9956 (dla lat większych od 9956 występuje błąd). Funkcje arkusza mogą być wykorzystywane w makrach, ale nie możemy tego uczynić bezpośrednio. Funkcja myWielkanoc() pokazuje nam jak uzyskać dostęp do funkcji arkusza w makrach. Podajemy też prostą funkcję EasterDate(), która wyznacza prawidłowe daty Wielkanocy dla lat 1900 – 2099 (LINK). Inne algorytmy Czytelnik znajdzie na stronie Wikipedii (LINK).
Function myWielkanoc(Rok as Long) as Date 'LINK
'oblicza datę Wielkanocy dla lat 1583 – 9956
Dim oFuncAcc as Object
oFuncAcc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
myWielkanoc = oFuncAcc.callFunction( "EASTERSUNDAY", Array(Rok) )
End Function
Function EasterDate(Rok As Long) as Date 'LINK
'oblicza datę Wielkanocy dla lat 1900 – 2099
Dim N as Long
N = (((255 - 11 * (Rok MOD 19)) - 21) MOD 30) + 21
EasterDate = DateSerial(Rok, 3, 1) + N + (N > 48) + 6 - ((Rok + Int(Rok/4) + N + (N > 48) + 1) MOD 7)
End Function
Sub DataCzas3()
Dim n as Long
For n = 1895 To 2105
If myWielkanoc(n) <> EasterDate(n) Then MsgBox n
Next n
End Sub
Wielkanoc jest świętem ruchomym. Najwcześniej wypada 22 marca, zaś najpóźniej 25 kwietnia (LINK). Korzystając z funkcji myWielkanoc() łatwo znajdujemy, że w okresie do roku 2500 Wielkanoc wypada:
22 marca w latach: 1598, 1693, 1761, 1818, 2285, 2353, 2437
25 kwietnia w latach: 1666, 1734, 1886, 1943, 2038, 2190, 2258, 2326, 2410
Do obliczeń wykorzystujemy następującą procedurę, która zapisuje uzyskane wyniki do pliku:
Sub Wielkanoc_daty_skrajne()
Dim DataWielkanocy as Date
Dim FileNumber as Long, n as Long
Dim FileName as String
FileNumber = Freefile()
FileName = "c:/data.txt" 'podaj właściwą ścieżkę do pliku!
If FileExists(FileName) Then Kill(FileName) 'kasujemy plik, jeżeli taki istnieje
Open FileName For Binary As #FileNumber 'otwarcie pliku
Put #FileNumber,, "Wielkanoc w dniu 22 marca wypada w latach:" & Chr(10)
For n = 1583 To 2500
DataWielkanocy = myWielkanoc(n)
If Month(DataWielkanocy) = 3 AND Day(DataWielkanocy) = 22 Then
Put #FileNumber,, CStr( Year(DataWielkanocy) ) & ", "
End If
Next n
Put #FileNumber,, Chr(10) & "Wielkanoc w dniu 25 kwietnia wypada w latach:" & Chr(10)
For n = 1583 To 2500
DataWielkanocy = myWielkanoc(n)
If Month(DataWielkanocy) = 4 AND Day(DataWielkanocy) = 25 Then
Put #FileNumber,, CStr( Year(DataWielkanocy) ) & ", "
End If
Next n
Close #FileNumber 'zamknięcie pliku
MsgBox "Koniec"
End Sub
Czy dany dzień jest dniem ustawowo wolnym od pracy
W Polsce mamy trzynaście dni ustawowo wolnych od pracy, z których dwa (Wielkanoc i Zesłanie Ducha Świętego) zawsze wypadają w niedzielę. Poniższa funkcja sprawdza, czy badany dzień jest jednym z dni ustawowo wolnych od pracy. Uwaga: funkcja korzysta ze zdefiniowanej wyżej funkcji EasterDate().
Function CzySwieto(RRRR as Long, MM as Long, DD as Long) as Boolean
'sprawdza czy podany dzień jest dniem ustwowo wolnym od pracy dla lat 1900 – 2099
Dim DniWolne(1 To 13) as Date
Dim DataWielkanocy as Date, Dzien as Date
Dim n as Long
DataWielkanocy = EasterDate(RRRR) 'funkcja EasterDate() oblicza prawidłową datę Wielkanocy tylko dla lat 1900 – 2099
DniWolne(1) = DateSerial(RRRR, 1, 1) 'Nowy Rok
DniWolne(2) = DateSerial(RRRR, 1, 6) 'Święto Trzech Króli
DniWolne(3) = DataWielkanocy 'Wielkanoc
DniWolne(4) = DataWielkanocy + 1 'Poniedziałek Wielkanocny
DniWolne(5) = DataWielkanocy + 49 'Zesłanie Ducha Świętego (Zielone Świątki)
DniWolne(6) = DataWielkanocy + 60 'Boże Ciało
DniWolne(7) = DateSerial(RRRR, 5, 1) 'Święto Pracy
DniWolne(8) = DateSerial(RRRR, 5, 3) 'Święto Konstytucji 3 Maja
DniWolne(9) = DateSerial(RRRR, 8, 15) 'Wniebowzięcie Najświętszej Maryi Panny
DniWolne(10) = DateSerial(RRRR, 11, 1) 'Wszystkich Świętych
DniWolne(11) = DateSerial(RRRR, 11, 11) 'Narodowe Święto Niepodległości
DniWolne(12) = DateSerial(RRRR, 12, 25) 'Boże Narodzenie
DniWolne(13) = DateSerial(RRRR, 12, 26) 'drugi dzień Świąt Bożego Narodzenia
CzySwieto = False
Dzien = DateSerial(RRRR, MM, DD)
For n = 1 To 13
If Dzien = DniWolne(n) Then
CzySwieto = True
Exit For
End If
Next n
End Function
Sub DataCzas4()
MsgBox CzySwieto(2000, 5, 1)
MsgBox CzySwieto(2020, 4, 12)
End Sub
Wyznaczanie daty Wielkanocy (uzupełnienie)
Przedstawimy niżej funkcję znajdującą datę Wielkanocy dla dowolnego roku nie mniejszego niż 1583. Korzystamy z algorytmu podanego w książce Jeana Meeusa Astronomical Algorithms na stronie 67. Musimy być bardzo ostrożni przy wyznaczaniu części całkowitej ilorazu i reszty z dzielenia dwóch liczb. Funkcja Int() zwraca część całkowitą liczby, ale zwracana jest liczba typu Double. Operacja obliczania reszty z dzielenia też jest dostępna w LibreOffice, ale dopuszcza nietypowe argumenty (np. 11 MOD 2.5 jest równe 1). Dlatego zdefiniowaliśmy własne funkcje Quotient() i Remainder(), które znajdują część całkowitą ilorazu i resztę z dzielenia. Zapisanie algorytmu nie przedstawia większych trudności. Czytelnik łatwo sprawdzi zgodność tej funkcji z funkcją EASTERSUNDAY() dla lat 1583 – 9956.
Function Quotient(N as Long, D as Long) as Long
'oblicza część całowitą ilorazu liczb całkowitych N i D
Quotient = CLng( Int(N/D) ) 'funkcja Int zwraca liczbę typu Double
End Function
Function Remainder(N as Long, D as Long) as Long
'oblicza resztę z dzielenia liczb całkowitych N i D
Remainder = N - CLng( Int(N/D) ) * D
End Function
Function DataWielkanocy(Year as Long) as Date
'oblicza datę Wielkanocy dla lat nie mniejszych niż 1583
Dim a as Long, b as Long, c as Long, d as Long, e as Long
Dim f as Long, g as Long, h as Long, i as Long
Dim k as Long, l as Long, m as Long, n as Long, p as Long
a = Remainder(Year, 19)
b = Quotient(Year, 100)
c = Remainder(Year, 100)
d = Quotient(b, 4)
e = Remainder(b, 4)
f = Quotient(b + 8, 25)
g = Quotient(b - f + 1, 3)
h = Remainder(19*a + b - d - g + 15, 30)
i = Quotient(c, 4)
k = Remainder(c, 4)
l = Remainder(2*e + 2*i - h - k + 32, 7)
m = Quotient(a + 11*h + 22*l, 451)
n = Quotient(h + l - 7*m + 114, 31)
p = Remainder(h + l - 7*m + 114, 31)
DataWielkanocy = DateSerial(Year, n, p + 1)
End Function
Sub DataCzas5()
MsgBox DataWielkanocy(10000) '16.04.10000
MsgBox DataWielkanocy(15000) '06.04.15000
MsgBox DataWielkanocy(20000) '23.04.20000
End Sub
LibreOffice Calc – makra Strona główna