Problem z kodem VBA pod Open Office Basic

Nie wiesz, gdzie umieścić swój post? Pisz tutaj!
thefosterka
Posty: 1
Rejestracja: czw maja 05, 2016 12:41 pm

Problem z kodem VBA pod Open Office Basic

Post autor: thefosterka »

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 :crazy:
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 :D
Apache OpenOffice 4.1.2
Libre Office 5
Windows Mac OS X
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Problem z kodem VBA pod Open Office Basic

Post autor: Jan_J »

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
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ