Rotinas UNO - Macro Calc

Onde consigo material para entender como funcionam as rotinas UNO, quais as existentes, etc…

Apenas como exemplo, em

 Servico = createUnoService("com.sun.star.frame.DispatchHelper")
'Servico.executeDispatch(Plan, ".uno:Copy", "", 0, Array() )

Onde descubro quais os Argumentos possíveis e para que servem o “”, 0 e o Array() ?

1 Like

Não é exatamente o que quer, mas é sobre UNO

https://wiki.documentfoundation.org/Development/DispatchCommands#Information_Validity

E outros links sobre Basic:

Bom dia, Schiavinatto. Sim, esse material eu já conheço.

Tenho vasculhado a internet em busca de esclarecimentos, mas não encontrei ainda material que propicie explorar de forma profundamente produtiva as rotinas UNO.

Trabalhar com macros no OpenOffice é uma cansativa garimpagem, um copia-e-cola frustrante onde o limite é repetir automaticamente fórmulas prontas. Claro que o objetivo principal do BROfice é a suite de escritório, mas não há dúvidas que expandir o seu alcance incorporando macros é fundamental para que se obtenha dela um aproveitamento imensamente maior.

Sigo na pesquisa. Obrigado.

Concordo, deveriam investir em sub-rotinas prontas para uso, já embutidas no LibreOffice, para facilitar a criação de macros. Acho perda de tempo ao necessitar do simples comando COPY ter que que acionar/invocar tanta coisa. Talvez eu esteja falando besteira perante Programadores mas é meu pensamento.

@Jedison, depois de revirar o wiki.openoffice.org, acredito que encontrei uma resposta aos meus questionamentos, também.

Comecei aqui: The OpenOffice recorder and UNO dispatch calls - Apache OpenOffice Wiki

Fui parar nesse material aqui:
https://wiki.openoffice.org/wiki/Category:Basic:Tutorials

Vamos aos estudos.

Ola @WBastos, também publiquei em:

Obrigado pela dica.

Não sei se tem a extensão MRI disponível aqui no fórum, mas segue o link, caso alguém queira baixá-la: MRI - UNO Object Inspection Tool | Apache OpenOffice Extensions

Instruções de uso: [Tutorial] Introduction into object inspection with MRI (View topic) • Apache OpenOffice Community Forum

Olá amigos.
Muito interessantes os materiais que disponibilizaram. Gravei os links aqui nos meus favoritos para oportuna consulta.
Venho montando uma biblioteca de macros para manipular as planilhas (como extrair e inserir conteúdo em células ou intervalos, transferir para variáveis e vice-versa, selecionar abas diferentes e até trabalhar com arquivos. Prefiro as que dispensam as chamadas UNO, justamente pela dificuldade em achar documentação. Parece um universo fechado onde somente os “iniciados” conseguem trabalhar e tirar todo o proveito possível, o que vem de encontro aos princípios “livre” e “aberto” o LibreOffice.
Mas num dos links que você (WBastos) ofereceu, acho que está a resposta para a minha pergunta inicial: “The dispatch commands are an internal mechanism of Apache OpenOffice. The arguments of each dispatch command are not documented.” Ou seja… não tem documentação MESMO. Pena.
De qualquer sorte, valeu! Como disse o Squiavinatto… vamos aos estudos.

Ola @Jedison, tenho uma coletânea de macros que deixo como SubMacros em Minhas macros.

SubMacros.oxt.odt

Coloquei .odt somente para upload, apague e deixe .oxt

Instale como extensão.

Ola @Jedison , @Wbastos eu montei esta macro Execute que aceita diversos comandos UNO simples ( não necessitam de complementos )

Sub Execute ( oQue$, Optional nQtd% )
Dim Exec(1) as new com.sun.star.beans.PropertyValue
Exec(0).Name = "By" : Exec(0).Value = nQtd
Exec(1).Name = "Sel" : Exec(1).Value = false
CreateUnoService("com.sun.star.frame.DispatchHelper") _
.executeDispatch(ThisComponent.CurrentController _
.Frame, ".uno:" & oQue & "", "", 0, Exec())
End Sub

Na Macro, por exemplo, para executar o comando Copy, escrevo só Execute “Copy”, e se for distribuir a planilha coloco a SubMacro Execute também.

Veja a relação de comandos UNO aceitas na macro Execute ( deve ter mais ).

E outra muito útil é esta:

Sub GoToCel ( xLocal$ )
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint" : args1(0).Value = xLocal
CreateUnoService("com.sun.star.frame.DispatchHelper") _
.executeDispatch(ThisComponent.CurrentController _
.Frame, ".uno:GoToCell", "", 0, args1())
End Sub

O uso GoToCel "xLocal"

Onde xLocal pode ser :

  • A2 'célula da planilha ativa
  • A3:D6 'área da planilha ativa
  • Plan1.A2 'célula de outra planilha
  • Plan2.S2:F6 ’ área de outra planilha
  • Plan4 'Planilha
  • Dados 'área nomeada

Obrigado pelo complemento das informações @schiavinatto.

Fico na dúvida sobre qual serviço do Uno utilizar. Como saber que o GoToCell vai buscar o serviço Uno no endereço “com.sun.star.frame.DispatchHelper”?

Existe uma regra predefinida ou tenho que pesquisar no Wiki pra encontrar o serviço?

Desculpe pela minha ignorância, mas é porque entendo melhor as coisas se conseguir visualizar uma sequência lógica.
Comecei a rastrear o bendito DispatchHelper acima pra ver se entendo melhor a lógica.

As macros acima fiz com o gravador e depois tirei as gorduras, existe esta extensão, o @ohallot que passou, da toda a informação sobre o que esta acontecendo com os comandos, porem não sei direito como usar, estou tentando entender o uso.
(https://berma.pagesperso-orange.fr/Files_en/XrayTool60_en.odt)

Ola., para deslocar a seleção para uma determinada célula não é necessário utilizar as rotinas UNO.

Uso esses códigos para isso:

' Para selecionar uma ABA diferente da que está em uso:
Plan = ThisComponent.Sheets.getByName("Aqui vai o nome da ABA")

' Seleciona célula A3 nesta ABA
Dest = Plan.GetCellRangeByName("A3")
ThisComponent.getCurrentController().Select(Dest)

ACHO que usando os comandos nativos, sem acionar rotinas UNO usa-se menos recursos do sistema.

Como na sua (Schiavinatto), dá pra mencionar Blocos “A3:D5” por exemplo. Ou, ainda, um intervalo nomeado, colocando o nome desse intervalo ali no lugar de A3.
Para usar um endereço absoluto, em vez de …GetCellRangeByName… usa-se GetCellRangeByPosition, colocando o endereço da(s) linha(s) e coluna(s) desejadas. Lembrando que o sistema começa do zero. Ou seja, a primeira linha não é a 1, e sim a 0. A primeira coluna (A) é também 0:

Nesse formato A3:D5 ficaria …byPosition(2,0,4,4)

@Jedison, eu conheço esta maneira de deslocamento, mas tenho que ter vários procedimentos para áreas diferentes ( plan, área, célula ) a minha SubMacro GoToCel, apesar de usar UnoService me atende de todas as maneiras, não tenho que alterar nada. Só indicar onde quero ir.

@schiavinatto, realmente sua macro ficou top. Tentei utilizá-la no Execute (GoToCell , sLocal) , mas não deu muito certo não. Tem uma forma de usá-la com o Execute?

@WBastos, para usar em macro é só GoToCel "A3"

Exemplo de macro que Copia de um local e cola em outro:

Sub CopiaCola
GoToCel "Plan1.B4:G7"
Execute "Copy"
GoToCel "Plan2.C3"
Execute "Paste"
End Sub

Option Explicit

    Public oFrm 		As Object
    Public Const  oDisp = "com.sun.star.frame.DispatchHelper"
    Public Args1(0) 	as new com.sun.star.beans.PropertyValue
    Public Exec(1) 		as new com.sun.star.beans.PropertyValue
    '---
    Sub CopiarColar
    	oFrm = ThisComponent.CurrentController.Frame
    	gotocel ("E2:E6")
    	Execute ("Copy")
    	gotocel ("F2:F11")
    	Execute ("Paste")
    End Sub 
    '---
    Sub GoToCel ( xLocal$ )
    	args1(0).Name = "ToPoint"
    	args1(0).Value = xLocal
    	CreateUnoService( oDisp ) _
    	.executeDispatch(oFrm, ".uno:GoToCell", "", 0, args1())
    End Sub
    '---
    Sub Execute ( oQue$, Optional nQtd% )
    	Exec(0).Name = "By"
    	Exec(0).Value = nQtd
    	Exec(1).Name = "Sel"
    	Exec(1).Value = false
    	CreateUnoService( oDisp ) _
    	.executeDispatch( oFrm , ".uno:" & oQue & "", "", 0, Exec())
    End Sub

Estou brincando com sua macro aqui @schiavinatto. Vou ver faço umas adaptações para diminuir o código e aprender mais um pouco.

É mexendo que se aprende, ou trava tudo … hahahahah

O local de colagem só indicar a célula superior esquerda

de    `gotocel ("F2:F11")`    para             `gotocel ("F2")`

Se não foi proposital para replicar as linha

Podemos ir trocando ideias, veja contato direto aqui: User:Schiavinatto - The Document Foundation Wiki