munkalapok közötti automatikus másolás makróval

Táblázatkezelő
nagytk
Hozzászólások: 6
Csatlakozott: 2019. január 20., vasárnap 22:53

munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: nagytk »

Sziasztok!

Kedves hozzáértők az alábbira keresek megoldást.
Szeretnék egy táblázat két munkalapja között automatikus átvitelt egy gomb segítségével.
Adott cellát a másik munkalap adott cellájába másolni, valamit hogy ezzel együtt ugorjon a másik munkalapra.
Valószínű elég egyszerű lenne a megoldás, de makróban nem vagyok képben.

Köszönettel: Krisz
Libreoffice 6.1.4.2.
Ubuntu 18.04.1
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

Ha folyamatosan a cella minden változásának meg kell jelennie a másik munkalapon is, akkor a másolás helyett a makró nélküli egyszerű HIVATKOZÁS jóval egyszerűbb megoldás:
Van egy érték a Munkalap1 "A1" cellájában. Ezt írd a másik munkalap megfelelő cellájába:

Kód: Egész kijelölése

=Munkalap1.A1
Így a másik munkalapon automatikusan frissülni fog azt érték, abban a pillanatban, amikor megváltoztatod azt az első munkalapon.
Természetesen ez a megoldás NEM viszi át az esetlegesen beállított, majd megváltoztatott FORMÁZÁSI tulajdonságokat. Sem a celláét, sem a tartalomét. Csakis az érték (szöveg, vagy szám), megy át.
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

Ha csak néha kell átmásolni az értéket, és a másolatnak FÜGGETLENNÉ kell válnia a forrás értéktől, akkor valóban a másolás (kézzel, vagy makróval történő végrehajtása) segíthet.

Erre vannak példák itt, ezen a fórumon és az angol fórumon is. Elsődleges segédletként én mégis Andrew Pitonyak ingyenes makró-könyveit ajánlom.
A makrót - a feladat bonyolultságától függően - létrehozhatod a makrórögzítővel, vagy neked kell megírnod azt a beépített StarBasic nyelven, de az API függvények használatával.
Ebben is Andrew Pitonyak könyvei fognak elsődleges segítséget adni neked.
A makró bonyolultsága (és létrehozási módja) attól is függhet, hogy a cella formázási tulajdonságait is kell másolnod, vagy hogy éppen azt NEM szeretnéd továbbvinni.

A Makrórögzítő használata közben a MENÜT kell használnod a Másolásra és a beillesztésre. Gyorsbillentyűkkel nem fog működni a dolog. A sima Beillesztés megkettőzi a formázási tulajdonságokat is, a "Beillesztés formázatlan szövegként" funkció viszont nem. Ezzel a megoldással egy "merev", fix forrás- és cél cella(tartomány) között másolni képes makrót tudsz létrehozni.
Ha másik cellatartományt is kell másolnod, akkor vagy még egyszer fel kell venned a makrót, vagy a makrokódról (más névvel) egy másolatot kell készítened, amiben kézzel kijavítod a forrás- és cél-cellatartomány hivatkozásait.

Az API (Application Programming Interface) függvényeivel jóval rugalmasabb módon lehet makrókat létrehozni, de azokat az kód első betűjétől az utolsóig neked kell megírni, és a függvények megismeréséhez jelentős mennyiségű idő, tanulás kell!!

(Ráadásul a Makrórögzítő nagyon korlátozott tudású: csak a legegyszerűbb makrókat képes létrehozni. Azt is jóval bonyolultabb, és lassabban futó generált kóddal teszi: a beépített Dispatcher-t használja, ami nagyjából azt jelenti ebből a szempontból, hogy a Calc minden egyes "lépés" után létrehozza, "kirajzolja" a változtatás eredményeként a NÉZETET is, az általad írt makró változásai viszont csak a makró lefutása után jelennek meg a képernyőn: ez jelentősen gyorsítja a futását).
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
nagytk
Hozzászólások: 6
Csatlakozott: 2019. január 20., vasárnap 22:53

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: nagytk »

Köszönöm az infókat bár nem tudtam kiokoskodni azt ami nekem kellene.
Egyik fórumon találtam ezt, (persze nem mentettem le rendesen és azóta sem találom a fórumokon) némi módosítás után így néz ki:

Option VBASupport 1
Sub Mentes()
a = Munka1.Cells(5, 5)
Munka2.Cells(4, 3) = a
End Sub

Próbálgatásra működött, de valamit eltoltam, töröltem mert most hibával megáll
Hiba történt a BASIC-program futtatása közben..
'423'
Cells

A lényeg ez lenne: gombnyomásra több cella tartalmat, karaktert, vagy értéket kellene átvinni a második munkalap meghatározott celláiba, és egy nyomtatási képet kellene feldobni a második munkalapról, az átvitt cella formátumot nem kell megtartani.

Libreoffice-t használok, keresgettem makro rögzítést, de szerintem nincs benne.
Libreoffice 6.1.4.2.
Ubuntu 18.04.1
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

Kód: Egész kijelölése

Option VBASupport 1
Sub Mentes()
a = Munka1.Cells(5, 5)
Munka2.Cells(4, 3) = a
End Sub
Ez egy MS Excel VBA makró. Azokkal csak az "Option VBAsupport 1" kompatibilitási kapcsoló hatására képes a LibreOffice együttműködni, de ez a kompatibilitás korántsem teljes körű!
(Az Apache OpenOffice meg még kevésbé kompatibilis az MS VBA makrókkal!!!)

Neked a StarBasic+API vagy a StarBasic+API+Dispatcher kombinációban kell megírni, vagy felvenni a makrót, hogy működőképes legyen. A VBA-t felejtsd el, ha a LibreOffice-szal hatékonyan akarsz dolgozni!

Természetesen VAN Makrórögzítő a LibreOffice-ban is, de alapértelmezésként nincs bekapcsolva. Talán éppen azért nincs, hogy rávezesse az embereket arra, hogy a makrókat ÍRNI érdemesebb. A makrórögzítő tudása igencsak korlátozott, és eleve csak a Writer és a Calc applikációban működik, az Impress-ben a Base-ban és a Draw-ban nem!
Az
"Eszközök - Beállítások - Speciális" menüpontban,
az "Opcionális funkciók" alatt kapcsolható be (az kísérleti funkciókkal együtt). Én mindkettőt be szoktam kapcsolni rögtön a telepítés után.



Első próbálkozásként vedd fel a makrót a makrórögzítővel. Makrórögzítés közben csakis a Menüt használd! (Tehát nem "Ctrl-C", és nem "Jobb egérgomb - Másolás", hanem a Menüből: "Szerkesztés - Másolás"!
A Makrórögzítés során MINDENT fel kell venned, ha azt szeretnéd, hogy minden körülmények között működjön a makród. Tehát, ha BÁRMELY munkalapról szeretnéd elindítani, de egy adott munkalapról kell másolnod, akkor fel kell vennek as adott munkalapra UGRÁST is! Egyetlen cella teljes körű másolása egy másik munkalap egyetlen cellájába így néz ki Makrórögzítővel (nem pontosan követtem a te makród hivatkozásait sem a munkalapnév sem a cella tekintetében):

Kód: Egész kijelölése

sub Masolas1
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 1

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$B$4"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Nr"
args4(0).Value = 2

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$C$8"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())


end sub
Amint látod, a Dispatcher a számával (és nem a nevével) szólítja meg a munkalapot, és a szöveges hivatkozásával a cellákat. A te VBA makródban ez pont fordítva van. Persze az API ad lehetőséget mindkettőre, csak a Makrórögzítő által vezérelt Dispatcher működik ilyen egysíkúan.
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

Ugyanez a makró egészen máshogy néz ki kézzel MEGÍRVA, és csakis a cellatartalmat másolva. Saját függvény, eljárás MEGÍRÁSAKOR használd az Option Explicit kapcsolót. Az esetleg itt-ott elütött változónevek hatására hibaüzenetet generálva figyelmeztet arra, hogy bár a StarBasic elfogadja a véletlenül megváltoztatott változónevet is, de annak az értéke egyáltalán nem ugyanaz, mint amire számítasz! A kapcsoló hatására MINDEN változónevet definiálni kell a Dim utasítással; ha a kódban szereplő (esetleg csupán egyetlen betűnyivel elrontott) változónév nincs definiálva, akkor azt jelzi.

Itt egy példa a kétféle makrólétrehozási megoldással ugyanarra a két cellára vonatkozó másolási funkcióval.

A Masolas1 rutin a Dispacher által generált kódot, a Masolás2 a kézzel írt kódot tartalmazza.

Kód: Egész kijelölése

REM  *****  BASIC  *****

Option Explicit


sub Masolas1
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 1

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$B$4"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Nr"
args4(0).Value = 2

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$C$8"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())


end sub


Sub Masolas2

 Dim oDoc as Object
 Dim oSheets as Object
 Dim oSourceSheet as Object
 Dim oTargetSheet as Object
 Dim oSourceRange as Object
 Dim oTargetRange as Object
 
	oDoc = ThisComponent
	oSheets = oDoc.Sheets()
	oSourceSheet = oSheets.getByName("Munkalap1")
	oTargetSheet = oSheets.getByName("Munkalap2")
	oSourceRange = oSourceSheet.getCellRangeByName("$B$4")
	oTargetRange = oTargetSheet.getCellRangeByName("$C$8")
	oTargetRange.DataArray = oSourceRange.DataArray

End sub
Csatolmányok
Másolás.ods
(12.38 KiB) Letöltve 193 alkalommal.
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

Érdemes a változónevek első betűjét olyanra választani, hogy az jelezze (számodra) a típusát. Ez nem kötelező, a Basic Interpreternek mindegy, hogy használsz vagy nem ilyen jelző betűt...

Dim oDoc as object - a dokumentumhoz rendelt Objektum típusú változó, a dokumentum teljes tartalmával
Dim oSheets as object- a munkalaplista: Objektum típusú változó egy adott dokumentumon belül
Dim oSheet as object - egy munkalap: Objektum típusú változó a munkalap teljes tartalmával.

Értékadás:
oDoc = Thiscomponent - az éppen előtted lévő, nyitott dokumentum, amiből a makrót elindítottad.
Természetesen máshogy is meg lehet szólítani egy dokumentumot. Be is lehet akár tölteni az ő saját URL-jéről, ha az még nincs nyitva.

más példák_

Dim iCount a integer - egy "számláló" változó, ami csakis egész (integer) számokat tartalmazhat.

Dim sText as string - egy String típusú változó szöveges tartalommal
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

Ha Makrókat akarsz ÍRNI, akkor elengedhetetlen egy Objektum-vizsgáló használata. Az API leírás ugyanis irdatlan nagy, lehetetlen megtanulni belőle MINDEN objektumnak az ÖSSZES tulajdonságát és metódusát.
Az Object inspector tools (objektumvizsgálók) kilistázzák neked az adott objektum összes létező tulajdonságát és metódusát, és a tulajdonságok típusát is. Tehát azokat a dolgokat listázzák ki amiket/amelyekkel a te programodból/makródból elérhetsz (lekérdezhetsz), vagy megváltoztathatsz valamilyen tulajdonságot.

Objektumvizsgálók:
XrayTool:
https://forum.openoffice.org/en/forum/v ... 20&t=54217
https://berma.pagesperso-orange.fr/index2.html

MRI:
https://extensions.openoffice.org/en/pr ... ction-tool

Ezek harmadik fél (gyakorlatilag az ügyesebb felhasználók) által írt makrók/kiterjesztések.
Én az XrayTool-t használom.
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
nagytk
Hozzászólások: 6
Csatlakozott: 2019. január 20., vasárnap 22:53

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: nagytk »

Időközben sikerült megtalálnom a makró rögzítő funkciót, amit produkál nem túl átlátható.
Elkezdtem felfogni és egyszerűsíteni a rögzítő általi megoldást, de sajnos nincs kapacitásom megtanulni a nyelvet.
Az alap ötletem az volt, hogy a forrás munkalap első oszlopába minden sorra berakok egy gombot ami az aktuális sor adott celláit átmásolja, ami a cél munkalap ugyanazon celláiba kerülne.
Ezzel csak az a baj, hogy minden sorra nekem kellene definiálni a másolandó cellákat (az én tudásommal).
A forrás sorok száma valószínű elérné az ezres nagyságrendet, így eléggé big makró lenne sok idő ráfordítással.
Így az lenne a megoldás, hogy a forrásban kijelölni aktuális sort gombnyomásra a cél munkalapra másolni.
Tehát a cél mindig ugyanazon cellák, a forrás pedig az aktuális sor adott cellái.
Így vizsgálni kellene a aktuális sor kijelölést is. Most itt akadtam meg.
Libreoffice 6.1.4.2.
Ubuntu 18.04.1
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

de sajnos nincs kapacitásom megtanulni a nyelvet.
A "NYELV" (a StarBasic) egy igen egyszerű, Basic nyelvjárású programozási nyelv. Nincs mit rajta "megtanulni". Ha nem tudod az alapvető dolgokat adaptálni korábbi tudásodból (változódeklarálás, értékadás, elágazások, illetve magát az objektumorientált programozást, stb.), akkor hozzá se kezdj!

Ahogy mondtam, írtam: az API függvények ezrei - amit meg kell hívnod a StarBasic kódból -, és az objektumok sokasága valamint azok sokszoros mennyiségű tulajdonságai és metódusai az, amit pedig nem lehetséges megtanulni, és nem is szükséges megtanulni. Elég az adott, az éppen a kezedbe kerülő objektumét kilistáztatni.

Alapvetően az egész rendszer egy objektumorientált megoldással működik. Szinte minden dolog objektumként van jelen. És az objektumoknak vannak saját tulajdonságai (szín, betűtípus, érték, vagy BÁRMI más), és lehetnek "gyerekei", al-objektumai, amiknek lehetnek megint csak mindenféle tulajdonságai. Ezeket tudod olvasni-írni objektumtól és tulajdonságtípustól függően. A tulajdonságértékek pedig lehetnek szintén objektumok, vagy tömbök, vagy real (floating) számok, vagy integerek, vagy stringek...)

Tehát egy cella vagy cellatartomány is egy objektumként kerül a kezedbe, aminek a tartalmát (értékét és akár a formázását, stílusát) tudod egyenként, vagy tömbként olvasni-írni. A cella "gyereke" a Munkalapnak, a munkalap pedig "gyereke" a munkalapok listájának; az pedig teljes dokumentumnak. Ezért kell "lépcsőzetesen" megfogni az egyre kisebb részeket - ahogy azt a Masolas2 rutinban látod, és a végén a legkisebb elemeknek kiolvasni és/vagy beállítani az értékét.
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: munkalapok közötti automatikus másolás makróval

Hozzászólás Szerző: Zizi64 »

A forrás sorok száma valószínű elérné az ezres nagyságrendet, így eléggé big makró lenne sok idő ráfordítással.
Így az lenne a megoldás, hogy a forrásban kijelölni aktuális sort gombnyomásra a cél munkalapra másolni.
Tehát a cél mindig ugyanazon cellák, a forrás pedig az aktuális sor adott cellái.
Így vizsgálni kellene a aktuális sor kijelölést is. Most itt akadtam meg.
Kicsit részletgazdagabban, pontosabban, konkrétabban meg kéne adnod, hogy mit, mivel együtt (vagy éppen külön-külön) kellene hová másolnod.
Egy mintafájlt is tölthetnél fel ide, az sokat segítene. A fórum pár napja sajnos néha belassul, de előbb-utóbb sikerülhet feltölteni a 128 KiB-nál nem nagyobb fájlokat.
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Válasz küldése