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

1 Like

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

2 Likes

\o/ Perfeito!!

Vc é o Cara!

;))) [ ]'s

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

Bom dia,

Diz uma coisa, como você faria para copiar e colar um intervalo com linhas ocultas. Na documentação o setDataArray pega tudo (o que está oculto e o que não está). No meu caso, eu filtro os dados de uma planilha e quero copiar apenas as linhas visíveis. Acontece que quando itero essas linhas para colocar no array, sempre registra apenas o último índice, ou seja, lê a primeira linha, coloca no array, quando lê a segunda, apaga o que tinha antes e fica registrado os dados da última iteração (2a linha).
Obrigado pela atenção.

Olá @Grafeno,
Alguma dica de onde aprender mais sobre o Basic do Libreoffice?
Pois a mais “literaturas” disponíveis para o Excel do que para o Libreoffice, encontrei um manual que é compartilhado do OpenOffice, este ainda em fase de tradução.
O Vba do Excel é mais intuitivo de aprender, mas pelas observâncias muda um pouco a forma de linguagem e capacidade do Basic, o que deixa mais difícil o aprendizado.

Ola @Squarcini , de uma olhada aqui…

Obrigado!
De fato a muito conteúdo sim, ainda muitos em inglês (não tenho inglês).
Achei interessante o Debugpoint que da para traduzir o site e o curso do canal no youtube Aprendendo com videos. (ainda preciso estuda-los)
Ainda tenho muito a aprender, aqui na empresa tenho um formulário feito no Acess, um sistema muito bem feito…consegui desenvolver o banco de dados no BASE e criar o formulário, porém o mesmo não tinha exatamente a cara de sistema, fiquei na duvida se deveria criar as caixas de Dialago no Base ou no Calc e se de fato seria possível mesmo criar um sistema igual aqui do Acess.
Pelo que compreendi teria que usar bastante a linguagem do Basic ao qual ainda não tenho grande dominância.

Pesquisei aqui na plataforma do fórum para criar um novo tópico…acredito que meu assunto esteja se distanciando do tema central. Até então não encontrei o recurso para transformar meu comentário em tópico.

Ola @Squarcini, quando entra na pagina inicial…

Português do Brasil - Ask LibreOffice

No topo a direita, tem o botão [Novo tópico].