Proste makro z vba na oo basic

Makropolecenia i funkcje w języku Basic
barhez
Posty: 3
Rejestracja: pn lis 19, 2012 12:07 pm

Proste makro z vba na oo basic

Post autor: barhez »

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

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
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Proste makro z vba na oo basic

Post autor: Jan_J »

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 http://forum.openoffice.org/pl/forum/vi ... 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

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

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 (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
barhez
Posty: 3
Rejestracja: pn lis 19, 2012 12:07 pm

Re: Proste makro z vba na oo basic

Post autor: barhez »

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

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
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Proste makro z vba na oo basic

Post autor: belstar »

A może by tak bez paste special

Kod: Zaznacz cały

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
barhez
Posty: 3
Rejestracja: pn lis 19, 2012 12:07 pm

Re: Proste makro z vba na oo basic

Post autor: barhez »

Bez special wklei mi też formuły a ich nie chce ;/
OpenOffice 3.3 na Windows 7
ODPOWIEDZ