Discussion:
[Calc] Kopiowanie funkcji za pomocą makra
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Krzys59
2008-02-26 18:23:54 UTC
Permalink
Witam
Czy ktoś ma pomysł jak rozwiązać taki problem:
W komórce C1 jest funkcja =A1+B1
przez proste przeciąganie komórki C1 niżej lub przez Ctrl+C Ctrl+V mogę
wstawić tę funkcję w następną komórkę C2 i wtedy zmieni się funkcja na
=A2+B2, itd w dół.
Ale ja chciałbym to zrobić za pomocą makra, pobrać funkcję z jednej komórki
i wkleić następnie w następną i następną z równoczesnym "przeadresowaniem"
funkcji. Zupełnie nie mam na to pomysłu. Próbowałem funkcji wstawiającej
ciąg znaków, typu CosTam="=A1+b1" ale w efekcie dostaję tylko ten tekst,
nie zaś działającą funkcję.
Pozdrawiam
Krzysiek
m***@wp.pl
2008-02-26 20:43:28 UTC
Permalink
Post by Krzys59
Witam
W komórce C1 jest funkcja =A1+B1
przez proste przeciąganie komórki C1 niżej lub przez Ctrl+C Ctrl+V mogę
wstawić tę funkcję w następną komórkę C2 i wtedy zmieni się funkcja na
=A2+B2, itd w dół.
Ale ja chciałbym to zrobić za pomocą makra, pobrać funkcję z jednej komórki
i wkleić następnie w następną i następną z równoczesnym "przeadresowaniem"
funkcji. Zupełnie nie mam na to pomysłu. Próbowałem funkcji wstawiającej
ciąg znaków, typu CosTam="=A1+b1" ale w efekcie dostaję tylko ten tekst,
nie zaś działającą funkcję.
Pozdrawiam
Krzysiek
Witaj

Ponizej masz nieco rozwiniety sposob ale to po to abys wiedzial o co
chodzi..

Sub Kopiowanie2

oSheet1 = ThisComponent.Sheets.getByName("Arkusz1") ' ark.nr1 (tu
wkopiowujemy)
' oSheet1 = ThisComponent.Sheets.getByIndex(0) ' drugi sposób na
wyróżnienie ark1
oSheet2 = ThisComponent.Sheets.getByName("Arkusz1") ' ark.nr2 (stad
pobieramy dane)
' oSheet2 = ThisComponent.Sheets.getByIndex(1) ' drugi sposób na
wyróżnienie ark2

oObszarZrodlowy = oSheet2.getCellRangeByName("C1").RangeAddress '
copy range

for z=1 to 20 'zmienna pozycji wklejania

WspolzedneWklejenia = oSheet1.getCellByPosition(2,Z).CellAddress
'ustalenie pozycji komorki wyznaczajacej miejsce docelowe wklejenia

oSheet1.CopyRange(WspolzedneWklejenia,
oObszarZrodlowy)
'ostateczne kopiowanie...
next

End Sub

Pozdrawiam
Kerim
Krzys59
2008-02-27 18:55:13 UTC
Permalink
Post by m***@wp.pl
Ponizej masz nieco rozwiniety sposob ale to po to abys wiedzial o co
chodzi..
Witaj
Dzięki za podpowiedź jak rozwiązać problem copy-paste, ale nie do końca mi o
to chodzi. Tak też można rozwiązać ale ...
Mój problem polega na tym, że umyśliłem sobie że będę naprawiał arkusz z
różnymi funkcjami podmieniając zawartość wybranych komórek za pomocą makra.
I problem w tym, że chciałbym aby treść formuły, tej która ma wylądować w
komórce, była zaszyta w treści makra. To, co podpowiadasz oczywiście działa
ale treść formuły jest pobierana z innej komórki. Tak można to rozwiązać,
oczywiście, ale ja bym chciał się dowiedzieć czy jest jakiś sposób na
zaszycie treści formuły w treści makra. Tak jak pisałem w pierwszym poście,
proste wstawienie jako wynik funkcji czy makra, tekstu z formułą nie
działa.
Krzysiek
Krzys59
2008-02-27 18:59:19 UTC
Permalink
Przepraszam, ale jak popatrzyłem na swoją pierwszą wiadomość to widzę że
zupełnie źle przedstawiłem problem który chcę rozwiązać, mam nadzieję że
teraz to wygląda bardziej zrozumiale.
Post by Krzys59
Post by m***@wp.pl
Ponizej masz nieco rozwiniety sposob ale to po to abys wiedzial o co
chodzi..
Witaj
Dzięki za podpowiedź jak rozwiązać problem copy-paste, ale nie do końca mi
o to chodzi. Tak też można rozwiązać ale ...
Mój problem polega na tym, że umyśliłem sobie że będę naprawiał arkusz z
różnymi funkcjami podmieniając zawartość wybranych komórek za pomocą
makra. I problem w tym, że chciałbym aby treść formuły, tej która ma
wylądować w komórce, była zaszyta w treści makra. To, co podpowiadasz
oczywiście działa ale treść formuły jest pobierana z innej komórki. Tak
można to rozwiązać, oczywiście, ale ja bym chciał się dowiedzieć czy jest
jakiś sposób na zaszycie treści formuły w treści makra. Tak jak pisałem w
pierwszym poście, proste wstawienie jako wynik funkcji czy makra, tekstu z
formułą nie działa.
Krzysiek
Krzys59
2008-02-27 19:16:34 UTC
Permalink
Ja wymyśliłem trochę inny sposób na kopiowanie i wklejanie w kolejnych
komórkach. Najpierw zarejestrowałem makro copy-paste a potem je nieco
zmodyfikowałem. Makra rejestrowane używają UNO, ponieważ nie mogłem zrobić
pętli na tak zarejestrowanym fragmencie kodu (nie pozwalają na to
argumenty) a z drugiej strony trudno kilkanaście razy wpisywać ten sam kod
jak się chce wklejać w kolejnych komórkach, to zmodyfikowałem tak, że część
kod wykonuje się w Sub a część w Function, a funkcję wywołuję z pętli, więc
nie mam wtedy problemu z powtarzaniem argumentów.
Zakres kopiowany i wisywany można dość prosto modyfikować przez dodanie
argumentu i linii z uno:GoDown
A tak swoją drogą, to czy ktoś zna jakiś adres sieciowy gdzie można poczytać
o UNO i nauczyć się podstaw, bo to co jest na stronie dev openoffice jest
dla mnie kompletnie niezrozumiałe, i to nawet nie chodzi o angielski, ale o
sposób przekazania informacji, strasznie techniczny, a ja jestem raczej
samouk. Może ktoś zna miejsce z jakimś tutorialem, albo czymś takim do UNO?


sub wywolaj
'to makro ustawia aktywną komórkę w bieżącym arkuszu, w tym wypadku D1
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$d$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

for j = 0 to 5
Costam(j)
next j
end sub


'funkcja poniżej ustawia aktywną komórkę na Aj gdzie j jest parametrem
funkcji (liczba całkowita) i wstawia wartość pobraną wcześniej w makrze
wywolaj, każdy kolejny przebieg pętli wywołuje kolejne komórki Aj i wkleja
pobraną treść

function Costam(j)

dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"

args1(0).Value = "$a$" & j+1 <---tu jest zmieniający się adres komórki do
wklejania

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
end function
Krzys59
2008-02-27 19:18:10 UTC
Permalink
Ja wymyśliłem trochę inny sposób na kopiowanie i wklejanie w kolejnych
komórkach. Najpierw zarejestrowałem makro copy-paste a potem je nieco
zmodyfikowałem. Makra rejestrowane używają UNO, ponieważ nie mogłem zrobić
pętli na tak zarejestrowanym fragmencie kodu (nie pozwalają na to
argumenty) a z drugiej strony trudno kilkanaście razy wpisywać ten sam kod
jak się chce wklejać w kolejnych komórkach, to zmodyfikowałem tak, że część
kod wykonuje się w Sub a część w Function, a funkcję wywołuję z pętli, więc
nie mam wtedy problemu z powtarzaniem argumentów.
Zakres kopiowany i wisywany można dość prosto modyfikować przez dodanie
argumentu i linii z uno:GoDown
A tak swoją drogą, to czy ktoś zna jakiś adres sieciowy gdzie można poczytać
o UNO i nauczyć się podstaw, bo to co jest na stronie dev openoffice jest
dla mnie kompletnie niezrozumiałe, i to nawet nie chodzi o angielski, ale o
sposób przekazania informacji, strasznie techniczny, a ja jestem raczej
samouk. Może ktoś zna miejsce z jakimś tutorialem, albo czymś takim do UNO?


sub wywolaj
'to makro ustawia aktywną komórkę w bieżącym arkuszu, w tym wypadku D1
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$d$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

'tu jest pętla wywołująca funkcję CosTam(j) z parametrem któ?y określa ilość
komórek do zapisania treścią pobraną powyżej
for j = 0 to 5
Costam(j)
next j
end sub


'funkcja poniżej ustawia aktywną komórkę na Aj gdzie j jest parametrem
funkcji (liczba całkowita) i wstawia wartość pobraną wcześniej w makrze
wywolaj, każdy kolejny przebieg pętli wywołuje kolejne komórki Aj i wkleja
pobraną treść

function Costam(j)

dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"

args1(0).Value = "$a$" & j+1 <---tu jest zmieniający się adres komórki do
wklejania

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
end function
m***@wp.pl
2008-02-27 19:44:43 UTC
Permalink
Post by Krzys59
Ja wymyśliłem trochę inny sposób na kopiowanie i wklejanie w kolejnych
komórkach. Najpierw zarejestrowałem makro copy-paste a potem je nieco
zmodyfikowałem. Makra rejestrowane używają UNO, ponieważ nie mogłem zrobić
pętli na tak zarejestrowanym fragmencie kodu (nie pozwalają na to
argumenty) a z drugiej strony trudno kilkanaście razy wpisywać ten sam kod
jak się chce wklejać w kolejnych komórkach, to zmodyfikowałem tak, że część
kod wykonuje się w Sub a część w Function, a funkcję wywołuję z pętli, więc
nie mam wtedy problemu z powtarzaniem argumentów.
Zakres kopiowany i wisywany można dość prosto modyfikować przez dodanie
argumentu i linii z uno:GoDown
A tak swoją drogą, to czy ktoś zna jakiś adres sieciowy gdzie można poczytać
o UNO i nauczyć się podstaw, bo to co jest na stronie dev openoffice jest
dla mnie kompletnie niezrozumiałe, i to nawet nie chodzi o angielski, ale o
sposób przekazania informacji, strasznie techniczny, a ja jestem raczej
samouk. Może ktoś zna miejsce z jakimś tutorialem, albo czymś takim do UNO?
sub wywolaj
'to makro ustawia aktywną komórkę w bieżącym arkuszu, w tym wypadku D1
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$d$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
'tu jest pętla wywołująca funkcję CosTam(j) z parametrem któ?y określa ilość
komórek do zapisania treścią pobraną powyżej
for j = 0 to 5
Costam(j)
next j
end sub
'funkcja poniżej ustawia aktywną komórkę na Aj gdzie j jest parametrem
funkcji (liczba całkowita) i wstawia wartość pobraną wcześniej w makrze
wywolaj, każdy kolejny przebieg pętli wywołuje kolejne komórki Aj i wkleja
pobraną treść
function Costam(j)
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$a$" & j+1  <---tu jest zmieniający się adres komórki do
wklejania
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
end function
Hmmmmmmmmmmmmmmm

Przeciez to co wymysliles to robi to samo co ja Ci napisalem!!! czyli
pobiera funkcje z D1 i wstawia w komorki kolumny A ze zmiana odwolania
czyli robi copy-paste

Moja propozycja robi dokladnie to samo czyli kopiuje z C1 i wstawia w
kolejne wiersze kolumny C i zaden problem przerobic to aby wstawic to
w kolumne A

A Ty sie nakombinowales jak kon pod gorke;)

I caly czas piszesz dokladnie o takim rozwiazaniu. Gdzies tam sie
przewija sformuowanie aby funkcje nie kopiowac a zapisac na stale w
makrze... hmmm.. pewnie jakos dalo by sie zrobic tak ale o wiele
prosciej jest tak jak juz napisalem wyzej
Mozna by zapisac w makrze np zmienna="=B"+x+"+C"+y i umiescic w petli
for x i for y. Pytanie tylko po co? jak idzie to zrobic prosciej gdzyz
zawsze mozna znalesc w arkuszu wolna komorke do ktorej mozna wpisac
funkcje do skopiowania

Pozdrawiam
Kerim
Krzys59
2008-02-27 20:06:27 UTC
Permalink
Post by m***@wp.pl
Hmmmmmmmmmmmmmmm
Przeciez to co wymysliles to robi to samo co ja Ci napisalem!!! czyli
pobiera funkcje z D1 i wstawia w komorki kolumny A ze zmiana odwolania
czyli robi copy-paste
Ależ oczywiście że tak, masz rację, ja tylko chciałem pokazać że inaczej też
można, ale w żadnym wypadku nie mówię że to lepsze, po prostu tak mi się
udało zrobić :-)
Pozdrawiam
m***@wp.pl
2008-02-27 20:18:08 UTC
Permalink
Post by Krzys59
Post by m***@wp.pl
Hmmmmmmmmmmmmmmm
Przeciez to co wymysliles to robi to samo co ja Ci napisalem!!! czyli
pobiera funkcje z D1 i wstawia w komorki kolumny A ze zmiana odwolania
czyli robi copy-paste
Ależ oczywiście że tak, masz rację, ja tylko chciałem pokazać że inaczej też
można, ale w żadnym wypadku nie mówię że to lepsze, po prostu tak mi się
udało zrobić :-)
Pozdrawiam
Do TOMKA

getFormula i setFormula wstawiaja bez przeadresowania dlatego tez
napisalem o koniecznosci wstawienia zmiennej w petli for, ktora bedzie
zmieniac adresy. Dlatego tez uwazam, ze pierwotna moja propozycja jest
bardziej optymalna.

Nawiasem mowiac petle bardzo zwalniaja wykonywanie sie makra.

Pozdro
Kerim
Tomek
2008-02-27 20:32:07 UTC
Permalink
Post by m***@wp.pl
Post by Krzys59
Post by m***@wp.pl
Hmmmmmmmmmmmmmmm
Przeciez to co wymysliles to robi to samo co ja Ci napisalem!!! czyli
pobiera funkcje z D1 i wstawia w komorki kolumny A ze zmiana odwolania
czyli robi copy-paste
Ależ oczywiście że tak, masz rację, ja tylko chciałem pokazać że inaczej też
można, ale w żadnym wypadku nie mówię że to lepsze, po prostu tak mi się
udało zrobić :-)
Pozdrawiam
Do TOMKA
getFormula i setFormula wstawiaja bez przeadresowania dlatego tez
napisalem o koniecznosci wstawienia zmiennej w petli for, ktora bedzie
zmieniac adresy. Dlatego tez uwazam, ze pierwotna moja propozycja jest
bardziej optymalna.
Nawiasem mowiac petle bardzo zwalniaja wykonywanie sie makra.
Pozdro
Kerim
Podałem tylko info że można samemu sobie formułki wstawiać, w
odróżnieniu od kopiowania zawartości formuł już istniejących
Tomek
Krzys59
2008-02-27 21:03:25 UTC
Permalink
Post by m***@wp.pl
getFormula i setFormula wstawiaja bez przeadresowania dlatego tez
napisalem o koniecznosci wstawienia zmiennej w petli for, ktora bedzie
zmieniac adresy. Dlatego tez uwazam, ze pierwotna moja propozycja jest
bardziej optymalna.
OK, ale można zmodyfikować tak tekst formuły żeby składała się z kilku
bloków (np. "=A" & i & "+b" & i ) w które można wpleść zmienną dostosowując
formułę do wpisywanej komórki i też powinno działać. Przynajmniej tak mi
się wydaje.
Krzysiek

Tomek
2008-02-27 19:47:44 UTC
Permalink
Post by Krzys59
Ja wymyśliłem trochę inny sposób na kopiowanie i wklejanie w kolejnych
komórkach. Najpierw zarejestrowałem makro copy-paste a potem je nieco
zmodyfikowałem. Makra rejestrowane używają UNO, ponieważ nie mogłem zrobić
pętli na tak zarejestrowanym fragmencie kodu (nie pozwalają na to
argumenty) a z drugiej strony trudno kilkanaście razy wpisywać ten sam kod
jak się chce wklejać w kolejnych komórkach, to zmodyfikowałem tak, że część
kod wykonuje się w Sub a część w Function, a funkcję wywołuję z pętli, więc
nie mam wtedy problemu z powtarzaniem argumentów.
Zakres kopiowany i wisywany można dość prosto modyfikować przez dodanie
argumentu i linii z uno:GoDown
A tak swoją drogą, to czy ktoś zna jakiś adres sieciowy gdzie można poczytać
o UNO i nauczyć się podstaw, bo to co jest na stronie dev openoffice jest
dla mnie kompletnie niezrozumiałe, i to nawet nie chodzi o angielski, ale o
sposób przekazania informacji, strasznie techniczny, a ja jestem raczej
samouk. Może ktoś zna miejsce z jakimś tutorialem, albo czymś takim do UNO?
sub wywolaj
'to makro ustawia aktywną komórkę w bieżącym arkuszu, w tym wypadku D1
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$d$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
'tu jest pętla wywołująca funkcję CosTam(j) z parametrem któ?y określa ilość
komórek do zapisania treścią pobraną powyżej
for j = 0 to 5
Costam(j)
next j
end sub
'funkcja poniżej ustawia aktywną komórkę na Aj gdzie j jest parametrem
funkcji (liczba całkowita) i wstawia wartość pobraną wcześniej w makrze
wywolaj, każdy kolejny przebieg pętli wywołuje kolejne komórki Aj i wkleja
pobraną treść
function Costam(j)
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$a$" & j+1 <---tu jest zmieniający się adres komórki do
wklejania
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
end function
mek
Do ustawiania formuł można użyć xxx.setFormula("formułka") a odczytywać
getFormula.
Tomek
Krzys59
2008-02-27 20:19:07 UTC
Permalink
Post by Tomek
Do ustawiania formuł można użyć xxx.setFormula("formułka") a odczytywać
getFormula.
Tomek
Dzięki
To rozwiązuje mój problem, ale co się przy okazji nauczyłem to moje :-)
Szkoda że nie ma prostego zestawienia dostępnych funkcji w makrach, albo ja
słabo szukałem :-)
Krzysiek
Tomek
2008-02-27 20:27:24 UTC
Permalink
Post by Krzys59
To rozwiązuje mój problem, ale co się przy okazji nauczyłem to moje :-)
Szkoda że nie ma prostego zestawienia dostępnych funkcji w makrach, albo ja
słabo szukałem :-)
Krzysiek
Tego już Ci nikt nie zabierze ;)
Loading...