Różnica pomiędzy stronami "Funkcje tekstowe" i "Zmienne"

Z Henryk Dąbrowski
(Różnica między stronami)
Przejdź do nawigacji Przejdź do wyszukiwania
m (1 wersja)
 
m (1 wersja)
 
Linia 1: Linia 1:
<div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">20.09.2020</div>
+
<div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">16.10.2020</div>
  
__FORCETOC__
 
  
  
  
== Zamiana fragmentu ciągu na inny ciąg ==
 
  
Bardzo użyteczna jest funkcja, która w&nbsp;zadanym ciągu znaków wyszukuje określony podciąg znaków i&nbsp;zastępuje ten podciąg innym ciągiem znaków. LibreOffice ma wbudowaną funkcję o&nbsp;nazwie Replace(), która umożliwia wykonanie takiej operacji. Przykład zamieszczamy jedynie dla przedstawienia kodu i&nbsp;porównania działania obydwu funkcji. Parametr CompareType jest opcjonalny i&nbsp;domyślnie przyjmuje wartość numeryczną 0 (w przypadku pominięcia parametru). Określa on, czy będą rozróżniane małe i&nbsp;duże litery. Oto dozwolone wartości tego parametru:
+
== Korzystanie ze zmiennych ==
::* 0 – będą rozróżniane małe i duże litery
 
::* 1 – wielkość liter nie będzie miała znaczenia
 
  
<span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>Zamien(Chars <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>, Cut <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>, Insert <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>, <span style='color:#000080;'>Optional</span> CompareType <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;'>String</span>
+
Deklarowanie zmiennych nie jest obowiązkowe, ale jest to niebezpieczne i kto tego nie czyni, ten sam sobie szkodzi. Deklarowanie zmiennych można wymusić dodając instrukcję
    <span style='color:#707070;'>'zamienia w ciągu znaków Chars ciąg Cut na ciąg Insert;</span>
 
    <span style='color:#707070;'>'opcjonalny parametr CompareType decyduje o tym, czy rozróżniana jest wielkość liter </span>
 
    <b><span style='color:#1f1c1b;'>Dim</span></b> Txt <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>, Lxt <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>, Rxt <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>
 
    <b><span style='color:#1f1c1b;'>Dim</span></b> CaseSens <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, Poz <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 
    <b><span style='color:#1f1c1b;'>If </span></b><span style='color:#0095ff;'>IsMissing</span>(CompareType) <b><span style='color:#1f1c1b;'>Then</span></b>
 
        CaseSens <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span>
 
    <b><span style='color:#1f1c1b;'>Else</span></b>
 
        CaseSens <span style='color:#000080;'>=</span> CompareType
 
    <b><span style='color:#1f1c1b;'>End If</span></b>
 
   
 
    <b><span style='color:#1f1c1b;'>If </span></b>Cut <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;&quot;</span> <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#707070;'>'zostanie zwrócony ciąg bez zmian</span>
 
        Zamien <span style='color:#000080;'>=</span> Chars
 
        <b><span style='color:#1f1c1b;'>Exit Function</span></b>
 
    <b><span style='color:#1f1c1b;'>End If</span></b>
 
   
 
    Txt <span style='color:#000080;'>=</span> Chars
 
    Poz <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>InStr</span>(<span style='color:#ff0000;'>1</span>, Txt, Cut, CaseSens) <span style='color:#707070;'>'położenie ciągu Cut w ciągu Txt</span>
 
    <b><span style='color:#1f1c1b;'>Do While </span></b>Poz &gt; <span style='color:#ff0000;'>0</span>
 
        Lxt <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Mid</span>(Txt, <span style='color:#ff0000;'>1</span>, Poz - <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'część ciągu Txt na lewo od znalezionego ciągu Cut</span>
 
        Rxt <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Mid</span>(Txt, Poz + <span style='color:#0095ff;'>Len</span>(Cut)) <span style='color:#707070;'>'część ciągu Txt na prawo od znalezionego ciągu Cut</span>
 
        Txt <span style='color:#000080;'>=</span> Lxt <span style='color:#000080;'>&amp;</span> Insert <span style='color:#000080;'>&amp;</span> Rxt
 
        Poz <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>InStr</span>(Poz + <span style='color:#0095ff;'>Len</span>(Insert), Txt, Cut, CaseSens)
 
    <b><span style='color:#1f1c1b;'>Loop</span></b>
 
    Zamien <span style='color:#000080;'>=</span> Txt
 
<b><span style='color:#1f1c1b;'>End Function</span></b></span>
 
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Tekstowe1()
+
  <span style="color: green"><span style='color:#000080;'>Option Explicit</span></span>
    MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;&quot;</span>, <span style='color:#ff0000;'>&quot;1&quot;</span>, <span style='color:#ff0000;'>&quot;123&quot;</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;&quot;</span>, <span style='color:#ff0000;'>&quot;1&quot;</span>, <span style='color:#ff0000;'>&quot;123&quot;</span>) <span style='color:#707070;'>' &quot;|&quot;</span>
+
 
    MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;&quot;</span>, <span style='color:#ff0000;'>&quot;123&quot;</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;&quot;</span>, <span style='color:#ff0000;'>&quot;123&quot;</span>) <span style='color:#707070;'>' &quot;abcd|abcd&quot;</span>
+
w pierwszej linii każdego modułu.
     MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;a&quot;</span>, <span style='color:#ff0000;'>&quot;&quot;</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;a&quot;</span>, <span style='color:#ff0000;'>&quot;&quot;</span>) <span style='color:#707070;'>' &quot;bcd|bcd&quot;</span>
+
 
     MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;a&quot;</span>, <span style='color:#ff0000;'>&quot;11&quot;</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;a&quot;</span>, <span style='color:#ff0000;'>&quot;11&quot;</span>) <span style='color:#707070;'>' &quot;11bcd|11bcd&quot;</span>
+
 
    MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;A&quot;</span>, <span style='color:#ff0000;'>&quot;22&quot;</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;A&quot;</span>, <span style='color:#ff0000;'>&quot;22&quot;</span>) <span style='color:#707070;'>' &quot;abcd|22bcd&quot;</span>
+
Linki:<br/>
     MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;abcdA&quot;</span>, <span style='color:#ff0000;'>&quot;A&quot;</span>, <span style='color:#ff0000;'>&quot;22&quot;</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;abcdA&quot;</span>, <span style='color:#ff0000;'>&quot;A&quot;</span>, <span style='color:#ff0000;'>&quot;22&quot;</span>, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>1</span>, TRUE) <span style='color:#707070;'>' &quot;22bcd22|22bcdA&quot;</span>
+
[https://help.libreoffice.org/7.0/pl/text/sbasic/shared/03103300.html?&DbPAR=WRITER&System=UNIX Instrukcja Option Explicit]
     MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;abcdA&quot;</span>, <span style='color:#ff0000;'>&quot;A&quot;</span>, <span style='color:#ff0000;'>&quot;22&quot;</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;abcdA&quot;</span>, <span style='color:#ff0000;'>&quot;A&quot;</span>, <span style='color:#ff0000;'>&quot;22&quot;</span>, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>2</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>' &quot;22bcd22|22bcd22&quot;</span>
+
 
    MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;abcdA&quot;</span>, <span style='color:#ff0000;'>&quot;A&quot;</span>, <span style='color:#ff0000;'>&quot;22&quot;</span>, <span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;abcdA&quot;</span>, <span style='color:#ff0000;'>&quot;A&quot;</span>, <span style='color:#ff0000;'>&quot;22&quot;</span>, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>2</span>, <span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>' &quot;abcd22|abcd22</span>
+
[https://help.libreoffice.org/Basic/Using_Variables/pl Korzystanie ze zmiennych]
    MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;bc&quot;</span>, <span style='color:#ff0000;'>&quot;x&quot;</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;abcd&quot;</span>, <span style='color:#ff0000;'>&quot;bc&quot;</span>, <span style='color:#ff0000;'>&quot;x&quot;</span>) <span style='color:#707070;'>' &quot;axd|axd&quot;</span>
+
 
    MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;1a11aa&quot;</span>, <span style='color:#ff0000;'>&quot;1&quot;</span>, <span style='color:#ff0000;'>&quot;11&quot;</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;1a11aa&quot;</span>, <span style='color:#ff0000;'>&quot;1&quot;</span>, <span style='color:#ff0000;'>&quot;11&quot;</span>) <span style='color:#707070;'>' &quot;11a1111aa|11a1111aa&quot;</span>
+
[https://help.libreoffice.org/7.0/pl/text/sbasic/shared/01020300.html Using Procedures, Functions and Properties]
    MsgBox <span style='color:#0095ff;'>Zamien</span>(<span style='color:#ff0000;'>&quot;1a11aa&quot;</span>, <span style='color:#ff0000;'>&quot;a&quot;</span>, <span style='color:#ff0000;'>&quot;aa&quot;</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Replace</span>(<span style='color:#ff0000;'>&quot;1a11aa&quot;</span>, <span style='color:#ff0000;'>&quot;a&quot;</span>, <span style='color:#ff0000;'>&quot;aa&quot;</span>) <span style='color:#707070;'>' &quot;1aa11aaaa|1aa11aaaa&quot;</span>
+
 
 +
 
 +
 
 +
 
 +
 
 +
== Typy zmiennych ==
 +
 
 +
 
 +
<b>Integer</b>: liczby całkowite od -32768 do 32767 (czyli od -2<sup>15</sup> do 2<sup>15</sup>-1)
 +
 +
<b>Long</b>: liczby całkowite od -2147483648 do 2147483647 (czyli od -2<sup>31</sup> do 2<sup>31</sup>-1)
 +
 +
<b>Single</b>: liczby wymierne od 3,402823 x 10E38 do 1,401298 x 10E-45
 +
 +
<b>Double</b>: liczby wymierne od 1,79769313486232 x 10E308 do 4,94065645841247 x 10E-324
 +
 +
<b>String</b>: ciągi znakowe o długości do 65535 znaków
 +
 +
<b>Boolean</b>: wartości logiczne: TRUE (prawda) lub FALSE (fałsz) (liczba zero odpowiada wartości FALSE, każda liczba różna od zera odpowiada wartości TRUE)
 +
 +
<b>Date</b>: informacje o dacie i godzinie (dacie 31.12.1899 odpowiada wartość liczbowa 1)
 +
 +
<b>Currency</b>: liczby w formacie walutowym (z symbolem waluty)
 +
 +
<b>Object</b>: zmienna typu obiekt
 +
 +
<b>Variant</b>: do zmiennej typu <b>Variant</b> można przypisać każdy rodzaj wymienionych wyżej danych
 +
 
 +
 
 +
 
 +
 
 +
 
 +
== Deklarowanie zmiennych wewnątrz procedury lub funkcji ==
 +
 
 +
Każdą zmienną należy deklarować oddzielnie. Jeżeli nazwy zmiennych oddzielimy przecinkami, to tylko ostatnia zmienna zostanie zadeklarowane zgodne z podanym typem. Pozostałe zmienne będą zmiennymi typu '''Variant'''. W poniższych procedurach typy zmiennych a1, a2, a3 oraz typy zmiennych x1, x2, x3 są (odpowiednio) jednakowe.
 +
 
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Zmienne1()
 +
    <span style='color:#707070;'>'zmienne a1, a2, a3 są zadeklarowane tak samo, jak zmienne x1, x2, x3</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> a1, a2, a3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> x1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Variant</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> x2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Variant</span>
 +
     <b><span style='color:#1f1c1b;'>Dim</span></b> x3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
    a1 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span>
 +
    a2 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;abcd&quot;</span>
 +
    a3 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;xyz&quot;</span>
 +
    x1 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span>
 +
    x2 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;abcd&quot;</span>
 +
     x3 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;xyz&quot;</span>
 +
    MsgBox <span style='color:#ff0000;'>&quot;a1=&quot;</span> <span style='color:#000080;'>&amp;</span> a1 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;  a2=&quot;</span> <span style='color:#000080;'>&amp;</span> a2 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;  a3=&quot;</span> <span style='color:#000080;'>&amp;</span> a3 <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> _
 +
            <span style='color:#ff0000;'>&quot;x1=&quot;</span> <span style='color:#000080;'>&amp;</span> x1 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;   x2=&quot;</span> <span style='color:#000080;'>&amp;</span> x2 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;  x3=&quot;</span> <span style='color:#000080;'>&amp;</span> x3
 +
    <span style='color:#707070;'>'a1=1  a2=abcd  a3=0</span>
 +
    <span style='color:#707070;'>'x1=1  x2=abcd   x3=0</span>
 +
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 +
 
 +
 
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Zmienne2()
 +
    <span style='color:#707070;'>'zmienne a1, a2, a3 są zadeklarowane tak samo, jak zmienne x1, x2, x3</span>
 +
     <b><span style='color:#1f1c1b;'>Dim</span></b> a1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, a2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, a3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> x1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> x2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> x3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
     a1 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span>
 +
    a2 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;abcd&quot;</span>
 +
    a3 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;xyz&quot;</span>
 +
    x1 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span>
 +
    x2 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;abcd&quot;</span>
 +
    x3 <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;xyz&quot;</span>
 +
    MsgBox <span style='color:#ff0000;'>&quot;a1=&quot;</span> <span style='color:#000080;'>&amp;</span> a1 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;  a2=&quot;</span> <span style='color:#000080;'>&amp;</span> a2 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;   a3=&quot;</span> <span style='color:#000080;'>&amp;</span> a3 <span style='color:#000080;'>&amp;</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&amp;</span> _
 +
            <span style='color:#ff0000;'>&quot;x1=&quot;</span> <span style='color:#000080;'>&amp;</span> x1 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;   x2=&quot;</span> <span style='color:#000080;'>&amp;</span> x2 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;  x3=&quot;</span> <span style='color:#000080;'>&amp;</span> x3
 +
    <span style='color:#707070;'>'a1=1  a2=0  a3=0</span>
 +
    <span style='color:#707070;'>'x1=1  x2=0  x3=0</span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  
  
Zauważmy, że znaczenie ostatniego parametru obydwu funkcji jest takie samo (0 / FALSE - rozróżnianie są małe i&nbsp;duże litery), ale domyślne działanie funkcji jest odwrotne. W&nbsp;przypadku braku ostatniego parametru funkcja Zamien() rozróżnia małe i&nbsp;duże litery, a&nbsp;funkcja Replace() nie rozróżnia.
+
Link:<br/>
 +
[https://help.libreoffice.org/latest/pl/text/sbasic/shared/03102100.html Instrukcja Dim]
 +
 
 +
 
 +
 
 +
 
 +
 
 +
== Deklarowanie typu funkcji oraz typu parametrów procedury lub funkcji ==
 +
 
 +
Typ funkcji oraz typy parametrów w procedurze lub funkcji deklarujemy według schematu:
  
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>NazwaFunkcji(Parametr1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>TypZmiennej</span>, ..., ParametrN <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>TypZmiennej</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>TypZmiennej</span></span>
  
 +
Przykładowo:
  
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>PoleProstokata(a <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span></span>
  
  
== Losowa litera alfabetu ==
+
'''UWAGA:'''
Funkcja zwraca losową (przypadkową) literę alfabetu angielskiego.
 
  
<span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>RandomLetter() <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>String</span>
+
Nie powinniśmy wywoływać funkcji z&nbsp;parametrem innego typu niż typ zadeklarowany w&nbsp;funkcji. Jednak ludzie popełniają błędy i&nbsp;należy wiedzieć, co się stanie w&nbsp;takim przypadku. Musimy pamiętać, że LibreOffice nie zgłosi automatycznie błędu w&nbsp;przypadku wykrycia niezgodności typów, ale podejmie próbę konwersji użytej zmiennej na typ zgodny z&nbsp;zadeklarowanym w&nbsp;kodzie funkcji. Poniższa tabela przedstawia, jakie wartości otrzymamy w&nbsp;zależności od zadeklarowanego typu parametru i&nbsp;jego pierwotnej wartości:
    <span style='color:#707070;'>'zwraca przypadkową literę z alfabetu angielskiego</span>
 
    <b><span style='color:#1f1c1b;'>Dim</span></b> k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 
    k <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>65</span> + <span style='color:#0095ff;'>Int</span>( <span style='color:#ff0000;'>26</span> * <span style='color:#0095ff;'>Rnd</span>() ) <span style='color:#707070;'>'Rnd() zwraca liczbę losową z przedziału [0,1)</span>
 
    RandomLetter <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Chr</span>(k) <span style='color:#707070;'>'duże litery alfabetu angielskiego mają kody ASCII od 65 do 90</span>
 
<b><span style='color:#1f1c1b;'>End Function</span></b></span>
 
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Tekstowe2()
+
{| class="wikitable"  style="font-size: 100%; text-align: left; margin: 1em auto 1em auto;"
     <span style='color:#707070;'>'wypełnia kolumnę A pierwszego arkusza przypadkowymi literami alfabetu angielskiego</span>
+
! width="200px" |
     <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oCll <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
+
! width="60px" | '''Integer'''
     <b><span style='color:#1f1c1b;'>Dim</span></b> k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
+
! width="60px" | '''Long'''
     oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span>
+
! width="70px" | '''Single'''
    ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span>
+
! width="70px" | '''Double'''
    oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>0</span>).<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;Litery&quot;</span>
+
! width="100px" | '''String'''
    <b><span style='color:#1f1c1b;'>For </span></b>k <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>2600</span>
+
! width="90px" | '''Boolean'''
        oSht.getCellByPosition(<span style='color:#ff0000;'>0</span>, k).<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> RandomLetter()
+
! width="170px" | '''Date'''
    <b><span style='color:#1f1c1b;'>Next </span></b>k
+
! width="100px" | '''Currency'''
 +
|-
 +
| "abc" || 0 || 0 || 0 || 0 || "abc" || '''X''' || '''X''' || '''X'''
 +
|-
 +
| "357" || 357 || 357 || 357 || 357 || "357" || True || '''X''' || 357.0000
 +
|-
 +
| "3.57" || 4 || 4 || 3,57 || 3,57 || "3.57" || True || '''X''' || 3.5700
 +
|-
 +
| 123 || 123 || 123 || 123 || 123 || "123" || True || 02.05.1900 || 123.0000
 +
|-
 +
| 456.789 || 457 || 457 || 456,789 || 456,789 || "456,789" || True || 31.03.1901 18:56:09 || 456.7890
 +
|-
 +
| True || -1 || -1 || -1 || -1 || "True" || True || 29.12.1899 || -1.0000
 +
|-
 +
| False || 0 || 0 || 0 || 0 || "False" || False || 00:00:00 || 0.0000
 +
|-
 +
| DateSerial(2000, 12, 30) || '''Y''' || 36890 || 36890 || 36890 || "30.12.2000" || True || 30.12.2000 || 36890.0000
 +
|}
 +
 
 +
 
 +
Symbole '''X''' oraz '''Y''' oznaczają, że wystąpi błąd i pojawią się następujące komunikaty o błędzie:
 +
 
 +
'''X''' – Niedopuszczalna wartość lub typ danych. Niezgodne typy danych.
 +
 +
'''Y''' – Niedopuszczalna wartość lub typ danych. Przepełnienie.
 +
 
 +
 
 +
 
 +
 
 +
 
 +
== Zmienne statyczne ==
 +
 
 +
Zmienne statyczne deklarujemy poleceniem:
 +
 
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Static</span></b> NazwaZmiennej <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>TypZmiennej</span></span>
 +
 
 +
 
 +
Zmienna statyczna jest widoczna tylko w obrębie procedury lub funkcji, w której została zadeklarowana. Po zakończeniu działania procedury lub funkcji, w której zmienna statyczna została zadeklarowana, wartość zmiennej statycznej nie ginie, ale będzie stanowiła wartość początkową tej zmiennej przy kolejnym wywołaniu procedury lub funkcji. Inaczej mówiąc, zmienna statyczna zachowuje wartość między kolejnymi wywołaniami procedury / funkcji.
 +
 
 +
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>StaticTest()
 +
     <span style='color:#707070;'>'zmienna a po zadeklarowaniu przyjmie wartość 0</span>
 +
     <b><span style='color:#1f1c1b;'>Dim</span></b> a <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
    <span style='color:#707070;'>'zmienna statyczna s po zadeklarowaniu przyjmie wartość 0 lub wartość, jaką miała</span>
 +
    <span style='color:#707070;'>'w momencie zakończenia działania procedury lub funkcji, w której została zadeklarowana</span>
 +
     <b><span style='color:#1f1c1b;'>Static</span></b> s <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
     MsgBox <span style='color:#ff0000;'>&quot;a=&quot;</span> <span style='color:#000080;'>&amp;</span> a <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;  s=&quot;</span> <span style='color:#000080;'>&amp;</span> s
 +
    a <span style='color:#000080;'>=</span> a + <span style='color:#ff0000;'>1</span>
 +
    s <span style='color:#000080;'>=</span> s + <span style='color:#ff0000;'>1</span>
 +
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 +
 
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Zmienne3()
 +
    <b><span style='color:#000000;'>Call</span></b> StaticTest() <span style='color:#707070;'>'a=0  s=0</span>
 +
    <b><span style='color:#000000;'>Call</span></b> StaticTest() <span style='color:#707070;'>'a=0  s=1</span>
 +
    <b><span style='color:#000000;'>Call</span></b> StaticTest() <span style='color:#707070;'>'a=0  s=2</span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 +
 +
 +
Link:<br/>
 +
[https://help.libreoffice.org/7.0/pl/text/sbasic/shared/03103500.html?&DbPAR=WRITER&System=UNIX Instrukcja Static]
 +
 +
 +
 +
 +
 +
== Deklarowanie zmiennych poza procedurą lub funkcją ==
 +
 +
Istnieją trzy instrukcje, za pomocą których deklarujemy zmienne poza podprogramem: '''Private''', '''Public''' i&nbsp;'''Global'''. W&nbsp;przypadku deklaracji Public i&nbsp;Global zmienna zadeklarowana poza podprogramem jest widoczna we wszystkich modułach. W&nbsp;przypadku deklaracji Private sytuacja jest bardziej skomplikowana i&nbsp;zależy również od tego, w&nbsp;ilu modułach zmienna została zadeklarowana.
 +
 +
 +
Uwaga:<br/>
 +
Jeżeli w&nbsp;module umieścimy kilka deklaracji zmiennej jako Private / Public / Global (co może się zdarzyć w&nbsp;wyniku błędu lub w&nbsp;czasie testowania), to o&nbsp;typie zmiennej decyduje ostatnia z&nbsp;wypisanych deklaracji.
 +
 +
 +
 +
=== Uwagi i&nbsp;oznaczenia ===
 +
 +
Jeżeli w&nbsp;jakimkolwiek module zostanie wywołany podprogram, wewnątrz którego zmienna Zmn została zadeklarowana instrukcją Dim, to deklaracja wewnątrz podprogramu jest nadrzędna. Oznacza to, że jest inicjowana nowa zmienna o&nbsp;nazwie Zmn, która będzie istniała do czasu zakończenia wykonywania tego podprogramu, a&nbsp;w&nbsp;tym czasie zmienna zdefiniowana na zewnątrz będzie niedostępna (zostanie przesłonięta przez nową zmienną).
 +
 +
 +
Oznaczenia:<br/>
 +
'''ModuleA''' – moduł, w&nbsp;którym znajduje się uruchamiany program (program główny)<br/>
 +
'''ProgA''' – program główny uruchamiany przez użytkownika, który znajduje się w&nbsp;module o&nbsp;nazwie ModuleA<br/>
 +
'''Zmn''' – nazwa zmiennej, która nie jest zadeklarowana wewnątrz ProgA i&nbsp;musi zostać zadeklarowana jako Private / Public / Global, aby system nie wykazał błędu<br/>
 +
'''ModuleFrst''' – nazwa pierwszego z&nbsp;modułów, w&nbsp;którym występuje deklaracja Private zmiennej Zmn<br/>
 +
'''ModuleLst''' – nazwa ostatniego z&nbsp;modułów, w&nbsp;którym występuje deklaracja Public lub Global zmiennej Zmn<br/>
 +
 +
 +
Zauważmy, że ProgA może zakończyć działanie:<br/>
 +
:* nie odwołując się do żadnych innych podprogramów<br/>
 +
:* odwołując się jedynie do podprogramów z&nbsp;ModuleA<br/>
 +
:* odwołując się do dowolnych podprogramów, z&nbsp;których przynajmniej jeden znajduje się w&nbsp;module innym niż ModuleA<br/>
 +
 +
 +
 +
=== Private ===
 +
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Private</span></b> Zmn <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>TypZmiennej</span></span>
 +
 +
Jeżeli w&nbsp;danym module zmienna Zmn nie jest zadeklarowana jako Private, to każde wywołanie podprogramu z&nbsp;tego modułu (w&nbsp;którym to podprogramie zmienna Zmn nie została zadeklarowana instrukcją Dim), nie wpływa na zmienną Zmn i&nbsp;jest ona cały czas dostępna zgodnie z&nbsp;wcześniejszą deklaracją i&nbsp;poprzednią wartością.
 +
 +
 +
 +
Opis działania deklaracji Private sprowadza się do dwóch przypadków:
 +
 +
 +
<u>A. Zmienna Zmn jest zadeklarowana jako Private w&nbsp;ModuleA</u><br/>
 +
W tym przypadku deklaracja zmiennej Zmn obowiązuje tak długo, dopóki nie zostanie wywołany podprogram z&nbsp;innego modułu, w&nbsp;którym zmienna Zmn jest zadeklarowana jako Private. Od tej chwili system tworzy kolejną zmienną o&nbsp;tej samej nazwie, która będzie istniała do momentu opuszczenia tego modułu.
 +
 +
 +
<u>B. Zmienna Zmn nie jest zadeklarowana jako Private w&nbsp;ModuleA</u><br/>
 +
W tym przypadku zmienna Zmn zostanie zadeklarowana zgodnie z&nbsp;deklaracją zmiennej Zmn znajdującą się w&nbsp;ModuleFrst. Podobnie jak w&nbsp;przypadku A. deklaracja zmiennej Zmn obowiązuje tak długo, aż nie zostanie wywołany podprogram z&nbsp;innego modułu, w&nbsp;którym zmienna Zmn jest zadeklarowana jako Private. Od tej chwili system tworzy kolejną zmienną o&nbsp;tej samej nazwie, która będzie istniała do chwili opuszczenia tego modułu. Nie dotyczy to wywołania podprogramu z&nbsp;ModuleFrst – w&nbsp;tym przypadku nie zostanie utworzona nowa zmienna.
 +
 +
 +
 +
Zauważmy, że zmienna zadeklarowana jako Private tylko w&nbsp;jednym z&nbsp;modułów jest widoczna we wszystkich modułach. Może spowodować to niezamierzone skutki:<br/>
 +
:* jeżeli użyjemy zmiennej o&nbsp;takiej samej nazwie wewnątrz podprogramu, to system nie ostrzeże nas o&nbsp;niezadeklarowaniu zmiennej
 +
:* przypadkowe zadeklarowanie tej samej zmiennej w&nbsp;innym module jako Private może doprowadzić do błędu w&nbsp;obliczeniach
 +
 +
 +
 +
=== Public ===
 +
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Public</span></b> Zmn <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>TypZmiennej</span></span>
 +
 +
Zmienna zadeklarowana jako Public jest widoczna we wszystkich modułach. Po wykonaniu procedury lub funkcji jej wartość zostaje zresetowana. Jeżeli zamieścimy wiele deklaracji zmiennej Zmn jako Public, to zmienna Zmn zostanie zadeklarowana zgodnie z&nbsp;deklaracją umieszczoną w&nbsp;ModuleLst.
 +
 +
 +
 +
Link:<br/>
 +
[https://help.libreoffice.org/latest/pl/text/sbasic/shared/03103400.html Instrukcja Public]
 +
 +
 +
 +
=== Global ===
 +
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Global</span></b> Zmn <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>TypZmiennej</span></span>
 +
 +
Zmienna zadeklarowana jako Global jest widoczna we wszystkich modułach. Po zakończeniu programu ProgA jej wartość nie jest resetowana i&nbsp;jest dostępna przy kolejnym wywołaniu dowolnej procedury lub funkcji. Jeżeli zamieścimy wiele deklaracji zmiennej Zmn jako Global, to zmienna Zmn zostanie zadeklarowana zgodnie z&nbsp;deklaracją umieszczoną  w&nbsp;ModuleLst.
 +
 +
 +
Uwaga:<br/>
 +
Jeżeli usuniemy deklarację zmiennej jako Global zamieszczoną w&nbsp;ModuleLst, to LibreOffice tego nie nie zauważy i&nbsp;nie nastąpi zmiana typu zmiennej. Musimy ponownie załadować plik, korzystając z&nbsp;opcji: Plik ➔ Załaduj ponownie (lub sekwencją klawiszy: Lewy Alt + [p] [w] [Enter])
 +
 +
 +
Link:<br/>
 +
[https://help.libreoffice.org/latest/pl/text/sbasic/shared/03103450.html Instrukcja Global]
 +
 +
 +
 +
=== Wnioski ===
 +
 +
Z powyższej analizy wynika, że najdogodniej jest posługiwać się zmiennymi zadeklarowanymi jako Public. Jeżeli dodatkowo przyjmiemy zasadę, że wszystkie te zmienne deklarujemy w&nbsp;pierwszym module zaraz pod instrukcją Option Explicit, to prawdopodobieństwo utraty kontroli nad tymi zmiennymi i&nbsp;popełnienia błędu będzie znikome.
 +
 +
 +
Uwaga:<br/>
 +
Czytelnik może spotkać się z&nbsp;deklaracją zmiennych na zewnątrz procedur lub funkcji przy pomocy słowa Dim. Taka deklaracja jest równoważna deklaracji przy pomocy słowa Private i&nbsp;nie należy jej stosować, bo po pierwsze cierpi na tym czytelność napisanego kodu, a&nbsp;po drugie nie mamy żadnej gwarancji, że ten sposób deklarowania zmiennych na zewnątrz podprogramów zostanie w&nbsp;przyszłości utrzymany.
  
  

Aktualna wersja na dzień 22:36, 18 wrz 2022

16.10.2020



Korzystanie ze zmiennych

Deklarowanie zmiennych nie jest obowiązkowe, ale jest to niebezpieczne i kto tego nie czyni, ten sam sobie szkodzi. Deklarowanie zmiennych można wymusić dodając instrukcję

Option Explicit

w pierwszej linii każdego modułu.


Linki:
Instrukcja Option Explicit

Korzystanie ze zmiennych

Using Procedures, Functions and Properties



Typy zmiennych

Integer: liczby całkowite od -32768 do 32767 (czyli od -215 do 215-1)

Long: liczby całkowite od -2147483648 do 2147483647 (czyli od -231 do 231-1)

Single: liczby wymierne od 3,402823 x 10E38 do 1,401298 x 10E-45

Double: liczby wymierne od 1,79769313486232 x 10E308 do 4,94065645841247 x 10E-324

String: ciągi znakowe o długości do 65535 znaków

Boolean: wartości logiczne: TRUE (prawda) lub FALSE (fałsz) (liczba zero odpowiada wartości FALSE, każda liczba różna od zera odpowiada wartości TRUE)

Date: informacje o dacie i godzinie (dacie 31.12.1899 odpowiada wartość liczbowa 1)

Currency: liczby w formacie walutowym (z symbolem waluty)

Object: zmienna typu obiekt

Variant: do zmiennej typu Variant można przypisać każdy rodzaj wymienionych wyżej danych



Deklarowanie zmiennych wewnątrz procedury lub funkcji

Każdą zmienną należy deklarować oddzielnie. Jeżeli nazwy zmiennych oddzielimy przecinkami, to tylko ostatnia zmienna zostanie zadeklarowane zgodne z podanym typem. Pozostałe zmienne będą zmiennymi typu Variant. W poniższych procedurach typy zmiennych a1, a2, a3 oraz typy zmiennych x1, x2, x3 są (odpowiednio) jednakowe.

Sub Zmienne1()
    'zmienne a1, a2, a3 są zadeklarowane tak samo, jak zmienne x1, x2, x3
    Dim a1, a2, a3 as Long
    Dim x1 as Variant
    Dim x2 as Variant
    Dim x3 as Long
    a1 = 1
    a2 = "abcd"
    a3 = "xyz"
    x1 = 1
    x2 = "abcd"
    x3 = "xyz"
    MsgBox "a1=" & a1 & "   a2=" & a2 & "   a3=" & a3 & Chr(10) & _
           "x1=" & x1 & "   x2=" & x2 & "   x3=" & x3
    'a1=1   a2=abcd   a3=0
    'x1=1   x2=abcd   x3=0
End Sub


Sub Zmienne2()
    'zmienne a1, a2, a3 są zadeklarowane tak samo, jak zmienne x1, x2, x3
    Dim a1 as Long, a2 as Long, a3 as Long
    Dim x1 as Long
    Dim x2 as Long
    Dim x3 as Long
    a1 = 1
    a2 = "abcd"
    a3 = "xyz"
    x1 = 1
    x2 = "abcd"
    x3 = "xyz"
    MsgBox "a1=" & a1 & "   a2=" & a2 & "   a3=" & a3 & Chr(10) & _
           "x1=" & x1 & "   x2=" & x2 & "   x3=" & x3
    'a1=1   a2=0   a3=0
    'x1=1   x2=0   x3=0
End Sub


Link:
Instrukcja Dim



Deklarowanie typu funkcji oraz typu parametrów procedury lub funkcji

Typ funkcji oraz typy parametrów w procedurze lub funkcji deklarujemy według schematu:

Function NazwaFunkcji(Parametr1 as TypZmiennej, ..., ParametrN as TypZmiennej) as TypZmiennej

Przykładowo:

Function PoleProstokata(a as Double, b as Double) as Double


UWAGA:

Nie powinniśmy wywoływać funkcji z parametrem innego typu niż typ zadeklarowany w funkcji. Jednak ludzie popełniają błędy i należy wiedzieć, co się stanie w takim przypadku. Musimy pamiętać, że LibreOffice nie zgłosi automatycznie błędu w przypadku wykrycia niezgodności typów, ale podejmie próbę konwersji użytej zmiennej na typ zgodny z zadeklarowanym w kodzie funkcji. Poniższa tabela przedstawia, jakie wartości otrzymamy w zależności od zadeklarowanego typu parametru i jego pierwotnej wartości:

Integer Long Single Double String Boolean Date Currency
"abc" 0 0 0 0 "abc" X X X
"357" 357 357 357 357 "357" True X 357.0000
"3.57" 4 4 3,57 3,57 "3.57" True X 3.5700
123 123 123 123 123 "123" True 02.05.1900 123.0000
456.789 457 457 456,789 456,789 "456,789" True 31.03.1901 18:56:09 456.7890
True -1 -1 -1 -1 "True" True 29.12.1899 -1.0000
False 0 0 0 0 "False" False 00:00:00 0.0000
DateSerial(2000, 12, 30) Y 36890 36890 36890 "30.12.2000" True 30.12.2000 36890.0000


Symbole X oraz Y oznaczają, że wystąpi błąd i pojawią się następujące komunikaty o błędzie:

X – Niedopuszczalna wartość lub typ danych. Niezgodne typy danych.

Y – Niedopuszczalna wartość lub typ danych. Przepełnienie.



Zmienne statyczne

Zmienne statyczne deklarujemy poleceniem:

Static NazwaZmiennej as TypZmiennej


Zmienna statyczna jest widoczna tylko w obrębie procedury lub funkcji, w której została zadeklarowana. Po zakończeniu działania procedury lub funkcji, w której zmienna statyczna została zadeklarowana, wartość zmiennej statycznej nie ginie, ale będzie stanowiła wartość początkową tej zmiennej przy kolejnym wywołaniu procedury lub funkcji. Inaczej mówiąc, zmienna statyczna zachowuje wartość między kolejnymi wywołaniami procedury / funkcji.

Sub StaticTest()
    'zmienna a po zadeklarowaniu przyjmie wartość 0
    Dim a as Long
    'zmienna statyczna s po zadeklarowaniu przyjmie wartość 0 lub wartość, jaką miała
    'w momencie zakończenia działania procedury lub funkcji, w której została zadeklarowana
    Static s as Long
    MsgBox "a=" & a & "   s=" & s
    a = a + 1
    s = s + 1
End Sub
Sub Zmienne3()
    Call StaticTest() 'a=0   s=0
    Call StaticTest() 'a=0   s=1
    Call StaticTest() 'a=0   s=2
End Sub


Link:
Instrukcja Static



Deklarowanie zmiennych poza procedurą lub funkcją

Istnieją trzy instrukcje, za pomocą których deklarujemy zmienne poza podprogramem: Private, PublicGlobal. W przypadku deklaracji Public i Global zmienna zadeklarowana poza podprogramem jest widoczna we wszystkich modułach. W przypadku deklaracji Private sytuacja jest bardziej skomplikowana i zależy również od tego, w ilu modułach zmienna została zadeklarowana.


Uwaga:
Jeżeli w module umieścimy kilka deklaracji zmiennej jako Private / Public / Global (co może się zdarzyć w wyniku błędu lub w czasie testowania), to o typie zmiennej decyduje ostatnia z wypisanych deklaracji.


Uwagi i oznaczenia

Jeżeli w jakimkolwiek module zostanie wywołany podprogram, wewnątrz którego zmienna Zmn została zadeklarowana instrukcją Dim, to deklaracja wewnątrz podprogramu jest nadrzędna. Oznacza to, że jest inicjowana nowa zmienna o nazwie Zmn, która będzie istniała do czasu zakończenia wykonywania tego podprogramu, a w tym czasie zmienna zdefiniowana na zewnątrz będzie niedostępna (zostanie przesłonięta przez nową zmienną).


Oznaczenia:
ModuleA – moduł, w którym znajduje się uruchamiany program (program główny)
ProgA – program główny uruchamiany przez użytkownika, który znajduje się w module o nazwie ModuleA
Zmn – nazwa zmiennej, która nie jest zadeklarowana wewnątrz ProgA i musi zostać zadeklarowana jako Private / Public / Global, aby system nie wykazał błędu
ModuleFrst – nazwa pierwszego z modułów, w którym występuje deklaracja Private zmiennej Zmn
ModuleLst – nazwa ostatniego z modułów, w którym występuje deklaracja Public lub Global zmiennej Zmn


Zauważmy, że ProgA może zakończyć działanie:

  • nie odwołując się do żadnych innych podprogramów
  • odwołując się jedynie do podprogramów z ModuleA
  • odwołując się do dowolnych podprogramów, z których przynajmniej jeden znajduje się w module innym niż ModuleA


Private

Private Zmn as TypZmiennej

Jeżeli w danym module zmienna Zmn nie jest zadeklarowana jako Private, to każde wywołanie podprogramu z tego modułu (w którym to podprogramie zmienna Zmn nie została zadeklarowana instrukcją Dim), nie wpływa na zmienną Zmn i jest ona cały czas dostępna zgodnie z wcześniejszą deklaracją i poprzednią wartością.


Opis działania deklaracji Private sprowadza się do dwóch przypadków:


A. Zmienna Zmn jest zadeklarowana jako Private w ModuleA
W tym przypadku deklaracja zmiennej Zmn obowiązuje tak długo, dopóki nie zostanie wywołany podprogram z innego modułu, w którym zmienna Zmn jest zadeklarowana jako Private. Od tej chwili system tworzy kolejną zmienną o tej samej nazwie, która będzie istniała do momentu opuszczenia tego modułu.


B. Zmienna Zmn nie jest zadeklarowana jako Private w ModuleA
W tym przypadku zmienna Zmn zostanie zadeklarowana zgodnie z deklaracją zmiennej Zmn znajdującą się w ModuleFrst. Podobnie jak w przypadku A. deklaracja zmiennej Zmn obowiązuje tak długo, aż nie zostanie wywołany podprogram z innego modułu, w którym zmienna Zmn jest zadeklarowana jako Private. Od tej chwili system tworzy kolejną zmienną o tej samej nazwie, która będzie istniała do chwili opuszczenia tego modułu. Nie dotyczy to wywołania podprogramu z ModuleFrst – w tym przypadku nie zostanie utworzona nowa zmienna.


Zauważmy, że zmienna zadeklarowana jako Private tylko w jednym z modułów jest widoczna we wszystkich modułach. Może spowodować to niezamierzone skutki:

  • jeżeli użyjemy zmiennej o takiej samej nazwie wewnątrz podprogramu, to system nie ostrzeże nas o niezadeklarowaniu zmiennej
  • przypadkowe zadeklarowanie tej samej zmiennej w innym module jako Private może doprowadzić do błędu w obliczeniach


Public

Public Zmn as TypZmiennej

Zmienna zadeklarowana jako Public jest widoczna we wszystkich modułach. Po wykonaniu procedury lub funkcji jej wartość zostaje zresetowana. Jeżeli zamieścimy wiele deklaracji zmiennej Zmn jako Public, to zmienna Zmn zostanie zadeklarowana zgodnie z deklaracją umieszczoną w ModuleLst.


Link:
Instrukcja Public


Global

Global Zmn as TypZmiennej

Zmienna zadeklarowana jako Global jest widoczna we wszystkich modułach. Po zakończeniu programu ProgA jej wartość nie jest resetowana i jest dostępna przy kolejnym wywołaniu dowolnej procedury lub funkcji. Jeżeli zamieścimy wiele deklaracji zmiennej Zmn jako Global, to zmienna Zmn zostanie zadeklarowana zgodnie z deklaracją umieszczoną w ModuleLst.


Uwaga:
Jeżeli usuniemy deklarację zmiennej jako Global zamieszczoną w ModuleLst, to LibreOffice tego nie nie zauważy i nie nastąpi zmiana typu zmiennej. Musimy ponownie załadować plik, korzystając z opcji: Plik ➔ Załaduj ponownie (lub sekwencją klawiszy: Lewy Alt + [p] [w] [Enter])


Link:
Instrukcja Global


Wnioski

Z powyższej analizy wynika, że najdogodniej jest posługiwać się zmiennymi zadeklarowanymi jako Public. Jeżeli dodatkowo przyjmiemy zasadę, że wszystkie te zmienne deklarujemy w pierwszym module zaraz pod instrukcją Option Explicit, to prawdopodobieństwo utraty kontroli nad tymi zmiennymi i popełnienia błędu będzie znikome.


Uwaga:
Czytelnik może spotkać się z deklaracją zmiennych na zewnątrz procedur lub funkcji przy pomocy słowa Dim. Taka deklaracja jest równoważna deklaracji przy pomocy słowa Private i nie należy jej stosować, bo po pierwsze cierpi na tym czytelność napisanego kodu, a po drugie nie mamy żadnej gwarancji, że ten sposób deklarowania zmiennych na zewnątrz podprogramów zostanie w przyszłości utrzymany.





LibreOffice Calc – makra                   Strona główna