Czesc
To moj pierwszy post na forum i na wstepie chcialbym sie przywitac
Mam spory problem, gdyz po przesiadce na pakiet OpenOffice nie umiem poradzic sobie z konwersja makr pod OOB Calc :/
Nie mam zielonego pojecia jak to zrobic, poswiecilem mega duzo czasu, a efektow brak
Kod:
Sub Pobranie()
Application.ScreenUpdating = False
Sheets("Kalk").Select
nazwa = Range("a2").Value
x = 0
Sheets("Skory").Select
Range("a2").Select
Do While x <= 400
If ActiveCell.Value = nazwa Then
ActiveCell.Offset(0, 1).Value = ActiveCell.Offset(0, 1).Value - Range("j2").Value
ActiveCell.Offset(0, 3).Value = ActiveCell.Offset(0, 3).Value + (-Range("j2").Value + Range("m2").Value)
End If
ActiveCell.Offset(1, 0).Select
x = x + 1
Loop
Sheets("Kalk").Select
Range("i2").Value = 0
End Sub
Dzieki za wszelka pomoc
Problem z kodem VBA pod Open Office Basic
-
- Posty: 1
- Rejestracja: czw maja 05, 2016 12:41 pm
Problem z kodem VBA pod Open Office Basic
Apache OpenOffice 4.1.2
Libre Office 5
Windows Mac OS X
Libre Office 5
Windows Mac OS X
Re: Problem z kodem VBA pod Open Office Basic
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: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
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
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
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)