MakroBASI - czyli upraszczajmy aż do bólu

Gotowe szablony, skrypty, makropolecenia i rozszerzenia. Tutaj możesz pochwalić i podzielić się swoją twórczością z innymi użytkownikami
nkab
Posty: 14
Rejestracja: pn wrz 28, 2009 10:46 am

MakroBASI - czyli upraszczajmy aż do bólu

Post autor: nkab »

Open Offica mam zaledwie kilka dni i pierwsze wrażenie, jeśli idzie o makra, było okropne.
Po jakiejś godzinie jednak coś mi tam zaświtało o so tu chozi i stwierdziłem, że to może być
naprawdę proste - takie dla BASI z reklamy...
MakroBASI.jpg
MakroBASI.jpg (12.49 KiB) Przejrzano 5533 razy
To BASI to tak naprawdę skrót od BASIC ale sympatyczniejsze.







Oto mój wynalazek:

REM ***** BASIC *****
'Makro dla BASI

' define global variables
dim document as object
dim dispatcher as object

sub ob
' get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
end sub







sub MakroBASI
' glowna procedura dla BASI z ktorej wywolywane sa procedury (czyli to co BASIA chce robic automatem w arkuszach)
' innymi procedurami nie musisz sie interesowac a juz napweno nie powinno się ich zmieniać
' komunikaty msgbox "ok... " tylko po to aby widziec na arkuszu co w danej chwili robią funkcje

' oczywiscie start makra przez uruchomienie makra o nazwie "MakroBASI"


sel("b1") ' selekcjonuje pojedncza komorke
ins("10") ' wstawia wartosc do komorki (w przypadku napisu 10 nalezy dac apostrof - "'10")
copy() ' kopuje zawartosc zaznaczonej komorki

sel("a1:a10") ' selekcjonuje obszar
paste() ' wkleja skopiowane wartosci do zaznaczonej komorki lub obszaru - tu ta wartoscia jest 10

sel("a3")
ins("=a1+a2") ' do a3 wstawia formule =a1+a2
msgbox "ok =a1+a2..."

ins("=suma(a1:a2)+saldo") ' do a3 wstawia formule =suma(a1:a2)+saldo ("saldo" to nazwa komorki w dowolnym arkuszu w aktywnym dokumencie tu nazwa dotyczy komorki b1)
msgbox "ok =suma(a1:a2)+saldo..." ' jak nadawac nazwy - stawiasz kursor na komorce gdzie jest wynik salda np w b1 i w lewym polu nad koluna A gdzie widnieje B1 wpisujesz wyraz saldo i akceptujesz enterem

sel("b3")
ins("=a3") ' no wlasnie wpisanie wyniku obliczenia z fukcji sum() z komorki a3 do komorki b3
msgbox "ok wartosc podsumowania z a3..."

sel("a20")
sel_max("end") ' odpowiednik Ctrl+Shift+END - zaznacza maksymalny zapelniony danymi obszar od kursora w prawo w dol az do pustych obszarow
msgbox "ok end ..." ' UWAGA - Ctrl+Shift na zasadzie przelacznika zmienia układ klawiatury na typ - mechaniczna maszyna do pisnia! - np zamiast znaku rownosci wpisuje sie apostrof

sel_max("up") ' to samo Ctrl+Shift+UpArr od kusora w gore az do pustego obszaru (lub wypelnionego gdy kursor stal na pustym polu)
msgbox "ok up..."

sel_max("up") ' kontynuacja, bo funkcja zatrzymuje kursor przy pustych obszarach


nr_ark("2") ' aktywacja arkusza o nr 2 i wpisanie do a20 liczby 111
sel("a20")
ins("111")
msgbox "ok Ark nr 2..."

nr_ark("1") ' powrot do arkusza nr 1
sel("a4")
copy()
sel("b4")
paste(sel("d4:e8") ) ' a tu zagniezdzone instrukcje

ins("='file:///C:/Users/AB/Documents/Rob OpenOffice/MyCwiczenia.xls'#$Arkusz1.A2:A4") 'formula: dane z adresu od/do pliku zewnetrznego gdzies na dysku
msgbox "ok file..."

sel("c20")
ins("=Arkusz2.A20") ' aktualny arkusz to Arkusz1, a dane pobierane z komorki w innym arkuszu z tego samego dokumentu
msgbox "ok =Arkusz2.A20..."

sel("g1")
ins("0")
sel("g2")
ins("5")
sel("g1:g2")
auto_num("g20") ' autonumeracja z krokiem 1 to zaznaczenie tylko pierwszej komorki (tu zaznaczono dwie komorki o wartosci 0 i 5)
msgbox "ok autonumeracja z krokiem 5..."

sel("g20") ' deselekcja


one("dn")
msgbox "ok przyjscie nastepnej komorki..."
one("up")
msgbox "ok przyjscie nastepnej komorki..."
one("right")
msgbox "ok przyjscie nastepnej komorki..."
one("left")
msgbox "ok przyjscie nastepnej komorki..."

end sub









'procedury upraszczajace zycie korzystajacemu z "OpenOffice Calc" rezydujace w kazdym nowym module
'-------------------------------------
sub sel(zm as string)
ob()
dim arg(0) as new com.sun.star.beans.PropertyValue
arg(0).Name = "ToPoint"
arg(0).value=zm
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, arg() )
end sub
'-------------------------------------
sub ins(zm as string)
ob()
dim arg(0) as new com.sun.star.beans.PropertyValue
arg(0).Name = "StringName"
arg(0).Value = zm
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, arg() )
end sub
'------------------------------------
sub nr_ark(zm as integer)
ob()
'przejscie do nastepnego arkusza
dim arg(0) as new com.sun.star.beans.PropertyValue
arg(0).Name = "Nr"
arg(0).Value = zm
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, arg() )
end sub
'-----------------------------------
sub copy()
ob()
' skopiowanie do schowka zaznaczonego obszaru
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array() )
end sub
'----------------------------------
sub paste()
ob()
' wklejenie danych ze schowka poczawszy od kursora
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array() )
end sub
'----------------------------------
sub sel_max(zm)
ob()

' wykrycie masymalnego obszaru i zaznaczenie go odpowiednio z od gory do dolu "dn" lub od dolu do gory "up"

dim arg(0) as new com.sun.star.beans.PropertyValue
arg(0).Name = "ToPoint"
arg(0).Value = true
select case zm
case "dn"
dispatcher.executeDispatch(document, ".uno:GoDownToEndOfData", "", 0, arg() )
case "up"
dispatcher.executeDispatch(document, ".uno:GoUpToStartOfData", "", 0, arg() )
case "right"
dispatcher.executeDispatch(document, ".uno:GoRightToStartOfData", "", 0, arg() )
case "left"
dispatcher.executeDispatch(document, ".uno:GoLeftToStartOfData", "", 0, arg() )
case "end"
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, arg() )
case "home"
dispatcher.executeDispatch(document, ".uno:GoHomeToOfData", "", 0, arg() )
end select

end sub
'-----------------------------------
sub one(zm)
ob()

' przejscie kursora do natepnej komorki odpowiednio "up", "dn", "right", "left"

dim arg(0) as new com.sun.star.beans.PropertyValue
arg(0).Name = ""
arg(0).Value = true
select case zm
case "dn"
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, arg() )
case "up"
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, arg() )
case "right"
dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, arg() )
case "left"
dispatcher.executeDispatch(document, ".uno:GoLeft", "", 0, arg() )
end select

end sub
'-------------------------------------
sub auto_num(zm)
ob()

' autonumerowanie zaznaczonego obszaru
dim arg(0) as new com.sun.star.beans.PropertyValue
arg(0).Name = "EndCell"
arg(0).Value = zm

dispatcher.executeDispatch(document, ".uno:AutoFill", "", 0, arg() )
end sub
'------------------------------------


Mam nadzieję, że inni bardziej zaznajomieni z Oo dołączą podobne uproszczenia.

Andrzej.
OpenOffice 3.1 na Windows Vista
ODPOWIEDZ