Uma rotina que copie, cole, imprima e feche sem salvar

Olá, pessoal!

Pesquisei, digitando na busca aqui: “copiar”, “colar”,”imprimir” e “fechar”, não obtendo qualquer resultado do que preciso.

Estou procurando uma rotina “enxuta” para incluir no Basic da planilha Calc, que copie os textos (sem formatação) da coluna A2:A18 na tabela e cole na coluna B2:B18 da mesma tabela, enviando o resultado para impressão; e em seguida, fechando a planilha sem salvar a alteração. Tudo em um só procedimento ou rotina no editor do Basic.

Eu até poderia tentar essas rotinas, utilizando a ferramenta Macro. Porém, a gravação por esse recurso deixa o código muito longo, dificultando a adaptação dele numa possível alteração da tabela, como o aumento de linhas ou mudança de posição das colunas.

Anexei a esta pergunta uma imagem da tabela modelo e links de acesso abaixo, para facilitar o seu entendimento.

Mudando de bairro

https://www.sendspace.com/file/zfq72k

http://www.4shared.com/file/zOQflM-cba/Mudando_de_bairro.html

Grato pela atenção!!

Orlando Souza

Graças à resposta de outra pergunta no meu perfil, cheguei à rotina abaixo:

sub Copia_Cola_Imprime_Fecha
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$'Plan1'.$A$2:$A18"

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

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

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$'Plan1'.$B$2:$B$18"

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

rem ----------------------------------------------------------------------
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "S"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 6

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

'Trava a planilha para impressão
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())

'Fecha o arquivo sem salvar
dispatcher.executeDispatch(document, ".uno:CloseDoc", "", 0, args1())


end sub

Até que não ficou tão longa, assim. Sendo possível realizar a adaptação necessária numa possível alteração da tabela.

Só não encontrei o comando “uno:” para fechar a planilha sem confirmação, após eu solicitar a impressão.

No lugar de “CloseDoc”, poderia ser outro comando que funcionasse igual a tecla do teclado “Delete”, sem mostrar o diálogo “Excluir conteúdo”.

:expressionless:

Olá,

Um caminho mais curto é usar a API UNO pura ao invés do gravador de macro ou o dispatcher. O problema com esse último é que não está bem documentado. Fica difícil achar quais os argumentos certos usar para cada chamada “uno:qualquer-coisa”.

Na rotina abaixo, copia-se os dados de um intervalo para o outro através dos métodos (set/get)DataArray. Em seguida, imprime o documento pela configuração padrão (página, impressora, etc.). Mas, antes de fechar o programa, espera 3 segundos (wait 3000) para evitar que a impressão dê erro.

Sub CopiarColarImprimirFechar
Dim oDoc As Object, oPlan As Object
Dim oIntervalo1 As Object, oIntervalo2 As Object
	
	' Inciar os objetos
	oDoc = ThisComponent
	oPlan = oDoc.Sheets.getByName( "Plan1" )
	oIntervalo1 = oPlan.getCellRangeByName( "A2:A18" )
	oIntervalo2 = oPlan.getCellRangeByName( "B2:B18" )
	
	' Copiar os dados (sem formato)
	oIntervalo2.setDataArray( oIntervalo1.getDataArray )
	
	' Imprimir
	oDoc.Print( Array() )
	
	' Fechar sem salvar
	Wait 3000
	oDoc.Close(False)
End Sub

Atte,
Grafeno

\o/ Perfeito!!

Vc é o Cara!

;))) [ ]'s

É um prazer ajudar… além do que, a cada tópico aprendemos mais…