Makro wpisujące formułę do odpowiedniej komórki.

Użytkowanie arkusza kalkulacyjnego
SeurinD3
Posty: 11
Rejestracja: wt maja 30, 2017 7:06 am

Makro wpisujące formułę do odpowiedniej komórki.

Post autor: SeurinD3 »

Witam Serdecznie

Z góry chciałbym podziękować wszystkim za pomoc.

Chciałbym się dowiedzieć jak wprowadzić formułę =ZŁĄCZ.TEKSTY(A2;"-";I2;"-";D2;"-";B2;"-" ;H2) do podanego przeze mnie poniżej makro. Chciałbym aby wartości pobierane były z Arkusz1, a wynik wprowadzany był w arkuszu gotowy_doc w komórce od K2. Na chwilę obecną poniższe makro podpięte mam pod przycisk i po kliknięciu dane wprowadzane są w kolejne wiersze od A:J.

Sub Nowe_Makro_kopiujace_dane

Dim oSheets : oSheets = ThisComponent.Sheets
Dim oSheet1 : oSheet1 = oSheets.getByName("Arkusz1")
Dim oSheet2 : oSheet2 = oSheets.getByName("gotowy_doc")
Dim oSheet3 : oSheet3 = oSheets.getByName("skopiowana_baza")
Dim oCell
Dim s As String
Dim jot As Long
Dim i As Long

oCell = oSheet3.getCellByPosition(3,2)
i = oCell.getString
for jot=0 to 9
oCell = oSheet1.getCellByPosition(jot,1)
s = oCell.getString

oCell = oSheet2.getCellByPosition(jot,1+i)
oCell.setString(s)

Next jot
i = i+1
oCell = oSheet3.getCellByPosition(3,2)
oCell.setString(i)
End Sub

Prosiłbym o pomoc i radę.

Pozdrawiam
OpenOffice 4.1.3 // Windows 7
Awatar użytkownika
Jermor
Posty: 2258
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: Jermor »

Aby wstawić formulę używasz konstrukcji:

Kod: Zaznacz cały

oCell.setFormula("=FUNCTION()")
myślę, że należałoby zastosować angielską nazwę funkcji ZŁĄCZ.TEKSTY czyli CONCATENATE
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: Jan_J »

Chciałbym się dowiedzieć jak wprowadzić formułę =ZŁĄCZ.TEKSTY(A2;"-";I2;"-";D2;"-";B2;"-" ;H2) do podanego przeze mnie poniżej makro. Chciałbym aby wartości pobierane były z Arkusz1, a wynik wprowadzany był w arkuszu gotowy_doc w komórce od K2.
Moim zdaniem chodzi o to, by makro przygotowywało wynik, zamiast żeby robiła to formuła. No bo pisanie formuły makrem to metaprogramowanie, program generujący program. Mimi że czasem się przydaje, to jednak rzadziej, niż użycie makr do przetwarzania zawartości.

Do łączenia tekstów służy w Basicu operator &. Wobec tego instrukcja postaci
cell0.setString(cell1.getString() & "-" & cell2.getString() & "-" & cell3.getString())
powinna dać radę, po odpowiednim ustawieniu zmiennych cell0, cell1, itd. Albo bez pamiętania zmiennych, tylko poprzez odwołania do odpowiednich obiektów, np. metodą getCellByPosition.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
SeurinD3
Posty: 11
Rejestracja: wt maja 30, 2017 7:06 am

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: SeurinD3 »

Dziękuję za odpowiedź. Na pewno sprawdzę podesłane rozwiązanie i dam znać czy wszystko działa.
OpenOffice 4.1.3 // Windows 7
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: belstar »

Jeżeli to co wywnioskował Jermor z twojego pytania jest właściwe, to jego podpowiedź jest jak najbardziej prawidłowa. Musisz użyć angielskiej nazwy funkcji.
Można też użyć polskiego odpowiednika z tym że w tym przypadku musisz użyć właściwości

Kod: Zaznacz cały

oCell.FormulaLocal "=FUNCTION()"
Polecam jednak trzymać się standardu i użyć angielskiego odpowiednika.

Musisz też pamiętać o właściwym sformułowaniu ciągu reprezentującym tą formułę z uwagi na cudzysłowy, ponieważ w basicu te znaki reprezentują początek i koniec stringu. Więc konstrukcja:

Kod: Zaznacz cały

oCell.FormulaLocal = "ZŁĄCZ.TEKSTY(A2;"-";I2;"-";D2;"-";B2;"-" ;H2)"
po prostu nie zadziała i basić zgłosi błąd. Trzeba wykorzystać dodatkowe znaki cudzysłowów otaczając te które mają być w formule a poszczególne części formuły łączyć znakami konkatenacji o których wspomniał JanJ.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
SeurinD3
Posty: 11
Rejestracja: wt maja 30, 2017 7:06 am

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: SeurinD3 »

Super. Dziękuję za wyjaśnienie bardzo mi to pomogło.
OpenOffice 4.1.3 // Windows 7
SeurinD3
Posty: 11
Rejestracja: wt maja 30, 2017 7:06 am

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: SeurinD3 »

Mam jeszcze jedno pytanie dotyczące poniższej części kodu (na chwile obecną nie działa ale może przekaże moją myśl):

oCell = oSheet2.getCellByPosition(11,1+i)
oCell.setFormula "=CONVERTSTRINGTOCODE128(10,1+i)"

czyli w komórce (11,1+1) chciałbym wprowadzać wynik funkcji =CONVERTSTRINGTOCODE128(10,1+i) , która by się odwoływała do komórek (10,i+1) i kolejnych
OpenOffice 4.1.3 // Windows 7
SeurinD3
Posty: 11
Rejestracja: wt maja 30, 2017 7:06 am

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: SeurinD3 »

Już wszystko działa prawidłowa formuła wygląda tak :

oCell = oSheet2.getCellByPosition(11,i)
oCell.setFormula "=CONVERTSTRINGTOCODE128(K"+i+")"

Mam tylko ostatnie pytanie jak sprawdzić aby formuła wpisywana była z dużych liter bo na chwile obecna wpisuje z małych.
OpenOffice 4.1.3 // Windows 7
SeurinD3
Posty: 11
Rejestracja: wt maja 30, 2017 7:06 am

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: SeurinD3 »

Ok ten problem tez udało mi eis rozwiązać, pod spodem podsyłam rozwiązanie może komuś się przyda.

duze_liczby = "=CONVERTSTRINGTOCODE128(K"+i+")"
oSheet2.getCellByposition(11,i-1).Formulalocal = duze_liczby

Dziękuję wszystkim za pomoc i za cenne rady. Pozdrawiam
OpenOffice 4.1.3 // Windows 7
Awatar użytkownika
Jermor
Posty: 2258
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: Jermor »

Użycie "oCell.FormulaLocal =...", o jakiej napisał @belstar, może być o tyle ryzykowne, że uruchomienie arkusza w innej lokalizacji językowej może skończyć się niepowodzeniem. W tej odmiennej lokalizacji składnia funkcji nie zostanie rozpoznana.
Dla tych, którzy nie wiedzą. Arkusz kalkulacyjny będzie realizowany w każdej lokalizacji, gdyż wbudowane funkcje obliczeniowe w nim zastosowane są "pamiętane" w postaci kodu funkcji a nie ich stosowanych nazw. Dlatego arkusz przygotowany w np. Niemczech, gdzie użyto niemieckich nazw funkcji, będzie funkcjonował w Polsce i pokazywał nazwy polskie.
Inaczej jest w przypadku wstawiania ciągu z nazwą funkcji. Ten ciąg nie zmieni się na inny tylko dlatego, że zmieniono lokalizację. Będzie zawsze taki sam i po wpisaniu do komórki może wygenerować błąd #NAZWA? sygnalizując, że nazwa funkcji nie została rozpoznana.
Przytoczona w poście funkcja CONVERTSTRINGTOCODE128 nie należy do funkcji wbudowanych, czyli tych włączonych do aplikacji w czasie jej instalacji. Jest to funkcja "zewnętrzna" napisana przez kogoś i udostępniona płatnie lub bezpłatnie do wykorzystania we własnych rozwiązaniach (zobacz np. http://freebarcodefonts.dobsonsw.com). Funkcja ta nie ma zatem swojej "lokalnej" nazwy. W tym sensie stosowanie "FormulaLocal" nie różni się niczym od "Formula".
W przypadku tego przykładu, gdyby arkusz miał zostać przeniesiony na inny komputer, należałoby zapewnić dostępność tej funkcji w nowym środowisku.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
SeurinD3
Posty: 11
Rejestracja: wt maja 30, 2017 7:06 am

Re: Makro wpisujące formułę do odpowiedniej komórki.

Post autor: SeurinD3 »

Dziękuję za wyjaśnienie. Będę o tym pamiętał.
OpenOffice 4.1.3 // Windows 7
ODPOWIEDZ