VBA dla Excela skłania do pisania programów działających niejako “w zastępstwie” ręcznych operacji. Skutkuje to śmiesznym, nieporadnym kodem, w którym np. zamiast liczników, współrzędnych i wartowników reprezentowanych przez zmienne programistyczne stosowane są wizualne obiekty arkusza. To kosztuje i trwa.
Rzecz jasna, da się w tym języku pisać także “porządnie”, jednak wymaga to kwalifikacji głębszych, niż uczenie się z nagrywanych makr.
Interfejs programistyczny Calca jest zbudowany inaczej niże Excela. Obiekt ze strukturą danych skoroszytu jest tu czymś innym, niż obiekt okna, w którym da się tym skoroszytem manipulować. Wobec tego takie pojęcia, jak “Selection”, “ActiveCell” nie mają racji bytu w skoroszycie, a inne (jak “Range”) wymagają dookreślenia, do jakiego świata/obiektu przynależą. Takie “domyślne” konteksty byłyby trudne do utrzymania m.in. dlatego, że API jest wspólne dla wielu języków znacznie różniących się składnią.
Na pociechę powiem, że przesuwanie wizualnego kursora (ActiveCell.Offset(1,0).Select) w Twojej funkcji jest niepotrzebną manierą. Skoro prowadzisz numerację przebiegów pętli (x), masz dostęp do x-tego wiersza arkusza, i to powinno wystarczyć.
Bez wzięcia odpowiedzialności za sens przeliczeń, powinno to wyglądać +/- tak:
Kod: Zaznacz cały
Sub Pobranie()
doc = thisComponent
kalk = doc.Sheets.getByName("Kalk")
skory = doc.Sheets.getByName("Skory")
nazwa = kalk.getCellByPosition(0,1).getString() ' "a2"
x0 = 1
x = x0 ' od drugiego wiersza
wysokosc = 400
zakres = skory.getCellRangeByPosition(0,1,3,1+wysokosc) ' "a2:d401"
j2 = skory.getCellByPosition(9,1).getValue() ' "j2"
m2 = skory.getCellByPosition(12,1).getValue() ' "m2"
Do While x < wysokosc+x0
If zakres.getCellByPosition(0,x).getString() = nazwa Then
kom = zakres.getCellByPosition(1,x) ' z 2. kolumny zakresu
kom.setValue(kom.getValue - j2)
kom = zakres.getCellByPosition(3,x) ' z 4. kolumny zakresu
kom.setValue(kom.getValue + m2-j2)
End If
x = x + 1
Loop
kalk.getCellByPosition(8,1).setValue(0) ' "i2"
End Sub
Porządnie napisany kod z Excela powinien wyglądać podobnie, choć używa całkiem innego modelu dokumentu.
W sprawie dokumentacji i przykładów patrz
https://wiki.openoffice.org/wiki/Docume ... ASIC_Guide
http://api.libreoffice.org/
http://www.pitonyak.org/oo.php
http://www.pitonyak.org/OOME_3_0.pdf