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.
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.
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
Dear, here is a library link that contains several compiled functions to assist in the development of basic macros: https://extensions.libreoffice.org/en/extensions/show/34128
Olá @DIORGENES
Poderia ser mais fácil o acesso ao uso…
Poderia ter deixado uma Biblioteca desprotegida com explicações e acesso, e as Macros em outras Bibliotecas protegidas. seria mais pratico.
Boa tarde Sr. Schiavinatto.
remPara usar as funções da biblioteca, tem que passar a senha conforme abaixo:
remBasta chamar somente 1 vez essa função
const senha=“108-121-106-122-131-77-76-108-106-74-76-121-122-106-76-75-120-106-122-131-75-77-105-134-109-120-363-370-129-126-151-120-94-90-148-131-121-129-90-91-121-131-130-91-89-121-125-91-94-148-131-121-130-125”
global autorizado as boolean
function autorizar() as boolean
if(autorizado<>true) then
GlobalScope.BasicLibraries.loadLibrary(“Disoftware”)
Acesso.Iniciar(senha)
if(Acesso.IniEstado()=true) then
autorizado=true
else
autorizado=false
end if
end if
autorizar=autorizado
end function
rem*****************para copiar de uma cédula e colocar em outra seria****************
rem****no caso copia da cedula A1 da Planilha1 e cola na cedula A2 da Planilha1
sub alterar
if(autorizar()) then
valor=Documentos.extrair(thisComponent,“Planilha1.A1”)
Documentos.alterar(thisComponent,“Planilha1.A2”,valor)
end if
end sub
(Attachment exemplo de extrair e alterar cedula.txt is missing)