Pessoal procuro sempre criar minhas macros sem utilizar o gravador de macros, porém alguns comandos simplesmente não consigo como é o caso do copiar/colar, se alguém souber se é possível utilizar os comandos copiar/colar sem o dispatcher ficaria muito agradecido.
Segue. Adapte para sua necessidade.
Sub Copiar_Colar
Dim LastRow, StartRow1 as Long
oDoc = ThisComponent
oPlanilha1 = oDoc.Sheets.GetByName("Origem")
oPlanilha2 = oDoc.Sheets.GetByName("Destino")
LastRow1 = Ultima_Linha_Origem
LastRow2 = Ultima_Linha_Destino
'Variável Copiar = Range definida para copiar as informações da Planilha1 com base na última linha preenchida.
oCopyRange = oPlanilha1.getCellRangeByPosition(0, 2, 22, LastRow1).getRangeAddress()
'Variável Colar = Cola as informações copiadas para a planilha2
oPasteRange = oPlanilha2.getCellByPosition(0, 1).getCellAddress()
'Essa linha copia e cola as informações da planilha alvo
oPlanilha2.CopyRange(oPasteRange, oCopyRange)
'Essa linha apaga as informações copiadas.
oPlanilha1.getCellRangeByPosition(0, 1, 22, LastRow1).ClearContents (7)
End Sub
Sub Ultima_Linha_Origem () as Long
oDoc = ThisComponent
oPlanilha1 = oDoc.Sheets.GetByName("Origem")
REM Procedimento para encontrar a última linha preenchida
REM Cria cursor na planilha referenciada em A1
c = oPlanilha1.CreateCursor
REM Percorre até última céluala preenchida (função ctrl + end do teclado)
c.GoToEndOfUsedArea(False)
REM Traz a posição da última célula preenchida em qualquer lugar. A posição parte: Posição 0 = linha 1, Posição 1 = Linha2
Ultima_Linha_Origem = c.RangeAddress.EndRow
End Sub
Sub Ultima_Linha_Destino () as Long
oDoc = ThisComponent
oPlanilha2 = oDoc.Sheets.GetByName("Destino")
REM Procedimento para encontrar a última linha preenchida
REM Cria cursor na planilha referenciada em A1
c = oPlanilha2.CreateCursor
REM Percorre até última céluala preenchida (função ctrl + end do teclado)
c.GoToEndOfUsedArea(False)
REM Traz a posição da última célula preenchida em qualquer lugar. A posição parte: Posição 0 = linha 1, Posição 1 = Linha2
Ultima_Linha_Destino = c.RangeAddress.EndRow
End Sub
Excelente @Conras funcionou muito bem, porém vejo que copia e cola tudo da range selecionada, existe algum método para colar apenas valores? Outra coisa vc utilizou a variável LastRow1 e 2, poderia posta a macro referente essas variáveis? Obrigado!
@JúnioVieira aditei a resposta colocando as macros para identificar a última linha das planilhas. Em relação a ele colar apenas valores, não conheço e não encontrei ainda esta opção no Calc sem utilizar o gravador. O que poderia ser feito é uma macro com LOOP (For Next / While Wend) para transferir os valores da origem para o destino. Se precisar de ajuda me envie um e-mail com dados fictícios qalquer coisa.
Vejam esta resposta. Tem um exemplo de como copiar apenas os dados de um intervalo para outro através do método (set/get)DataArray.
@Grafeno, show …ainda não tinha visto este método. Estava lendo ontem o link que o @Beto havia postado que segue a mesma sistemática. Achei muito interessante este procedimento, ele passa apenas os valores apresentados em células. Obrigado.
Obrigado mais uma vez @Conras. @Grafeno muito show esse método. @ Beto muito obrigado também pela sua dica, fico realmente muito grato à todos, a cada dia fica mais satisfatório trabalhar programação no basic.
Imagina, @JúnioVieira somente indiquei a resposta do mesmo @Grafeno, que já me ajudou várias vezes com as suas macros “mágicas”
@all: temos muitas macros bacanas nas bibliotecas do sistema. Em particular “GetLastUsedRow” que retorna o indice da ultima linha. Vejam na ajuda e também em Biblioteca TOOLS