Macro grava sempre os mesmos dados

Olá pessoal!

Gravei uma macro em uma planilha de libreofficecalc, que é disparada por um botão. A macro copia um intervalo (B3:N12 e I3:N12) de uma planilha, e cola especial em outra planilha (no mesmo arquivo). Sempre que eu clico no botão, os dados são novamente copiados, e colados a partir da última linha (assim fica registrada todas as vezes que o botão é clicado). Porém, se altero os dados do intervalo original, ao clicar novamente no botão, os dados colados são sempre os mesmos.

Fiz alguns testes. Primeiro apaguei todas outras macros da planilha. Depois reduzi o intervalo para B3:N12 (sem intervalos espaçados). Segue o mesmo problema.

Uma das células copiadas tem texto tipo ="Nonono "&$C$4 . Alterei esse parâmetro, mas também não tenho sucesso. As outras células tem condições “se”, e outras funções.

Não tenho conhecimento em programação via API… por isso peço ajuda aos amigos. Obrigado!

sub expositor
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$B$8:$N$12"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Nr"
args3(0).Value = 2

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args3())

dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint"
args4(0).Value = "$J$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())

dim args5(1) as new com.sun.star.beans.PropertyValue
args5(0).Name = "By"
args5(0).Value = 1
args5(1).Name = "Sel"
args5(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoDownToEndOfData", "", 0, args5())

dim args6(1) as new com.sun.star.beans.PropertyValue
args6(0).Name = "By"
args6(0).Value = 1
args6(1).Name = "Sel"
args6(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args6())

dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

end sub`

Ola @Agerber, seja bem vindo ao Grupo.

Em args1(0).Value = "$B$8:$N$12" de onde copia coloque o nome da planilha também

exemplo: args1(0).Value = "$Planilha1.$B$8:$N$12"

Tirando a “gordura”, e troquei o colar por colar valores, a macro pode ficar assim:

sub expositor

dim document, dispatcher as object

document = ThisComponent.CurrentController.Frame

dispatcher = createUnoService(“com.sun.star.frame.DispatchHelper”)

dim args2(0) as new com.sun.star.beans.PropertyValue

args2(0).Name = “ToPoint”

args2(0).Value = “$Plan1.$B$8:$N$12” '<==== acerte aqui.

dispatcher.executeDispatch(document, “.uno:GoToCell”, “”, 0, args2())

dispatcher.executeDispatch(document, “.uno:Copy”, “”, 0, Array())

dim args4(0) as new com.sun.star.beans.PropertyValue

args4(0).Name = “ToPoint”

args4(0).Value = “$Plan2.$J$1” '<==== acerte aqui.

dispatcher.executeDispatch(document, “.uno:GoToCell”, “”, 0, args4())

dispatcher.executeDispatch(document, “.uno:GoDownToEndOfData”, “”, 0, Array())

dispatcher.executeDispatch(document, “.uno:GoDown”, “”, 0, Array())

’ colar: Texto, Número, Data, Hora, Formato.

dim args1(5) as new com.sun.star.beans.PropertyValue

args1(0).Name = “Flags”

args1(0).Value = “SVDT”

args1(1).Name = “FormulaCommand”

args1(1).Value = 0

args1(2).Name = “SkipEmptyCells”

args1(2).Value = false

args1(3).Name = “Transpose”

args1(3).Value = false

args1(4).Name = “AsLink”

args1(4).Value = false

args1(5).Name = “MoveMode”

args1(5).Value = 4

dispatcher.executeDispatch(document, “.uno:InsertContents”, “”, 0, args1())

end sub


ATENÇÂO:: Caso queira 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.

@Agerber, comentou,

Obrigado Gilberto Schiavinatto !

Parece que sigo com o mesmo problema. Quando atualizo os dados da planilha de origem, a macro segue colando os dados da primeira cópia. Mesmo sem usar o artifício de colar especial. Seria uma limitação da macro gravada? Lembrando que meu intervalo copiado contém fórmulas, lista de valores e fórmulas com textos.

Outra pergunta: em args1(0).Value = "$Planilha1.$B$8:$N$12", posso substituir $Planilha1 pelo nome que dei à minha planilha? Já tive outras experiências em que alterei a ordem das abas, e a macro seguia pegando os dados conforme a ordenação original…

@Agerber, como refiz sua macro, cometi erro, veja a alteração.

Agora só cola valores, formulas não.

O nome da Plan1 e Plan2 deve substituir pela suas.


ATENÇÂO:: Não use Adicionar resposta para comentário, caso queira dar mais detalhes a sua pergunta, use Descrição da imagem na pergunta ou Descrição da imagem abaixo. Grato.

Obrigado Gilberto pelas dicas! Percebi o seguinte:

Sempre que executo a macro diretamente pelo Libreoffice Basic, tudo funciona perfeitamente. Obrigado pela ajuda.

Porém, quando utilizo meu botão dentro da planilha que aparecem os problemas. Posso ter configurado o botão de maneira errada? Existe algum cuidado para isso? Estou utilizando o evento “aprovar ação”.

Já tive diversos problemas com botão, Ultimamente estou usando figuras ( pode ser uma imagem/foto ou desenho geométrico ), clique direito, Atribuir macro…

Obrigado!!!

Gilberto,

Sobre o botão, parece que cheguei em um acerto. Segui seu conselho, sobre usar figuras no lugar de botões. Percebi que ao selecionar a macro para a figura, existe somente a opção de evento “Botão do Mouse Pressionado”.

Voltei para os botões, onde existem diversos eventos possíveis… então escolhi o mesmo evento utilizado em figuras: “Botão do Mouse pressionado”. Assim, as macros com botão parecem funcionar perfeitamente.

Mais uma vez obrigado pela ajuda!