Copiar/colar via macro calc sem dispatcher

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.

@JúnioVieira

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!

Veja Creio que esta macro ajude

@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” :slight_smile:

@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