Różnica pomiędzy stronami "Funkcje liczbowe" i "Zakresy komórek – metody getData i getDataArray"

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;">27.09.2020</div>
+
<div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">02.08.2020</div>
  
__FORCETOC__
 
  
  
  
== Logarytm o podstawie 10 ==
 
  
Korzystając ze wzoru na zmianę podstawy logarytmu:
+
== Szybkość operowania danymi zapisanymi w komórkach i danymi zapisanymi w tablicy ==
  
::log<sub>a</sub>(x) = log<sub>b</sub>(x)/log<sub>b</sub>(a)
+
Prosty przykład pokaże nam różnicę między operowaniem na komórkach z&nbsp;zakresu komórek i&nbsp;na tablicy danych utworzonych z&nbsp;zakresu komórek. Zauważmy, że zmienna oRngData jest tablicą tablic, przykładowo mamy:<br/>
 +
oRngData(0)(1) oznacza pierwszą tablicę w&nbsp;tablicy tablic oRngData i&nbsp;drugi element w&nbsp;tej pierwszej tablicy<br/>
 +
oRngData(0)(2) oznacza pierwszą tablicę w&nbsp;tablicy tablic oRngData i&nbsp;trzeci element w&nbsp;tej pierwszej tablicy itd.<br/>
 +
W przedstawionym niżej przykładzie operujemy na danych liczbowych – dalsze przykłady pokażą dlaczego i&nbsp;jakie ma to znaczenie.
  
łatwo zdefiniujemy logarytm o podstawie równej 10:
+
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>ZakresyGetData1()
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRngA <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRngB <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRngC <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> oRngData() <span style='color:#707070;'>'tablica zawierająca dane</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> r <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> t <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span>, d1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span>, d2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span>, d3 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Date</span>
 +
    oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span>
 +
    oRngA <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>&quot;A1:A100000&quot;</span>) <span style='color:#707070;'>'uchwyt do zakresu komórek</span>
 +
    oRngB <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>&quot;B1:B100000&quot;</span>) <span style='color:#707070;'>'uchwyt do zakresu komórek</span>
 +
    oRngC <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>&quot;C1:C100000&quot;</span>) <span style='color:#707070;'>'uchwyt do zakresu komórek</span>
 +
   
 +
    <span style='color:#707070;'>'wypełniamy 100000 komórek kolumny A liczbami losowymi z przedziału [0,1) i mierzymy czas tej operacji</span>
 +
    t <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Now</span>() <span style='color:#707070;'>'można też wykorzystać funkcję Timer()</span>
 +
    <b><span style='color:#1f1c1b;'>For </span></b>r <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>99999</span>
 +
        oRngA.getCellByPosition(<span style='color:#ff0000;'>0</span>, r).Value <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Rnd</span>()
 +
    <b><span style='color:#1f1c1b;'>Next </span></b>r
 +
    d1 <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Now</span>() - t <u><span style='color:#707070;'>'ok. 90 sekund</span></u>
 +
   
 +
    <span style='color:#707070;'>'wypełniamy 100000 komórek kolumny B podwojonymi wartościami z kolumny A i mierzymy czas tej operacji</span>
 +
    t <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Now</span>() <span style='color:#707070;'>'można też wykorzystać funkcję Timer()</span>
 +
    <b><span style='color:#1f1c1b;'>For </span></b>r <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>99999</span>
 +
        oRngB.getCellByPosition(<span style='color:#ff0000;'>0</span>, r).Value <span style='color:#000080;'>=</span> oRngA.getCellByPosition(<span style='color:#ff0000;'>0</span>, r).Value * <span style='color:#ff0000;'>2</span>
 +
    <b><span style='color:#1f1c1b;'>Next </span></b>r
 +
    d2 <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Now</span>() - t <u><span style='color:#707070;'>'ok. 100 sekund</span></u>
 +
       
 +
    <span style='color:#707070;'>'wypełniamy 100000 komórek kolumny C podwojonymi wartościami z kolumny A i mierzymy czas tej operacji</span>
 +
    <span style='color:#707070;'>'tym razem wykorzystamy metodę '''getDataArray'''</span>
 +
    t <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Now</span>()
 +
    <span style='color:#707070;'>'pobieramy dane z zakresu komórek do tablicy</span>
 +
    oRngData <span style='color:#000080;'>=</span> oRngA.getDataArray() <span style='color:#707070;'>'oRngData jest tablicą tablic</span>
 +
    <b><span style='color:#1f1c1b;'>For </span></b>r <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>99999</span>
 +
        oRngData(r)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>=</span> oRngData(r)(<span style='color:#ff0000;'>0</span>) * <span style='color:#ff0000;'>2</span>
 +
    <b><span style='color:#1f1c1b;'>Next </span></b>r
 +
    <span style='color:#707070;'>'wpisujemy dane z tablicy do zakresu komórek</span>
 +
    oRngC.setDataArray(oRngData)
 +
    d3 <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Now</span>() - t <u><span style='color:#707070;'>'ok. 2 sekund</span></u>
 +
    MsgBox <span style='color:#ff0000;'>&quot;Czas: d1=&quot;</span> <span style='color:#000080;'>&amp;</span> d1 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;  d2=&quot;</span> <span style='color:#000080;'>&amp;</span> d2 <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;  d3=&quot;</span> <span style='color:#000080;'>&amp;</span> d3
 +
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 +
 
 +
 
 +
 
 +
 
 +
 
 +
== Uwagi do metod: '''getDataArray''' i '''setDataArray''' ==
  
<span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>myLog10(x <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>
+
Korzystając z metod '''getDataArray''' i '''setDataArray''' musimy pamiętać o&nbsp;tym, że możemy operować jedynie na danych liczbowych i&nbsp;tekstowych. Niedopuszczalne są wartości logiczne i&nbsp;wartości typu data.
    myLog10 <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Log</span>(x)/<span style='color:#0095ff;'>Log</span>(<span style='color:#ff0000;'>10</span>)
 
<b><span style='color:#1f1c1b;'>End Function</span></b></span>
 
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe1()
+
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>ZakresyGetData2()
     MsgBox <span style='color:#0095ff;'>myLog10</span>(<span style='color:#ff0000;'>10</span>)
+
     <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRng <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
     MsgBox <span style='color:#0095ff;'>myLog10</span>(<span style='color:#ff0000;'>100</span>)
+
    <b><span style='color:#1f1c1b;'>Dim</span></b> oRngData() <span style='color:#707070;'>'tablica zawierająca dane</span>
 +
    oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span>
 +
    oRng <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>&quot;A1:A5&quot;</span>) <span style='color:#707070;'>'uchwyt do zakresu komórek</span>
 +
     oRngData <span style='color:#000080;'>=</span> oRng.getDataArray() <span style='color:#707070;'>'pobieramy dane z zakresu komórek do tablicy tablic</span>
 +
       
 +
    oRngData(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>3.14</span>
 +
    oRngData(<span style='color:#ff0000;'>1</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>128</span>
 +
    oRngData(<span style='color:#ff0000;'>2</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;abcd&quot;</span>
 +
    <span style='color:#707070;'>'oRngData(3)(0) <span style='color:#000080;'>=</span> IsNumeric(&quot;abcd&quot;) 'spowoduje błąd metody '''setDataArray'''</span>
 +
    <span style='color:#707070;'>'oRngData(4)(0) <span style='color:#000080;'>=</span> DateSerial(2000, 12, 31) 'spowoduje błąd metody '''setDataArray'''</span>
 +
       
 +
    oRng.setDataArray(oRngData) <span style='color:#707070;'>'wpisujemy dane z tablicy do zakresu komórek</span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  
Jest to znacznie prostszy sposób niż wykorzystywanie w tym celu funkcji arkusza LOG10().
 
  
  
  
  
 +
== Uwagi do metod: '''getData''' i '''setData''' ==
  
== Liczba losowa z przedziału [a, b) ==
+
Korzystając z metod '''getData''' i '''setData''' musimy pamiętać o&nbsp;tym, że możemy operować jedynie na danych liczbowych. W&nbsp;tym przypadku wpisanie do tablicy wartości logicznych i&nbsp;typu data spowoduje zapisanie odpowiadających tym wartościom liczb, a&nbsp;przypisany tekst zostanie pominięty i&nbsp;zostanie wpisana liczba zero.
  
Funkcja Rnd() zwraca liczbę losową z przedziału [0, 1). Łatwo możemy napisać funkcję, która zwraca liczbę losową z przedziału [a, b).
+
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>ZakresyGetData3()
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRng <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> oRngData() <span style='color:#707070;'>'tablica zawierająca dane</span>
 +
    oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span>
 +
    oRng <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>&quot;A1:E1&quot;</span>) <span style='color:#707070;'>'uchwyt do zakresu komórek</span>
 +
    oRngData <span style='color:#000080;'>=</span> oRng.getData() <span style='color:#707070;'>'pobieramy dane z zakresu komórek do tablicy tablic</span>
 +
   
 +
    oRngData(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>3.14</span>
 +
    oRngData(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>1</span>) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>128</span>
 +
    oRngData(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>2</span>) <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;abcd&quot;</span>
 +
    oRngData(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>3</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>IsNumeric</span>(<span style='color:#ff0000;'>&quot;128&quot;</span>)
 +
    oRngData(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>4</span>) <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(<span style='color:#ff0000;'>2000</span>, <span style='color:#ff0000;'>12</span>, <span style='color:#ff0000;'>31</span>)
 +
   
 +
    oRng.setData(oRngData) <span style='color:#707070;'>'wpisujemy dane z tablicy do zakresu komórek</span>
 +
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  
<span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>RandNum(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 style='color:#707070;'>'funkcja zwraca liczbę losową z przedziału [a,b)</span>
 
    RandNum <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Rnd</span>()*(b-a) + a <span style='color:#707070;'>'Rnd() zwraca liczbę losową z przedziału [0,1)</span>
 
<b><span style='color:#1f1c1b;'>End Function</span></b></span>
 
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe2()
+
 
     <b><span style='color:#1f1c1b;'>Dim</span></b> oSheets <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRows <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
+
 
     <b><span style='color:#1f1c1b;'>Dim</span></b> r <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>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
+
 
     oSheets <span style='color:#000080;'>=</span> ThisComponent.getSheets() <span style='color:#707070;'>'uchwyt do skoroszytu</span>
+
== Przykłady ==
    <b><span style='color:#1f1c1b;'>If </span></b><b><span style='color:#000000;'>NOT</span></b> oSheets.hasByName( <span style='color:#ff0000;'>&quot;TestRGB&quot;</span> ) <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#707070;'>'sprawdza czy arkusz o podanej nazwie już istnieje</span>
+
 
        oSheets.insertNewByName( <span style='color:#ff0000;'>&quot;TestRGB&quot;</span>, <span style='color:#ff0000;'>0</span> ) <span style='color:#707070;'>'wstawia nowy arkusz na pozycji 1 (z indeksem 0)</span>
+
  <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>ZakresyGetData4()
    <b><span style='color:#1f1c1b;'>End If</span></b>
+
     <span style='color:#707070;'>'pobieranie danych z zakresu komórek do tablicy i wpisywanie danych z tablicy do zakresu komórek</span>
     oSht <span style='color:#000080;'>=</span> oSheets.getByName(<span style='color:#ff0000;'>&quot;TestRGB&quot;</span>) <span style='color:#707070;'>'uchwyt do arkusza &quot;TestRGB&quot;</span>
+
    <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRng <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
    ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'uaktywnienie arkusza &quot;TestRGB&quot;</span>
+
     <b><span style='color:#1f1c1b;'>Dim</span></b> c <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, r <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
     oRows <span style='color:#000080;'>=</span> oSht.getRows() <span style='color:#707070;'>'uchwyt do wierszy</span>
+
    <b><span style='color:#1f1c1b;'>Dim</span></b> oRngData() <span style='color:#707070;'>'tablica zawierająca dane</span>
     <b><span style='color:#1f1c1b;'>For </span></b>k=<span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>100</span>
+
     oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span>
        r <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) )
+
     oRng <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>&quot;B2:D9&quot;</span>) <span style='color:#707070;'>'uchwyt do zakresu komórek</span>
         g <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) )
+
     oRngData <span style='color:#000080;'>=</span> oRng.getDataArray() <span style='color:#707070;'>'pobieramy dane z zakresu komórek do tablicy</span>
        b <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) )
+
   
        oRows.getByIndex(k).Height <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>200</span> <span style='color:#707070;'>'wybiera wiersz przez indeks i ustawia jego wysokość równą 2 mm</span>
+
     <b><span style='color:#1f1c1b;'>For </span></b>r <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#0095ff;'>UBound</span>( oRngData() ) <span style='color:#707070;'>'r przebiega wiersze zakresu komórek &quot;B2:D9&quot;</span>
         oRows.getByIndex(k).CellBackColor <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>RGB</span>(r,g,b) <span style='color:#707070;'>'ustawia kolor tła wiersza</span>
+
         <b><span style='color:#1f1c1b;'>For </span></b>c <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#0095ff;'>UBound</span>( oRngData(<span style='color:#ff0000;'>0</span>) ) <span style='color:#707070;'>'c przebiega kolumny zakresu komórek &quot;B2:D9&quot;</span>
    <b><span style='color:#1f1c1b;'>Next </span></b>k
+
            oRngData(r)(c) <span style='color:#000080;'>=</span> c <span style='color:#000080;'>&amp;</span> r
 +
         <b><span style='color:#1f1c1b;'>Next </span></b>c
 +
    <b><span style='color:#1f1c1b;'>Next </span></b>r
 +
   
 +
    oRng.setDataArray(oRngData) <span style='color:#707070;'>'wpisujemy dane z tablicy do zakresu komórek</span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  
  
 +
Omówione wyżej metody możemy wykorzystać do kopiowania danych:
  
 +
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>ZakresyGetData5()
 +
    <span style='color:#707070;'>'kopiowanie danych (tylko liczby i tekst)</span>
 +
    <b><span style='color:#1f1c1b;'>Dim</span></b> oRng1 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRng2 <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
 +
    <span style='color:#707070;'>'uchwyt do zakresu komórek &quot;B2:D9&quot; w pierwszym arkuszu</span>
 +
    oRng1 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>).getCellRangeByName(<span style='color:#ff0000;'>&quot;B2:D9&quot;</span>)
 +
    <span style='color:#707070;'>'uchwyt do zakresu komórek &quot;B2:D9&quot; w drugim arkuszu</span>
 +
    oRng2 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>1</span>).getCellRangeByName(<span style='color:#ff0000;'>&quot;B2:D9&quot;</span>)
 +
    <span style='color:#707070;'>'kopiowanie</span>
 +
    oRng2.setDataArray( oRng1.getDataArray() )
 +
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
  
  
== Obliczanie pierwiastka kwadratowego ==
 
  
Zauważmy, że jeżeli liczba a jest przybliżoną wartością pierwiastka z liczby x z niedomiarem, to x/a jest przybliżoną wartością pierwiastka z liczby x z nadmiarem. Pozwala to przypuszczać, że ciąg kolejnych średnich z liczb a i x/a będzie dążył do pierwiastka z liczby a. Jest tak w istocie i pozwala to zapisać prosty algorytm służący do obliczania pierwiastka z liczby nieujemnej x ([https://pl.wikipedia.org/wiki/Algorytm_obliczania_pierwiastka_n-tego_stopnia LINK]):<br/>
 
::a<sub>1</sub> = 1<br/>
 
::a<sub>n+1</sub> = ( a<sub>n</sub> + x/a<sub>n</sub> )/2<br/>
 
  
Możemy zatem napisać własną funkcję, która oblicza pierwiastek kwadratowy. Podkreślmy, że zapisana niżej funkcja mySqr() nie jest potrzebna, bo istnieje funkcja Sqr(), która pierwiastek kwadratowy z liczby x znajduje. Funkcję tę prezentujemy jedynie jako ciekawostkę dla zainteresowanego Czytelnika, który chciałby wiedzieć, jak funkcję tę można zrealizować. Wykorzystujemy następujące rozwinięcie w szereg Taylora:
 
  
::&radic;(1+x) = 1 + x/2 - x^2/8 + x^3/16 - ...
+
== Porównanie metod '''getData()''' i '''getDataArray()''' ==
  
Rozwinięcie jest zbieżne dla |x| &le; 1
+
Należy zauważyć, że:
 +
:*getDataArray() tworzy tablicę zmiennych typu Variant, czyli przekaże również dane tekstowe
 +
:*getData() tworzy tablicę zmiennych typu Double, czyli przekaże tylko dane liczbowe
  
  <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>mySqr(x <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 style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Zakresy6()
    <span style='color:#707070;'>'funkcja oblicza pierwiastek kwadratowy z x</span>
+
    <b><span style='color:#1f1c1b;'>Dim</span></b> oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRng <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>
     <b><span style='color:#1f1c1b;'>Dim</span></b> 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>, r <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>
+
     <b><span style='color:#1f1c1b;'>Dim</span></b> A(), B(), C()
     <b><span style='color:#1f1c1b;'>If </span></b>x &lt; <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>Then</span></b>
+
    <b><span style='color:#1f1c1b;'>Dim</span></b> k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>
        mySqr <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span>
+
    oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets.getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span>
        MsgBox <span style='color:#ff0000;'>&quot;mySqr: ujemna wartość parametru!&quot;</span>
+
     ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span>
        <b><span style='color:#1f1c1b;'>Exit Function</span></b>
+
    oSht.getColumns().insertByIndex(<span style='color:#ff0000;'>0</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'dodajemy jedną kolumnę na pozycję pierwszą</span>
    <b><span style='color:#1f1c1b;'>End If</span></b>
+
    oSht.getCellRangebyName(<span style='color:#ff0000;'>&quot;A1&quot;</span>).Value <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span>
     r <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>5</span>) <span style='color:#707070;'>'wartość r wyznacza precyzję obliczeń</span>
+
     oSht.getCellRangebyName(<span style='color:#ff0000;'>&quot;A2&quot;</span>).Value <span style='color:#000080;'>=</span> True <span style='color:#707070;'>'-1</span>
    a <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span>
+
    oSht.getCellRangebyName(<span style='color:#ff0000;'>&quot;A3&quot;</span>).Value <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>DateSerial</span>(<span style='color:#ff0000;'>2000</span>, <span style='color:#ff0000;'>1</span>, <span style='color:#ff0000;'>1</span>) <span style='color:#707070;'>'36526</span>
    b <span style='color:#000080;'>=</span> x
+
    oSht.getCellRangebyName(<span style='color:#ff0000;'>&quot;A4&quot;</span>).<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>&quot;abcd&quot;</span> <span style='color:#707070;'>'0</span>
    <b><span style='color:#1f1c1b;'>If </span></b><span style='color:#0095ff;'>Abs</span>(b - a) &lt;= r <b><span style='color:#1f1c1b;'>Then</span></b>
+
    oRng <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>&quot;A1:A4&quot;</span>)
        mySqr <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span> + (x-<span style='color:#ff0000;'>1</span>)/<span style='color:#ff0000;'>2</span> - (x-<span style='color:#ff0000;'>1</span>)^<span style='color:#ff0000;'>2</span>/<span style='color:#ff0000;'>8</span> + (x-<span style='color:#ff0000;'>1</span>)^<span style='color:#ff0000;'>3</span>/<span style='color:#ff0000;'>16</span>
+
    A <span style='color:#000080;'>=</span> oRng.getDataArray()
        <b><span style='color:#1f1c1b;'>Exit Function</span></b>
+
    B <span style='color:#000080;'>=</span> oRng.getData()
    <b><span style='color:#1f1c1b;'>End If</span></b>
+
    C <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Array</span>( <span style='color:#0095ff;'>Array</span>( <span style='color:#ff0000;'>1</span> ), <span style='color:#0095ff;'>Array</span>( True ), <span style='color:#0095ff;'>Array</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:#0095ff;'>Array</span>( <span style='color:#ff0000;'>&quot;abcd&quot;</span> ) ) <span style='color:#707070;'>'tworzymy tablicę tablic</span>
    <b><span style='color:#1f1c1b;'>Do While </span></b><span style='color:#0095ff;'>Abs</span>(b - a) &gt; r
+
    MsgBox <span style='color:#ff0000;'>&quot;A <span style='color:#000080;'>=</span> [  &quot;</span> <span style='color:#000080;'>&amp;</span> A(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot; |  &quot;</span> <span style='color:#000080;'>&amp;</span> A(<span style='color:#ff0000;'>1</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;    |    &quot;</span> <span style='color:#000080;'>&amp;</span> A(<span style='color:#ff0000;'>2</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;      | &quot;</span> <span style='color:#000080;'>&amp;</span> A(<span style='color:#ff0000;'>3</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</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> _
        a <span style='color:#000080;'>=</span> b
+
            <span style='color:#ff0000;'>&quot;B <span style='color:#000080;'>=</span> [  &quot;</span> <span style='color:#000080;'>&amp;</span> B(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot; |  &quot;</span> <span style='color:#000080;'>&amp;</span> B(<span style='color:#ff0000;'>1</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;    |    &quot;</span> <span style='color:#000080;'>&amp;</span> B(<span style='color:#ff0000;'>2</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot;      | &quot;</span> <span style='color:#000080;'>&amp;</span> B(<span style='color:#ff0000;'>3</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</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> _
        b <span style='color:#000080;'>=</span> (a + x/a)/<span style='color:#ff0000;'>2</span>
+
            <span style='color:#ff0000;'>&quot;C <span style='color:#000080;'>=</span> [  &quot;</span> <span style='color:#000080;'>&amp;</span> C(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot; | &quot;</span> <span style='color:#000080;'>&amp;</span> C(<span style='color:#ff0000;'>1</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot; | &quot;</span> <span style='color:#000080;'>&amp;</span> C(<span style='color:#ff0000;'>2</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot; | &quot;</span> <span style='color:#000080;'>&amp;</span> C(<span style='color:#ff0000;'>3</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&amp;</span> <span style='color:#ff0000;'>&quot; ]&quot;</span>
    <b><span style='color:#1f1c1b;'>Loop</span></b>
+
  <b><span style='color:#1f1c1b;'>End Sub</span></b></span>
    mySqr <span style='color:#000080;'>=</span> b
 
  <b><span style='color:#1f1c1b;'>End Function</span></b></span>
 
  
<span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe3()
+
 
    MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>0.25</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;'>Sqr</span>(<span style='color:#ff0000;'>0.25</span>)
+
 
    MsgBox <span style='color:#0095ff;'>mySqr</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;'>Sqr</span>(<span style='color:#ff0000;'>1</span>)
+
 
    MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>1</span>+<span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>6</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;'>Sqr</span>(<span style='color:#ff0000;'>1</span>+<span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>6</span>))
+
 
    MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>2</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;'>Sqr</span>(<span style='color:#ff0000;'>2</span>) <span style='color:#707070;'>'√2 <span style='color:#000080;'>=</span> 1.414213562373095…</span>
+
== Polecane strony internetowe ==
    MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>3</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;'>Sqr</span>(<span style='color:#ff0000;'>3</span>) <span style='color:#707070;'>'√3 <span style='color:#000080;'>=</span> 1.732050807568877…</span>
+
 
    MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>4</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;'>Sqr</span>(<span style='color:#ff0000;'>4</span>)
+
[https://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangeData.html Apache OpenOffice – interface XCellRangeData]
<b><span style='color:#1f1c1b;'>End Sub</span></b></span>
 
  
  

Wersja z 19:08, 21 paź 2020

02.08.2020



Szybkość operowania danymi zapisanymi w komórkach i danymi zapisanymi w tablicy

Prosty przykład pokaże nam różnicę między operowaniem na komórkach z zakresu komórek i na tablicy danych utworzonych z zakresu komórek. Zauważmy, że zmienna oRngData jest tablicą tablic, przykładowo mamy:
oRngData(0)(1) oznacza pierwszą tablicę w tablicy tablic oRngData i drugi element w tej pierwszej tablicy
oRngData(0)(2) oznacza pierwszą tablicę w tablicy tablic oRngData i trzeci element w tej pierwszej tablicy itd.
W przedstawionym niżej przykładzie operujemy na danych liczbowych – dalsze przykłady pokażą dlaczego i jakie ma to znaczenie.

Sub ZakresyGetData1()
    Dim oSht as Object, oRngA as Object, oRngB as Object, oRngC as Object
    Dim oRngData() 'tablica zawierająca dane
    Dim r as Long
    Dim t as Date, d1 as Date, d2 as Date, d3 as Date
    oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
    oRngA = oSht.getCellRangeByName("A1:A100000") 'uchwyt do zakresu komórek
    oRngB = oSht.getCellRangeByName("B1:B100000") 'uchwyt do zakresu komórek
    oRngC = oSht.getCellRangeByName("C1:C100000") 'uchwyt do zakresu komórek
    
    'wypełniamy 100000 komórek kolumny A liczbami losowymi z przedziału [0,1) i mierzymy czas tej operacji
    t = Now() 'można też wykorzystać funkcję Timer()
    For r = 0 To 99999
        oRngA.getCellByPosition(0, r).Value = Rnd()
    Next r
    d1 = Now() - t 'ok. 90 sekund
    
    'wypełniamy 100000 komórek kolumny B podwojonymi wartościami z kolumny A i mierzymy czas tej operacji
    t = Now() 'można też wykorzystać funkcję Timer()
    For r = 0 To 99999
        oRngB.getCellByPosition(0, r).Value = oRngA.getCellByPosition(0, r).Value * 2
    Next r
    d2 = Now() - t 'ok. 100 sekund
        
    'wypełniamy 100000 komórek kolumny C podwojonymi wartościami z kolumny A i mierzymy czas tej operacji
    'tym razem wykorzystamy metodę getDataArray
    t = Now()
    'pobieramy dane z zakresu komórek do tablicy
    oRngData = oRngA.getDataArray() 'oRngData jest tablicą tablic
    For r = 0 To 99999
        oRngData(r)(0) = oRngData(r)(0) * 2
    Next r
    'wpisujemy dane z tablicy do zakresu komórek
    oRngC.setDataArray(oRngData)
    d3 = Now() - t 'ok. 2 sekund
    MsgBox "Czas: d1=" & d1 & "   d2=" & d2 & "   d3=" & d3
End Sub



Uwagi do metod: getDataArray i setDataArray

Korzystając z metod getDataArray i setDataArray musimy pamiętać o tym, że możemy operować jedynie na danych liczbowych i tekstowych. Niedopuszczalne są wartości logiczne i wartości typu data.

Sub ZakresyGetData2()
    Dim oSht as Object, oRng as Object
    Dim oRngData() 'tablica zawierająca dane
    oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
    oRng = oSht.getCellRangeByName("A1:A5") 'uchwyt do zakresu komórek
    oRngData = oRng.getDataArray() 'pobieramy dane z zakresu komórek do tablicy tablic
        
    oRngData(0)(0) = 3.14
    oRngData(1)(0) = 128
    oRngData(2)(0) = "abcd"
    'oRngData(3)(0) = IsNumeric("abcd") 'spowoduje błąd metody setDataArray
    'oRngData(4)(0) = DateSerial(2000, 12, 31) 'spowoduje błąd metody setDataArray
        
    oRng.setDataArray(oRngData) 'wpisujemy dane z tablicy do zakresu komórek
End Sub



Uwagi do metod: getData i setData

Korzystając z metod getData i setData musimy pamiętać o tym, że możemy operować jedynie na danych liczbowych. W tym przypadku wpisanie do tablicy wartości logicznych i typu data spowoduje zapisanie odpowiadających tym wartościom liczb, a przypisany tekst zostanie pominięty i zostanie wpisana liczba zero.

Sub ZakresyGetData3()
    Dim oSht as Object, oRng as Object
    Dim oRngData() 'tablica zawierająca dane
    oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
    oRng = oSht.getCellRangeByName("A1:E1") 'uchwyt do zakresu komórek
    oRngData = oRng.getData() 'pobieramy dane z zakresu komórek do tablicy tablic
    
    oRngData(0)(0) = 3.14
    oRngData(0)(1) = 128
    oRngData(0)(2) = "abcd"
    oRngData(0)(3) = IsNumeric("128")
    oRngData(0)(4) = DateSerial(2000, 12, 31)
    
    oRng.setData(oRngData) 'wpisujemy dane z tablicy do zakresu komórek
End Sub



Przykłady

Sub ZakresyGetData4()
    'pobieranie danych z zakresu komórek do tablicy i wpisywanie danych z tablicy do zakresu komórek
    Dim oSht as Object, oRng as Object
    Dim c as Long, r as Long
    Dim oRngData() 'tablica zawierająca dane
    oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
    oRng = oSht.getCellRangeByName("B2:D9") 'uchwyt do zakresu komórek
    oRngData = oRng.getDataArray() 'pobieramy dane z zakresu komórek do tablicy
    
    For r = 0 To UBound( oRngData() ) 'r przebiega wiersze zakresu komórek "B2:D9"
        For c = 0 To UBound( oRngData(0) ) 'c przebiega kolumny zakresu komórek "B2:D9"
            oRngData(r)(c) = c & r
        Next c
    Next r
    
    oRng.setDataArray(oRngData) 'wpisujemy dane z tablicy do zakresu komórek
End Sub


Omówione wyżej metody możemy wykorzystać do kopiowania danych:

Sub ZakresyGetData5()
    'kopiowanie danych (tylko liczby i tekst)
    Dim oRng1 as Object, oRng2 as Object
    'uchwyt do zakresu komórek "B2:D9" w pierwszym arkuszu
    oRng1 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("B2:D9")
    'uchwyt do zakresu komórek "B2:D9" w drugim arkuszu
    oRng2 = ThisComponent.getSheets().getByIndex(1).getCellRangeByName("B2:D9")
    'kopiowanie
    oRng2.setDataArray( oRng1.getDataArray() )
End Sub



Porównanie metod getData() i getDataArray()

Należy zauważyć, że:

  • getDataArray() tworzy tablicę zmiennych typu Variant, czyli przekaże również dane tekstowe
  • getData() tworzy tablicę zmiennych typu Double, czyli przekaże tylko dane liczbowe
Sub Zakresy6()
    Dim oSht as Object, oRng as Object
    Dim A(), B(), C()
    Dim k as Long
    oSht = ThisComponent.getSheets.getByIndex(0) 'uchwyt do pierwszego arkusza
    ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
    oSht.getColumns().insertByIndex(0, 1) 'dodajemy jedną kolumnę na pozycję pierwszą
    oSht.getCellRangebyName("A1").Value = 1
    oSht.getCellRangebyName("A2").Value = True '-1
    oSht.getCellRangebyName("A3").Value = DateSerial(2000, 1, 1) '36526
    oSht.getCellRangebyName("A4").String = "abcd" '0
    oRng = oSht.getCellRangeByName("A1:A4")
    A = oRng.getDataArray()
    B = oRng.getData()
    C = Array( Array( 1 ), Array( True ), Array( DateSerial(2000, 1, 1) ), Array( "abcd" ) ) 'tworzymy tablicę tablic
    MsgBox "A = [  " & A(0)(0) & " |   " & A(1)(0) & "    |     " & A(2)(0) & "      | " & A(3)(0) & " ]" & Chr(10) & _
           "B = [  " & B(0)(0) & " |   " & B(1)(0) & "    |     " & B(2)(0) & "      | " & B(3)(0) & " ]" & Chr(10) & _
           "C = [  " & C(0)(0) & " | " & C(1)(0) & " | " & C(2)(0) & " | " & C(3)(0) & " ]"
End Sub



Polecane strony internetowe

Apache OpenOffice – interface XCellRangeData





LibreOffice Calc – makra                   Strona główna