Proste makro z vba na oo basic

Makropolecenia i funkcje w języku Basic

Proste makro z vba na oo basic

Postprzez barhez » Pn lis 19, 2012 12:13 pm

Witam,
Potrzebuje przerobić makro z vba na oo basic, lecz kompletnie zielony jestem z oo. Pomóżcie mi od czego zacząć oto treść makra w vba.
Kod: Zaznacz cały   Rozszerz widokZwiń widok
Sub Kopiowanie()
'
' Keyboard Shortcut: Ctrl+k
'
    Cells.Select
    Range("I14").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Workbooks.Add
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
End Sub


Wytłumaczenie makro kopiuje zawartość aktualnego arkusza, tworzy nowy dokument i wkleja szerokość kolumn, wartości komórek i formatowanie.
OpenOffice 3.3 na Windows 7
barhez
 
Posty: 3
Dołączył(a): Pn lis 19, 2012 12:07 pm

Re: Proste makro z vba na oo basic

Postprzez Jan_J » Wt lis 20, 2012 5:09 pm

Po pierwsze, sam Basic w Excelu i OOo/AOO/LO jest podobny.

Po drugie, biblioteka dająca dostęp do skoroszytu jest zupełnie inna. Jest na pozór skomplikowana, ale dość logiczna. Zobacz viewtopic.php?f=27&t=1094#p4450

Po trzecie, trochę literatury.
Przede wszystkim Andrew Pitonyak: AndrewMacro i OpenOffice Macros Explained. Oba na http://pitonyak.org.
A także fora dyskusyjne. http://www.oooforum.org/forum dziś jest zaspamowane, ale znajduje się tam wiele cennych, gromadzonych latami przykładów. Oraz fora Apache'a, zwłaszcza http://forum.openoffice.org/en.
Oprócz tego źródła referencyjne, czyli definicja API: Apache'a http://www.openoffice.org/api/ oraz LibreOffice http://api.libreoffice.org.

Po czwarte, do roboty. Zanim zaczniemy, poszukajmy gotowców. Google: openoffice copy sheet to new workbook macro
Obiecujący wynik: http://www.oooforum.org/forum/viewtopic.phtml?t=10081. Spróbuj zaadaptować; jeśli się nie uda, pomożemy.

Dygresja:
Istnieją 2 różne sposoby operowania na obiektach OOo/LO z poziomu programu. Jeden poprzez UNO API -- wspomniane w referencjach wyżej; to jest biblioteka dostępu z poziomu języków programowania. Drugi przez interpreter (dokładniej: dispatcher) wysokopoziomowego języka, bardziej zbliżonego do tego, czego oczekuje się pod nazwą “Makro”. W cytowanym poście z oooforum, polecenia
Kod: Zaznacz cały   Rozszerz widokZwiń widok
firstDoc = thisComponent
StarDesktop.loadComponentFromUrl("private:factory/scalc","_blank",0,dimArray())
secondDoc.getSheets().insertNewByName("inserted",0)
są wywołaniami obiektów i metod API, natomiast
Kod: Zaznacz cały   Rozszerz widokZwiń widok
dispatchURL(firstDoc,".uno:SelectAll")
dispatchURL(firstDoc,".uno:Copy")
angażują dispatchera UNO. Na ogół te drugie są mniej efektywne, ale łatwiejsze do ogarnięcia dla kogoś, kto myśli interfejsem użytkownika.
JJ
LO (6.1|6.2) ∙ AOO 4.1.6 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3904
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Proste makro z vba na oo basic

Postprzez barhez » Śr lis 21, 2012 2:32 pm

Dziękuję za pomoc makro działa już w 90%. Problem jest w tym że wyskakuje mi okienko od wklej specjalne i muszę nacisnąć ok. Poza tym nie zawsze są zaznaczone opcje które chce by były. Wie ktoś jak temu zaradzić?

Kod: Zaznacz cały   Rozszerz widokZwiń widok
Sub Kopiowanie_arkusza
  Dim doc1
  dim doc2   as object
  dim dispatcher as object
 
  doc1 = ThisComponent
  dispatchURL(doc1,".uno:SelectAll")
  dispatchURL(doc1,".uno:Copy")
  doc2 = StarDesktop.loadComponentFromUrl("private:factory/scalc" , _
                      "_blank",0,dimArray())
  doc2.getSheets().insertNewByName("inserted",0)
  selectSheetByName(doc2, "inserted")
     

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(5) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "SVDNT"
args1(1).Name = "FormulaCommand"
args1(1).Value = 0
args1(2).Name = "SkipEmptyCells"
args1(2).Value = false
args1(3).Name = "Transpose"
args1(3).Value = false
args1(4).Name = "AsLink"
args1(4).Value = false
args1(5).Name = "MoveMode"
args1(5).Value = 4
dispatchURL(doc2, ".uno:InsertContents", "", 0, args1())


End Sub

Sub selectSheetByName(oDoc, sheetName)
  oDoc.getCurrentController.select(oDoc.getSheets().getByName(sheetName))
End Sub

Sub dispatchURL(oDoc, aURL)
  Dim noProps()
  Dim URL As New com.sun.star.util.URL
  Dim frame
  Dim transf
  Dim disp

  frame = oDoc.getCurrentController().getFrame()
  URL.Complete = aURL
  transf = createUnoService("com.sun.star.util.URLTransformer")
  transf.parseStrict(URL)

  disp = frame.queryDispatch(URL, "", _
            com.sun.star.frame.FrameSearchFlag.SELF _
         OR com.sun.star.frame.FrameSearchFlag.CHILDREN)
  disp.dispatch(URL, noProps())
End Sub
OpenOffice 3.3 na Windows 7
barhez
 
Posty: 3
Dołączył(a): Pn lis 19, 2012 12:07 pm

Re: Proste makro z vba na oo basic

Postprzez belstar » Pn lis 26, 2012 10:09 pm

A może by tak bez paste special
Kod: Zaznacz cały   Rozszerz widokZwiń widok
Sub Kopiowanie_arkusza
   Dim doc1
   dim doc2   as object
   dim dispatcher as object
     
   doc1 = ThisComponent
   dispatchURL(doc1,".uno:SelectAll")
   dispatchURL(doc1,".uno:Copy")
   doc2 = StarDesktop.loadComponentFromUrl("private:factory/scalc" , _
                          "_blank",0,dimArray())
   doc2.getSheets().insertNewByName("inserted",0)
   selectSheetByName(doc2, "inserted")
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   dispatchURL(doc2, ".uno:Paste")
End Sub

Sub selectSheetByName(oDoc, sheetName)
   oDoc.getCurrentController.select(oDoc.getSheets().getByName(sheetName))
End Sub

Sub dispatchURL(oDoc, aURL)
   Dim noProps()
   Dim URL As New com.sun.star.util.URL
   Dim frame
   Dim transf
   Dim disp

   frame = oDoc.getCurrentController().getFrame()
   URL.Complete = aURL
   transf = createUnoService("com.sun.star.util.URLTransformer")
   transf.parseStrict(URL)

   disp = frame.queryDispatch(URL, "", _
                com.sun.star.frame.FrameSearchFlag.SELF _
             OR com.sun.star.frame.FrameSearchFlag.CHILDREN)
   disp.dispatch(URL, noProps())
End Sub
LibreOffice 5.1.2.2 Ubuntu 16 LTS
belstar
 
Posty: 646
Dołączył(a): Cz mar 17, 2011 9:08 am

Re: Proste makro z vba na oo basic

Postprzez barhez » Pn gru 03, 2012 10:50 am

Bez special wklei mi też formuły a ich nie chce ;/
OpenOffice 3.3 na Windows 7
barhez
 
Posty: 3
Dołączył(a): Pn lis 19, 2012 12:07 pm


Powrót do Basic

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość