We will be migrating from Ask to Discourse on the first week of August, read the details here

Pergunte aqui
1

Rotinas UNO - Macro Calc

perguntadas 2021-04-15 22:14:22 +0200

imagem do gravatar de Jedison

updated 2021-04-19 23:54:21 +0200

imagem do gravatar de Schiavinatto

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() ?

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

Comentários

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

https://wiki.documentfoundation.org/D...

E outros links sobre Basic:

https://ask.libreoffice.org/pt-br/que...

imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-15 23:36:59 +0200 )editar

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.

imagem do gravatar de JedisonJedison ( 2021-04-16 15:03:41 +0200 )editar

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.

imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-16 15:53:23 +0200 )editar

2 Respostas

0

respondidas 2021-04-18 01:26:12 +0200

imagem do gravatar de WBastos

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

Comecei aqui:https://wiki.openoffice.org/wiki/The_...

Fui parar nesse material aqui:https://wiki.openoffice.org/wiki/Cate...

Vamos aos estudos.

editar assinalar como ofensivo Excluir Link mais

Comentários

Ola @WBastos, também publiquei em:

https://ask.libreoffice.org/pt-br/que...

Obrigado pela dica.

imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-18 03:38:35 +0200 )editar

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: https://extensions.openoffice.org/en/...

Instruções de uso:https://forum.openoffice.org/en/forum...

imagem do gravatar de WBastosWBastos ( 2021-04-18 11:10:57 +0200 )editar

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.

imagem do gravatar de JedisonJedison ( 2021-04-18 19:46:51 +0200 )editar

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

C:\fakepath\SubMacros.oxt.odt

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

Instale como extensão.

imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-18 20:02:49 +0200 )editar
0

respondidas 2021-04-18 03:31:13 +0200

imagem do gravatar de Schiavinatto

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
editar assinalar como ofensivo Excluir Link mais

Comentários

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?

imagem do gravatar de WBastosWBastos ( 2021-04-18 04:00:32 +0200 )editar

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.

imagem do gravatar de WBastosWBastos ( 2021-04-18 04:14:02 +0200 )editar

As macros acima fiz com o gravador e depois tirei as gorduras, existe esta extensão, o @Olivier 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/Fi...)

imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-18 04:20:04 +0200 )editar

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)

imagem do gravatar de JedisonJedison ( 2021-04-18 20:09:51 +0200 )editar

@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.

imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-18 23:00:03 +0200 )editar

@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?

imagem do gravatar de WBastosWBastos ( 2021-04-20 00:16:50 +0200 )editar

@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
imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-20 02:19:02 +0200 )editar

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
imagem do gravatar de WBastosWBastos ( 2021-04-20 19:11:36 +0200 )editar

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

imagem do gravatar de WBastosWBastos ( 2021-04-20 19:14:05 +0200 )editar

É 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: https://wiki.documentfoundation.org/U...

imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-20 20:05:48 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2021-04-15 22:14:22 +0200

Lidas: 40 vezes

Última atualização: Apr 18