Różnica pomiędzy stronami "Arkusze" i "Funkcje daty i czasu"

Z Henryk Dąbrowski
(Różnica między stronami)
Przejdź do nawigacji Przejdź do wyszukiwania
 
 
Linia 1: Linia 1:
<div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">22.03.2020</div>
+
<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.
  
== Uchwyt do arkusza przez indeks, nazwa arkusza i zmiana nazwy arkusza ==
+
<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;'>&quot;niedziela&quot;</span>, <span style='color:#ff0000;'>&quot;poniedziałek&quot;</span>, <span style='color:#ff0000;'>&quot;wtorek&quot;</span>, <span style='color:#ff0000;'>&quot;środa&quot;</span>, <span style='color:#ff0000;'>&quot;czwartek&quot;</span>, <span style='color:#ff0000;'>&quot;piątek&quot;</span>, <span style='color:#ff0000;'>&quot;sobota&quot;</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>Arkusz1()
+
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>DataCzas1()
     <b><span style='color:#1f1c1b;'>Dim</span></b> sName <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>
+
     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>
    <b><span style='color:#1f1c1b;'>Dim</span></b> oSht  <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
+
     MsgBox <span style='color:#0095ff;'>DzienTygodnia</span>( <span style='color:#0095ff;'>Date</span>() ) <span style='color:#707070;'>'dzisiejszy dzień tygodnia</span>
    <span style='color:#707070;'>'uchwyt do arkusza przez indeks; w tym przypadku uzyskujemy uchwyt do pierwszego arkusza:</span>
 
     oSht = ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>)
 
    oSht.Name = <span style='color:#ff0000;'>&quot;Test&quot;</span> <span style='color:#707070;'>'zmiana nazwy arkusza</span>
 
    sName = oSht.getName() <span style='color:#707070;'>'uzyskanie nazwy arkusza</span>
 
    MsgBox sName
 
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  
Linia 22: Linia 25:
  
  
== Uchwyt do arkusza przez nazwę, uaktywnienie arkusza ==
 
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Arkusz2()
+
== Liczba dni w miesiącu ==
    <b><span style='color:#1f1c1b;'>Dim</span></b> sName <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>
+
 
     <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
+
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.
     oSht = ThisComponent.getSheets().getByName(<span style='color:#ff0000;'>&quot;Test&quot;</span>) <span style='color:#707070;'>'uchwyt do arkusza przez nazwę</span>
+
 
     ThisComponent.CurrentController.setActiveSheet( oSht ) <span style='color:#707070;'>'mając uchwyt, możemy uczynić arkuszem aktywnym</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>( <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:
  
  
== Uchwyt do aktywnego arkusza, liczba arkuszy w skoroszycie, uaktywnienie ostatniego arkusza ==
 
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Arkusz3()
+
== 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;'>&quot;com.sun.star.sheet.FunctionAccess&quot;</span>)
 +
    myWielkanoc <span style='color:#000080;'>=</span> oFuncAcc.callFunction( <span style='color:#ff0000;'>&quot;EASTERSUNDAY&quot;</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 &gt; <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 &gt; <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;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
+
     <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>
    oSht = ThisComponent.getCurrentController().getActiveSheet() <span style='color:#707070;'>'uchwyt do aktywnego arkusza</span>
+
        <b><span style='color:#1f1c1b;'>If</span></b> <span style='color:#0095ff;'>myWielkanoc</span>(n) &lt;&gt; <span style='color:#0095ff;'>EasterDate</span>(n) <b><span style='color:#1f1c1b;'>Then</span></b> MsgBox n
    MsgBox oSht.getName() <span style='color:#707070;'>'nazwa aktywnego arkusza</span>
+
     <b><span style='color:#1f1c1b;'>Next </span></b>n
    n = ThisComponent.getSheets().getCount() <span style='color:#707070;'>'liczba arkuszy</span>
 
    MsgBox n
 
    oSht = ThisComponent.getSheets().getByIndex(n - <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'uchwyt do ostatniego arkusza</span>
 
     ThisComponent.CurrentController.setActiveSheet( oSht ) <span style='color:#707070;'>'uaktywnienie ostatniego arkusza</span>
 
 
  <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;'>&quot;c:/data.txt&quot;</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;'>&quot;Wielkanoc w dniu 22 marca wypada w latach:&quot;</span> <span style='color:#000080;'>&amp;</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;'>&amp;</span> <span style='color:#ff0000;'>&quot;, &quot;</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;'>&amp;</span> <span style='color:#ff0000;'>&quot;Wielkanoc w dniu 25 kwietnia wypada w latach:&quot;</span> <span style='color:#000080;'>&amp;</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;'>&amp;</span> <span style='color:#ff0000;'>&quot;, &quot;</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;'>&quot;Koniec&quot;</span>
 +
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  
== Sprawdzanie, czy arkusz o podanej nazwie istnieje, wstawianie nowego arkusza, kasowanie arkusza ==
 
  
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Arkusz4()
 
    <b><span style='color:#1f1c1b;'>Dim</span></b> sNew, sOld <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>
 
    sNew = <span style='color:#ff0000;'>&quot;NowyArkusz&quot;</span>
 
    sOld = <span style='color:#ff0000;'>&quot;StaryArkusz&quot;</span>
 
    <b><span style='color:#1f1c1b;'>If </span></b><b><span style='color:#000000;'>NOT</span></b> ThisComponent.getSheets().hasByName( sNew ) <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#707070;'>'sprawdza czy arkusz o podanej nazwie już istnieje</span>
 
          ThisComponent.getSheets().insertNewByName( sNew, <span style='color:#ff0000;'>2</span> ) <span style='color:#707070;'>'wstawia nowy arkusz na pozycję 3 (z indeksem 2)</span>
 
    <b><span style='color:#1f1c1b;'>End If</span></b>
 
    <b><span style='color:#1f1c1b;'>If </span></b>ThisComponent.getSheets().hasByName( sOld ) <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#707070;'>'sprawdza czy arkusz istnieje</span>
 
        ThisComponent.getSheets().removeByName( sOld ) <span style='color:#707070;'>'kasuje arkusz o wskazanej nazwie</span>
 
    <b><span style='color:#1f1c1b;'>End If</span></b>
 
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  
  
  
Przeglądając powyższe procedury zauważamy, że wygodnie jest zdefiniować obiekt:<br/>
+
== Czy dany dzień jest dniem ustawowo wolnym od pracy ==
&nbsp;&nbsp;<b>oSheets = ThisComponent.getSheets()</b><br/>
 
bo skraca to kod procedur i czyni zapis bardziej przejrzystym. Obiekt <b>oSheets</b> jest uchwytem do skoroszytu, czyli do zbioru wszystkich arkuszy w dokumencie.
 
  
 +
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().
  
== Wstawianie nowego arkusza, kopiowanie arkusza, kasowanie i przenoszenie arkusza ==
+
<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: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Arkusz5()
+
    <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> oSheets <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
+
    <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>
     oSheets = ThisComponent.getSheets()
+
    <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>
     oSheets.insertNewByName(<span style='color:#ff0000;'>&quot;Nowy&quot;</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'wstawia nowy arkusz na pozycję 2</span>
+
     <b><span style='color:#1f1c1b;'>Dim</span></b> n <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
     MsgBox <span style='color:#ff0000;'>&quot;Nowy arkusz został wstawiony&quot;</span>
+
      
     oSheets.copyByName(<span style='color:#ff0000;'>&quot;Nowy&quot;</span>, <span style='color:#ff0000;'>&quot;Nowy-kopia&quot;</span>, <span style='color:#ff0000;'>2</span>) <span style='color:#707070;'>'tworzymy kopię arkusza &quot;Nowy&quot; i wstawiamy ją na pozycję 3</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>
     MsgBox <span style='color:#ff0000;'>&quot;Kopia arkusza została utworzona&quot;</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>
     oSheets.removeByName(<span style='color:#ff0000;'>&quot;Nowy&quot;</span>) <span style='color:#707070;'>'kasujemy arkusz o nazwie &quot;Nowy&quot;</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>
     MsgBox <span style='color:#ff0000;'>&quot;Arkusz został skasowany&quot;</span>
+
    DniWolne(<span style='color:#ff0000;'>3</span>) <span style='color:#000080;'>=</span> DataWielkanocy <span style='color:#707070;'>'Wielkanoc</span>
     oSheets.moveByName(<span style='color:#ff0000;'>&quot;Nowy-kopia&quot;</span>, <span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'przenosimy arkusz na pozycję pierwszą</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:
  
  
== Polecane strony internetowe ==
 
  
Więcej informacji Czytelnik znajdzie na stronach:
+
== 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>
  
[https://wiki.documentfoundation.org/Macros/Basic/Calc/Sheets Macros - Basic reference - Calc - Sheets]
+
<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>
  
[https://wiki.openoffice.org/wiki/Spreadsheet_common#Working_with_sheets Spreadsheet common – Working with sheets]
+
<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>
  
[https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide/Structure_of_Spreadsheets The Structure of Spreadsheet Documents]
+
<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

02.10.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