Arrastar fórmula sem visualizar a planilha

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

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

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.

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

.

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

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/User:Schiavinatto, sigilo garantido.

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.