Zakresy komórek – metody getData i getDataArray: Różnice pomiędzy wersjami

Z Henryk Dąbrowski
Skocz do: nawigacja, szukaj
(Utworzono nową stronę "<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 da...")
 
(Brak różnic)

Aktualna wersja na dzień 14:11, 2 sie 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



Polecane strony internetowe

Apache OpenOffice – interface XCellRangeData





LibreOffice Calc – makra                   Strona główna