Różnica pomiędzy stronami "Funkcje liczbowe" i "Zakresy komórek – metody getData i getDataArray"
Linia 1: | Linia 1: | ||
− | <div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;"> | + | <div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">02.08.2020</div> |
− | |||
− | |||
− | + | == 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:<br/> |
+ | oRngData(0)(1) oznacza pierwszą tablicę w tablicy tablic oRngData i drugi element w tej pierwszej tablicy<br/> | ||
+ | oRngData(0)(2) oznacza pierwszą tablicę w tablicy tablic oRngData i trzeci element w tej pierwszej tablicy itd.<br/> | ||
+ | W przedstawionym niżej przykładzie operujemy na danych liczbowych – dalsze przykłady pokażą dlaczego i jakie ma to znaczenie. | ||
− | + | <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;'>"A1:A100000"</span>) <span style='color:#707070;'>'uchwyt do zakresu komórek</span> | ||
+ | oRngB <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"B1:B100000"</span>) <span style='color:#707070;'>'uchwyt do zakresu komórek</span> | ||
+ | oRngC <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"C1:C100000"</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;'>"Czas: d1="</span> <span style='color:#000080;'>&</span> d1 <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" d2="</span> <span style='color:#000080;'>&</span> d2 <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" d3="</span> <span style='color:#000080;'>&</span> d3 | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | == 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. | |
− | |||
− | |||
− | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b> | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>ZakresyGetData2() |
− | + | <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;'>"A1:A5"</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;'>"abcd"</span> | ||
+ | <span style='color:#707070;'>'oRngData(3)(0) <span style='color:#000080;'>=</span> IsNumeric("abcd") '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> | ||
− | |||
+ | == 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. | |
− | + | <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;'>"A1:E1"</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;'>"abcd"</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;'>"128"</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;'>Sub </span></b> | + | |
− | + | ||
− | <b><span style='color:#1f1c1b;'>Dim</span></b> | + | |
− | + | == Przykłady == | |
− | + | ||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>ZakresyGetData4() | |
− | + | <span style='color:#707070;'>'pobieranie danych z zakresu komórek do tablicy i wpisywanie danych z tablicy do zakresu komórek</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> 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> | |
− | + | <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> | + | 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;'>"B2:D9"</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</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 "B2:D9"</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 "B2:D9"</span> | |
− | + | oRngData(r)(c) <span style='color:#000080;'>=</span> c <span style='color:#000080;'>&</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 "B2:D9" w pierwszym arkuszu</span> | ||
+ | oRng1 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>0</span>).getCellRangeByName(<span style='color:#ff0000;'>"B2:D9"</span>) | ||
+ | <span style='color:#707070;'>'uchwyt do zakresu komórek "B2:D9" w drugim arkuszu</span> | ||
+ | oRng2 <span style='color:#000080;'>=</span> ThisComponent.getSheets().getByIndex(<span style='color:#ff0000;'>1</span>).getCellRangeByName(<span style='color:#ff0000;'>"B2:D9"</span>) | ||
+ | <span style='color:#707070;'>'kopiowanie</span> | ||
+ | oRng2.setDataArray( oRng1.getDataArray() ) | ||
+ | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | == 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 | ||
− | <span style="color: green"><b><span style='color:#1f1c1b;'> | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Zakresy6() |
− | + | <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> | + | <b><span style='color:#1f1c1b;'>Dim</span></b> A(), B(), C() |
− | + | <b><span style='color:#1f1c1b;'>Dim</span></b> k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | |
− | + | oSht <span style='color:#000080;'>=</span> ThisComponent.getSheets.getByIndex(<span style='color:#ff0000;'>0</span>) <span style='color:#707070;'>'uchwyt do pierwszego arkusza</span> | |
− | + | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'aktywacja pierwszego arkusza</span> | |
− | + | 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> | |
− | + | oSht.getCellRangebyName(<span style='color:#ff0000;'>"A1"</span>).Value <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span> | |
− | + | oSht.getCellRangebyName(<span style='color:#ff0000;'>"A2"</span>).Value <span style='color:#000080;'>=</span> True <span style='color:#707070;'>'-1</span> | |
− | + | oSht.getCellRangebyName(<span style='color:#ff0000;'>"A3"</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> | |
− | + | oSht.getCellRangebyName(<span style='color:#ff0000;'>"A4"</span>).<span style='color:#000080;'>String</span> <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>"abcd"</span> <span style='color:#707070;'>'0</span> | |
− | + | oRng <span style='color:#000080;'>=</span> oSht.getCellRangeByName(<span style='color:#ff0000;'>"A1:A4"</span>) | |
− | + | A <span style='color:#000080;'>=</span> oRng.getDataArray() | |
− | + | B <span style='color:#000080;'>=</span> oRng.getData() | |
− | + | 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;'>"abcd"</span> ) ) <span style='color:#707070;'>'tworzymy tablicę tablic</span> | |
− | + | MsgBox <span style='color:#ff0000;'>"A <span style='color:#000080;'>=</span> [ "</span> <span style='color:#000080;'>&</span> A(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> A(<span style='color:#ff0000;'>1</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> A(<span style='color:#ff0000;'>2</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> A(<span style='color:#ff0000;'>3</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" ]"</span> <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> _ | |
− | + | <span style='color:#ff0000;'>"B <span style='color:#000080;'>=</span> [ "</span> <span style='color:#000080;'>&</span> B(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> B(<span style='color:#ff0000;'>1</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> B(<span style='color:#ff0000;'>2</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> B(<span style='color:#ff0000;'>3</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" ]"</span> <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> _ | |
− | + | <span style='color:#ff0000;'>"C <span style='color:#000080;'>=</span> [ "</span> <span style='color:#000080;'>&</span> C(<span style='color:#ff0000;'>0</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> C(<span style='color:#ff0000;'>1</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> C(<span style='color:#ff0000;'>2</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" | "</span> <span style='color:#000080;'>&</span> C(<span style='color:#ff0000;'>3</span>)(<span style='color:#ff0000;'>0</span>) <span style='color:#000080;'>&</span> <span style='color:#ff0000;'>" ]"</span> | |
− | + | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | |
− | |||
− | <b><span style='color:#1f1c1b;'>End | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | == Polecane strony internetowe == | |
− | + | ||
− | + | [https://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangeData.html Apache OpenOffice – interface XCellRangeData] | |
− | |||
Wersja z 19:08, 21 paź 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