Font Size

Profile

Menu Style

Cpanel

25Julho2017

MS Office Gurus

Onde os desenvolvedores Office se encontram

  • Criar conta
    *
    *
    *
    *
    *
    *

    Campos marcados com asterisco (*) são obrigatórios.

Você está aqui: Home Artigos Microsoft Office Word Evento “DocumentBeforePrint”: criando um controle de impressão
Mensagem
  • Kunena is not installed or the installed Kunena version is not supported. The plug-in has now been disabled. Please install/upgrade Kunena to version 1.7 for the Kunena Discuss Plug-in to function properly.

Evento “DocumentBeforePrint”: criando um controle de impressão

Neste tópico veremos como criar um evento para controlar impressão de um documento.

Suponha que você tenha um recibo o qual deve ser incrementado sempre que uma impressão é efetuada. O problema óbvio que temos é que o usuário pode cancelar a impressão. Neste caso, não bastaria apenas utilizar o evento, pois não iríamos capturar o cancelamento (o qual também faria parte do evento) para não adicionarmos 1 à contagem.

Para criar tal cenário o leitor precisará:

  • Adicionar uma pequena tabela (grande o suficiente para entrar o número);
  • Adicionar um módulo de classe e chamá-lo de clsEventos;
  • Adicionar um módulo comum (o nome não importa).

A tabela deverá ser algo como:

Como o documento provavelmente será um formulário, então o leitor deve utilizar a célula da tabela que deve conter o contador. A definição da posição onde o contador deve ser posicionado ficará por conta do leitor, mas este exemplo é suficiente para determinar tal posição.

O primeiro passo requer a inserção do código que irá iniciar a classe. Portanto, abra o VBE e ThisDocument onde o seguinte código deve ser entrado:

Option Explicit
' Dimensiona o objeto appWrd como sendo uma nova classe
' igual a clsEventos

Dim appWrd As New clsEventos

PrivateSub Document_Open()

' Seta o aplicativo para manipular o evento
Set appWrd.appWord = Application
End Sub

O próximo passo requer a inserção do módulo de classe. Adicione o módulo e lembre-se de modificar o nome para clsEventos, pois utilizamos este nome no código anterior. Note que o escopo do evento (WithEvents) é global, isto é, ele aparece fora de qualquer rotina/função e no topo do módulo de classe (explicações estão contidas no código):

OptionExplicit

' Define o evento público para o aplicativo
PublicWithEvents appWord As Word.Application

' Evento disparado antes da impressão
PrivateSub appWord_DocumentBeforePrint(ByVal Doc As Document, _
Cancel As Boolean)

' Em caso de erro ir para o manipulador de erros
On Error GoTo Err_Handler

' Chama a rotina para liberar a impressão controlada pelo
' código

Call imprimir
' Cancela o evento de impressão chamado pelo usuário. Note
' que se este evento não for cancelado haverá duas chamadas de impressão,
' pois possuímos a rotina "imprimir" que chama a impressão também.

Cancel = True

' Sai da rotina para não executar a mensagem abaixo.
Exit Sub

' Em caso de erro, executar esta mensagem e passar a descrição e número
' do erro para o usuário. Modifique para uma mensagem personalizada
' caso queira instruir o usuário a algo.

Err_Handler:
MsgBox Err.Description, vbCritical, Err.Number
End Sub

A classe em si não tem muito a fazer a não ser controlar o evento de impressão.

Agora, adicione um módulo comum onde você deverá inserir a seguinte rotina e função (explicações estão contidas no código):

Option Explicit

Sub imprimir()

' Dimensiona um tipo Boolean para controlar
' o cancelamento ou não da impressão

Dim blnImprimir As Boolean

' Dimensiona um contador
Dim cnt As Long

' Em caso de erro ir para o manipulador de erros
On Error GoTo Err_Handler

' Quando o evento é disparado e esta rotina (imprimir) é
' chamada, a caixa de diálogo de impressão é mostrada. Por este

' motivo precisamos cancelar a impressão na classe para que ela
' não seja executada duas vezes.
' Se cancelado, blnImprimir = False (não imprimir).
' Caso contrário, blnImprimir = True (imprimir).

blnImprimir = Application.Dialogs(wdDialogFilePrint).Show

' Define a situação atual do contador passando o valor
' contido na tabela para a função abaixo (valorAtual)

cnt = valorAtual(Trim(ThisDocument.Tables(1).Cell(1, 1)))
' Caso a impressão tenha ido em frente

If blnImprimir Then
' adicionar 1 ao contador (valor atural)
cnt = cnt + 1
' Limpar o conteúdo da célula da tabela que contém nosso contador
ThisDocument.Tables(1).Cell(1, 1).Range = ""

' Inserir o contador.
ThisDocument.Tables(1).Cell(1, 1).Range = cnt

Else
' Se impressão foi cancelado, limpar a célula da tabela que contém o contador
ThisDocument.Tables(1).Cell(1, 1).Range = ""

' Inserir o valor atual do contador.
ThisDocument.Tables(1).Cell(1, 1).Range = cnt

End If

' Salvar o documento
ThisDocument.Save

' Sai da rotina para não executar a mensagem abaixo.

Exit Sub

' Em caso de erro, executar esta mensagem e passar a descrição e número
' do erro para o usuário. Modifique para uma mensagem personalizada
' caso queira instruir o usuário a algo.

Err_Handler:
MsgBox Err.Description, vbCritical, Err.Number

End Sub

PrivateFunction valorAtual(ByVal valor As String) As Long
' Arrumar o valor passado para a função
valor = Trim(Left(valor, Len(valor) - 1))

' Se o comprimento for 1, então não há nada digitado na
' tabela ...

If Len(valor) = 1 Then
' e o valor inicial deve ser zero
valor = "0"
End If

' Converte a string (texto) para um valor numérico longo
valorAtual = CLng(valor)

End Function

O leitor deve notar que o botão de impressão rápida funcionará como Arquivo --> Imprimir, isto é, ao invés de enviar direto para impressão a caixa de diálogo de impressão será aberta. Isso se fez necessário para evitar que um clique no local errado gere uma contagem de impressão indevida.

O leitor pode agora testar o código para vê-lo em funcionamento.

Clique aqui para ler as partes anteriores deste curso!