Pergunte aqui
1

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

perguntadas 2016-04-30 05:02:20 +0100

imagem do gravatar de Orlando

updated 2016-07-31 16:03:38 +0100

imagem do gravatar de Grafeno

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-cb...

Grato pela atenção!!

Orlando Souza

8)

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

2 Respostas

1

respondidas 2016-05-01 16:37:40 +0100

imagem do gravatar de Grafeno

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

editar assinalar como ofensivo Excluir Link mais

Comentários

\o/ Perfeito!!

Vc é o Cara!

;))) [ ]'s

imagem do gravatar de OrlandoOrlando ( 2016-05-01 17:46:37 +0100 )editar

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

imagem do gravatar de GrafenoGrafeno ( 2016-05-01 18:09:52 +0100 )editar
1

respondidas 2016-04-30 23:47:28 +0100

imagem do gravatar de Orlando

updated 2016-05-10 04:29:45 +0100

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.

editar assinalar como ofensivo Excluir Link mais

Comentários

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

:|

imagem do gravatar de OrlandoOrlando ( 2016-05-01 00:46:07 +0100 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2016-04-30 05:02:20 +0100

Lidas: 248 vezes

Última atualização: May 10 '16