VBA kód konvertálása SB-be

Táblázatkezelő
HaJa
Hozzászólások: 1
Csatlakozott: 2013. június 26., szerda 9:00

VBA kód konvertálása SB-be

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

Sziasztok,

Van egy VBA makróm, amit szeretnék OO Calc-ban használni, azonban némi nehézségbe ütköztem (teljesen kezdő vagyok)

Ez az eredeti kódom:
Sub StartWrite()
Sheets(3).Select
ActiveSheet.Unprotect (pwString)
Application.ScreenUpdating = False

Sheets(1).Select

Range("C3").Select
Selection.Copy

Sheets(3).Select
Range("A1").Select

És némi on-line segítséggel ezt csináltam belőle (ami elakad futás közben):
Sub StartWrite()

Dim dokument as Object, aSheet as Object
aSheet = dokument.getSheetsByName(3)
ThisComponent.CurrentController.select(aSheet)
'ThisComponent.Sheets.SelectByName(3)
ThisComponent.CurrentController.ActiveSheet.Unprotect (pwString)
ThisComponent.LockControllers

Sheets(1).Select
Dim oCell as Object, oSheet as Object
oCell = oSheet.getCellRangeByName("C3")
ThisComponent.CurrentController.select(oCell)

Sheets(3).Select
Dim ooCell as Object
ooCell = oSheet.getCellRangeByName("A1")
ThisComponent.CurrentController.select(ooCell)

Kérlek, segítsetek benne!
Előre is köszönöm!
Open Office 3.4.1 Windows 7
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4034
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: VBA kód konvertálása SB-be

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

A soronkénti online VBA/StarBasic fordítók nem nagy sikerrel működnek általában.

Anno én is ezekkel próbálkoztam. Rájöttem később, hogy sokkal produktívabb megoldás, ha megtanulom az OOo, (ma már AOO/LO) programozását. A különbség nem a BASIC nyelv területén keresendő. Az a pár utasítás ami valóban a BAsic nyelv sajátja, az gyakorlatilag azonos a két nyelvváltozatban.
Az Igazi különbség azokban a függvényekben keresendők, amiket a BASIC nyelvből meg kell hívnod, ha valamit el akarsz érni a programon, a dokumentumon belül.
Ezeket az AOO/LO programokban "API" (Application Programming Interface) függvényeknek nevezik, és rengeteg van belőlük. Fontos dolog, hogy ezeket a függvényeket nem csak BASIC-ból, hanem egyéb programnyelvekből el lehet érni, és bár a BASIC elavult programnyelvnek számít, mégis ezt a legkényelmesebb használni a mai napig a programban. Azért, mert van beépített interpreter, van beépített szerkesztő, tehát itt, a programon belül tudod megírni, kipróbálni és futtatni a makróidat.

Objektum orientált programozásról beszélünk az AOO/LO esetében is. Ez röviden annyit jelent, hogy minden dolog egyféle objektumként van megjelenítve a programban, aminek léteznek tulajdonságai, és metódusai.
A tulajdonságokat lekérdezni és módosítani lehet, a metódust pedig meghívni (futtatni)
Mondjuk a Writer dokumentumba beillesztett grafikus elemnek (kör) van jó néhány tulajdonsága: mérete, helye, színe, körvonala. De a "Körvonal" maga is egy objektum, aminek van "vastagság" tulajdonsága.
Egy bonyolultabb elemnek (grafikon) nyilván sokkal több tulajdonsága van, és azoknak sokkal több al-tulajdonsága.
És sokkal több metódusa is van ("hozd létre, frissítsd, adj hozzá adattartományt... stb.)

Rátérve a te makródra. Az nem látszik a feltöltött eredeti kódból, hogy ez a teljes makró-e, vagy csak egy részlete. Még a szubrutin sincs lezárva "end sub" utasítással, tehát az se megállapítható, hogy ez az egyetlen szubrutin teljes-e... (Használd a "code" TAG-et itt a fórumon a kódok megjelenítésére.)

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

Sub StartWrite()
   Sheets(3).Select
   ActiveSheet.Unprotect (pwString)
   Application.ScreenUpdating = False

   Sheets(1).Select

   Range("C3").Select
   Selection.Copy

   Sheets(3).Select
   Range("A1").Select
Mit is csinál a makród?
Amennyi megállapítható a kódból, az annyi, hogy amikor valami meghívja ezt a szubrutint az Excel programban, akkor ez a rutin kiválasztja, és aktívvá teszi a hármas számú (számú, nem nevű!) munkalapot, a pwString nevű változó tartalmával megpróbálja feloldani a védelmet. Már azt se lehet tudni a makrókódból, hogy a pwString változó honnan, mikor kapja meg az az értéket (a jelszót), ami szükséges a védelem feloldásához.
Ha ez egy globális változó, akkor látnunk kellene az a programrészt is, ahol ez a változó megkapja az értékét.
Ha paraméterként átadott értékről van szó, akkor a szubrutin fejlécében szerepelnie kellene a változó nevének, ugyanis ott képes átvenne az őt meghívó rutintól bármiféle átadott értéket.
Ha pedig most fogja a program a kezelőtől bekérni a jelszó értékét, akkor látni kellene valami beviteli utasítást.
Ilyenek viszont nincsenek a kódodban.
Szóval, ha valahogy megvan a jelszó, és az stimmel is, akkor a makró feloldja a 3. munkalap védelmét. Ezután átugrunk az 1. munkalapra. Ott kijelöljük a C3 cellát és tatalmát a formázásával együtt kimásolja a Vágólapra.
De minek? Minek, ha utána közvetlenül megint visszaugrunk a 3. lapra, ahol kijelöljük az "A1" cellát, de nem csinálunk egyebet. Se be nem illesztjük a vágólap tartalmát, se onnan nem másolunk ki semmit.

Ez még egy olyan program, amit az AOO/LO MAKRÓRÖGZÍTŐJÉVEL is fel lehet venni. Ezt tettem én is:

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

sub Masol1
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 = 3

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

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Protect"
args2(0).Value = false

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

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

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

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

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

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

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

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

rem ----------------------------------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "ToPoint"
args7(0).Value = "$A$1"

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


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


end sub
A végére felvettem egy beillesztés utasítást is. A védelem feloldásakor az AOO/LO program bekéri a kezelőtől a jelszót (de csak akkor ha valóban védett a munkalap...), ez nem a makró intézi...
Amit itt láttál az a diszpécser (Dispatcher - irányító, segítő) funkciója az AOO/Lo programozhatóságának.
De lehet más módon is megírni ezt a programot. A makrórögzítő nem tesz mást, mint hogy eltárolja azokat a menüpontokra, cellákra való kattintásokat, amit kézzel végrehajtottál. A Makrórögzítő-Diszpécser páros sajnos nem képes lekövetni minden aktivitást, amit kézzel végrehajtasz a programban.

Ezért az API függvények közvetlen meghívása járhatóbb út a programozó számára.
De erről majd legközelebb...
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: 4034
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: VBA kód konvertálása SB-be

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

Vannak törekvések, amik arra irányulnak, hogy a VBA kódokat is képes legyen lefordítani az AOO/LO programcsomag.
Ebben talán a LibreOffice előrébb jár egy kicsivel.

De mindkét programcsomagnál van egy kapcsoló, amit a programkódok elején kell használni:

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

Option VBAsupport 1
Ha ezt beírod a VBA makró kód legelejére az adott Modulban, akkor az egyszerűbb VBA parancsokat képes lesz értelmezni az AOO is, de főleg a LO. De a bonyolultabbakkal még így se lesz képes megbirkózni.

Például az alábbi kód (ami megint csak a te példakódod, csak a végén tettem bele beillesztési utasítást is) működőképessé vált az Option... sor beírása után - kivéve a jelszavas feloldást, ezért azt kiREMeltem a programból. Tehát nem védett lapokon az összes többi utasítás működőképessé vált. LO3.6.4 alatt próbáltam ki.

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

Option VBAsupport 1

Sub StartWrite()
   pwString = "bakfitty"
   
   Sheets(3).Select
   REM ActiveSheet.Unprotect (pwString)
   Application.ScreenUpdating = False

   Sheets(1).Select

   Range("C3").Select
   Selection.Copy

   Sheets(3).Select
   Range("A1").Select
   
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=False, Transpose:=False

End Sub
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: 4034
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: VBA kód konvertálása SB-be

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

Utóbbi makrót "REM" nélkül az AOO3.4.1-en és LO4.0.2.2 hordozható verzión is kipróbáltam, ott működik rendesen, képes a védelmet is feloldani!
Ezek szerint a 3.6.4-ben ez az Unprotect dolog bug-os...

Bármilyen makrókódot is rögzítesz, írsz, szerkesztesz az AOO/LO programon belül, azt tudnod kell, hogy csak a saját (natív) formátumú dokumentumba fogja a makrókódot elmenteni a program, az idegen formátumokba nem - így xls-be sem...

De ez még mindig nem az AOO/LO API függvények közvetlen meghívására volt példa, arról majd megint akkor, ha lesz egy kis időm...
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: 4034
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: VBA kód konvertálása SB-be

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

Íme itt az ígért példa a közvetlen API függvény- és eljáráshívásra

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

Option Explicit

Sub Masol2

  Dim Ez_a_Dokumentum as object
  Dim Egyik_munkalap as object
  Dim Masik_munkalap as object
  Dim Forras_Cella as object
  Dim Cel_Cella as object
  Dim Jelszo as string
  
  Jelszo = "bakfitty"
  
REM Megszólítjuk az aktuális (az éppen aktív) dokumentumot
   Ez_a_Dokumentum = ThisComponent
   
Rem Megszólítjuk az 3. munkalapot. Innentől "Egyik_Munkalap" néven hivatkozhatunk majd rá
REM A számozás itt 0 alapú! Tehát a 2 érték a harmadik munkalapot jelenti.
   Egyik_munkalap = Ez_a_Dokumentum.getSheets.getByIndex(2)
   
REM Feloldjuk a védelmet a védett munkalapon
   Egyik_munkalap.unprotect(Jelszo)   

REM Megszólítjuk az 1. munkalapot. Innentől "Masik_Munkalap" néven hivatkozhatunk majd rá  
   Masik_munkalap = Ez_a_Dokumentum.getSheets.getByIndex(0)
   
REM Megszólítjuk a forráscellát. Innentől kezdve "Forras_Cella" néven hivatkozhatunk majd rá
REM A C5 cella megszólítása, de 0 bázisú koordinátákkal megadva:
   Forras_Cella = Masik_munkalap.getCellByPosition(2,4) 
   
REM Megszólítjuk a célcellát. Innentől kezdve "Cel_Cella" néven hivatkozhatunk majd rá
REM Az A1 cella megszólítása, de 0 bázisú koordinátákkal megadva:
   Cel_Cella = Egyik_munkalap.getCellByPosition(0,0)
   
REM anélkül, hogy grafikusan ide-oda ugrálnánk: kiválasztanánk, vagy aktívvá tennénk a munkalapokat és cellákat
REM egyszerűen átemeljük egyik megszólított cellából a másikba a benne levő tartalmat .
REM (a formátumot ezzel a módszerrel men visszük át!)
   Cel_Cella.formulalocal = Forras_Cella.formulalocal
   
REM Visszaállítjuk a munkalapvédelmet. A sor értelme: 
REM Az Egyik_munkalap nevű munkalapon futtatjuk a "protect" nevű eljárást, 
REM méghozzá úgy, hogy átadjuk neki a Jelszo nevű változó tartalmát, 
REM ami nem más, mint az elején megadott "bakfitty" szöveg.
   Egyik_munkalap.protect(Jelszo) 
   
End Sub    
Amint az látható is ebben a kódban csak a DIM és a REM utasítás, meg az értékadás utasítása: az egyenlőségjel származik valójában a BASIC nyelvből, a többi az Változónév (ezeket igyekeztem magyarosítani, hogy fel lehessen ismerni), illetve API függvény vagy eljárásnév, vagy a változók numerikus, és szöveges értéke. Tehát itt látszik, hogy maga a BASIC nyelv vajmi kevés szerepet játszott a "programozásban".

A sok beszúrt megjegyzés miatt esetleg ijesztően hosszúra nőtt programunk valójában így néz ki:

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

Option Explicit

Sub Masol2

  Dim Ez_a_Dokumentum as object
  Dim Egyik_munkalap as object
  Dim Masik_munkalap as object
  Dim Forras_Cella as object
  Dim Cel_Cella as object
  Dim Jelszo as string
  
  Jelszo = "bakfitty"

   Ez_a_Dokumentum = ThisComponent
   Egyik_munkalap = Ez_a_Dokumentum.getSheets.getByIndex(2)
   Egyik_munkalap.unprotect(Jelszo)   
   Masik_munkalap = Ez_a_Dokumentum.getSheets.getByIndex(0)
   Forras_Cella = Masik_munkalap.getCellByPosition(2,4) 
   Cel_Cella = Egyik_munkalap.getCellByPosition(0,0)
   Cel_Cella.formulalocal = Forras_Cella.formulalocal
   Egyik_munkalap.protect(Jelszo) 
   
End Sub    
Sőt, ha nem használjuk az "Option Explicit" direktívát a program elején (ami azt jelenti, hogy szigorúan minden változót deklarálni kell a DIM utasítással, mert különben hibaüzenetet kapunk) akkor még a DIM utasítások is elhagyhatók

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

Sub Masol2
  
  Jelszo = "bakfitty"

   Ez_a_Dokumentum = ThisComponent
   Egyik_munkalap = Ez_a_Dokumentum.getSheets.getByIndex(2)
   Egyik_munkalap.unprotect(Jelszo)   
   Masik_munkalap = Ez_a_Dokumentum.getSheets.getByIndex(0)
   Forras_Cella = Masik_munkalap.getCellByPosition(2,4) 
   Cel_Cella = Egyik_munkalap.getCellByPosition(0,0)
   Cel_Cella.formulalocal = Forras_Cella.formulalocal
   Egyik_munkalap.protect(Jelszo) 
   
End Sub    
(de célszerű egyébként az egyértelműség kedvéért inkább deklarálni minden változó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: 4034
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: VBA kód konvertálása SB-be

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

Elérhető információk listája az AOO/LO Office csomagok programozásáról:

http://forum.openoffice.org/hu/forum/vi ... =22&t=1400
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