Pergunte aqui
0

Arrastar fórmula sem visualizar a planilha.

perguntadas 2019-10-17 12:50:02 +0200

imagem do gravatar de Marcelo Caldas

updated 2019-10-17 15:26:47 +0200

imagem do gravatar de Schiavinatto

Bom dia. Tenho uma planilha que faz um monte de coisas aqui. Estou tentando deixar ela mais agradavel ao usuário.Não quero que ela fique pulando de planilhas em planilha e executando os cálculos na frente de todos.

Eu tenho essa rotina

Sub CopiarFormula (xCel As String, xRange As String)
  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dim Copia(0) as new com.sun.star.beans.PropertyValue
  Copia(0).Name = "ToPoint"
  Copia(0).Value = xCel
  dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, Copia())
  dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
  dim Cola1(0) as new com.sun.star.beans.PropertyValue
  Cola1(0).Name = "ToPoint"
  Cola1(0).Value = xRange
  dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, Cola1())
  dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
End Sub

onde xCel é a célula com a fórmula e xRange é onde quero que ele a cole.

Gostaria de chamar a rotina da seguinte forma:

Sub CopiarFormulaI (xPlan As String, xCel As String, xRange As String)

onde xPlan seria a planilha em que ele faria isso, dessa forma, não precisaria ter essa planilha ativa no momento da execução da rotina.

Obrigado

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

1 Resposta

0

respondidas 2019-10-17 16:26:40 +0200

imagem do gravatar de Schiavinatto

updated 2019-10-18 20:43:30 +0200

@Marcelo Caldas, uma sugestão

Por exemplo a formula esta na PlanilhaXX na célula V4 e a colagem é na PlanilhaRR na area C2:V2

A chamada seria assim

Sub CopyFormula
Call CopiarFormula "PlanilhaXX.V4", "PlanilhaRR.C2:V2"
End Sub

Pode ser também com áreas nomeadas:

  • PlanilhaXX.V4 = FONTE
  • PlanilhaRR.C2:V2 = RECEPTOR

Então a chamada seria assim

Sub CopyFormula
Call CopiarFormula "FONTE", "RECEPTOR"
End Sub

Complemento

A formula esta na célula A1 de Origens, e a macro (esta em Standard / Module1 / Main) é acionada no menu [ Automação ].

A macro foi feita com o gravador e retirado algumas gorduras.

A coluna F do calculo na planilha RECEBIDOS não é necessário.

sub Main
'Esta macro é acionada pelo menu [ Automação ] Carregar Origens
rem ----------------------------------------------------------------------
dim doc, disp as object
doc   = ThisComponent.CurrentController.Frame
disp = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim limpar(0) as new com.sun.star.beans.PropertyValue
limpar(0).Name = "ToPoint"
limpar(0).Value = "FORMULAA"
disp.executeDispatch(doc, ".uno:GoToCell", "", 0, limpar())
disp.executeDispatch(doc, ".uno:GoDown", "", 0, Array())
disp.executeDispatch(doc, ".uno:GoDownToEndOfDataSel", "", 0, Array())
disp.executeDispatch(doc, ".uno:ClearContents", "", 0, Array())
'-------------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint" : args1(0).Value = "FORMULAA"
disp.executeDispatch(doc, ".uno:GoToCell", "", 0, args1())
disp.executeDispatch(doc, ".uno:Copy", "", 0, Array())
rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint" : args4(0).Value = "$Origens.$A$2:$A$200" 'altere aqui a linha Máxima 200.
disp.executeDispatch(doc, ".uno:GoToCell", "", 0, args4())
rem ----------------------------------------------------------------------
dim args5(5) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Flags" : args5(0).Value = "F"
args5(1).Name = "FormulaCommand" : args5(1).Value = 0
args5(2).Name = "SkipEmptyCells" : args5(2).Value = false
args5(3).Name = "Transpose" : args5(3).Value = false
args5(4).Name = "AsLink" : args5(4).Value = false
args5(5).Name = "MoveMode" : args5(5).Value = 4
disp.executeDispatch(doc, ".uno:InsertContents", "", 0, args5())
disp.executeDispatch(doc, ".uno:Copy", "", 0, Array())
rem ----------------------------------------------------------------------
dim args7(5) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Flags" : args7(0).Value = "S"
args7(1).Name = "FormulaCommand" : args7(1).Value = 0
args7(2).Name = "SkipEmptyCells" : args7(2).Value = false
args7(3).Name = "Transpose" : args7(3).Value = false
args7(4).Name = "AsLink" : args7(4).Value = false
args7(5).Name = "MoveMode" : args7(5).Value = 4
disp.executeDispatch(doc, ".uno:InsertContents", "", 0, args7())
rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "ToPoint" : args8(0).Value = "$A$2"
disp.executeDispatch(doc, ".uno:GoToCell", "", 0, args8())
end sub

-----------------------------------------------------------------------------

ATENÇÂO:: Para dar mais detalhes a sua pergunta, use Descrição da imagem na pergunta ou Descrição da imagem abaixo. Grato.

Caso a resposta atendeu sua necessidade, por gentileza, click na bolinha Descrição da imagem a esquerda da resposta, para finalizar a pergunta.

editar assinalar como ofensivo Excluir Link mais

Comentários

Obrigado pela Sugestão Gilberto. A forma que vc usou me deu umas ideias pra melhorar algumas macros minhas. Mas neste caso o que eu quero é o seguinte:

Eu tenho uma planilha que chama "Origem", nela tem um botão que chama a macro. eu quero executar essas tarefas sem que a macro selecione a "PlanilhaXX" ou a PlanilhaRR, ou seja, o usuário não verá a macro trabalhando.

Penso apenas em colocar um célula na planilha origem informando o seu progresso.

Então, ela deve copiar a Fórmula de "PlanilhaXX.V4" e colar em "PlanilhaRR.C2:V2" sem mudar de planilha.

Sei que no excel ha um comando para que a macro não fique atualizando a tela (o que tb me ajudaria), mas não conheço comando similar no calc.

imagem do gravatar de Marcelo CaldasMarcelo Caldas ( 2019-10-17 16:45:09 +0200 )editar

Da planilha Origem aciona o botão Ok

Sua macro copia da Origem e vai para a Outra e cola,

Faça voltar para Origem, acrescente antes do End Sub

 dim Volta(0) as new com.sun.star.beans.PropertyValue
  Volta(0).Name = "ToPoint"
  Volta(0).Value = xCel
  dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, Volta())

.

imagem do gravatar de SchiavinattoSchiavinatto ( 2019-10-17 17:39:47 +0200 )editar

Mas a macro ainda continuaria indo e voltando nas planilhas. o que eu quero fazer é que a pessoa clique no botão de execução da macro e a macro seja toda executada sem que saia da planilha origem.

Assim como no exemplo abaixo, declaro os parametros e ele executa, intendente de qual planilha está ativa no momento.

Sub copiarValorI1  ( Xplan1 As String, xCel As String, Xplan2 As String, xRange As String)

    oCopyCell = ThisComponent.Sheets.GetByIndex(Xplan1).GetCellRangeByName(xCel)
    oPasteCell = ThisComponent.Sheets.GetByIndex(Xplan2).GetCellRangeByName(xRange)
    oPasteCell.DataArray = oCopyCell.DataArray

End Sub
imagem do gravatar de Marcelo CaldasMarcelo Caldas ( 2019-10-18 12:14:12 +0200 )editar

Meu teste não muda de planilha.

Sua planilha e muito grande ?

Poste um modelo da sua planilha, altere dados sigilosos, ficará mais fácil ajudar em uma solução.

Caso não queira expor a planilha publicamente, pode enviar direto, veja aqui: https://wiki.documentfoundation.org/U..., sigilo garantido.

imagem do gravatar de SchiavinattoSchiavinatto ( 2019-10-18 14:09:37 +0200 )editar

Vou te mandar por email então, não sei como faz pra disponibilizar aqui. criei uma simplesinha so com as funções necessárias, fica mais facil pra vc ver. obrigado demais Gilberto.

imagem do gravatar de Marcelo CaldasMarcelo Caldas ( 2019-10-18 17:57:34 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2019-10-17 12:50:02 +0200

Lidas: 41 vezes

Última atualização: Oct 18 '19