bollywood actresses hair loss hair rehab london contact number cheap hair extensions brazilian curly hair with closure hair extension fails human hair wigs black ponytail hairstyles 2018 sunny hair extensions uk hair extensions remy hair extensions weft koko one piece hair extensions clip hair
Docmd.OpenReport Turbinado - Alteração de margens, papel, ...

Docmd.OpenReport Turbinado - Alterações das margens, papel, ...

Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito, através do Paypal. 

Veja como comprar e saiba mais sobre o material oferecido,  clicando aqui.

Open v3

 

Do Access 2002 (XP) em diante foi incorporada, no VBA, a coleção PRINTER que permite realizar várias configurações para a impressão de relatórios.  

Podemos especificar configurações para uma determinada impressora: ColorMode, Cópias, Frente e Verso, Orientação, PaperBin, Tamanho de papel e PrintQuality
Podemos especificar como o Access deve formatar a aparência dos dados em páginas impressas: MargemEsquerda, MargemDireita, MargemSuperior, BottomMargin, ColumnSpacing, RowSpacing, DataOnly, DefaultSize, ItemLayout, ItemsAcross, ItemSizeHeight e ItemSizeWidth
Podemos retornar informações do sistema sobre determinada impressora: DeviceName, DriverName e Port


Volta e meia há a necessidade de se redefinir o formato do papel (A4, Carta, Ofício, ...),  as margens,  a orientação (retrato ou paisagem) e ainda permitir que o usuário escolha a impressora a ser utilizada.  Graças à coleção PRINTER é possível personalizar as configurações para cada um dos relatórios!

Construindo uma padronização.

Para uma boa parte dos relatórios, costumo aplicar uma mesma padronização de Layout.  Exemplo:

Formato A4
Margens de 1 centímetro
Orientação retrato
Outros. 

Esses valores são armazenados em um determinado local para que sejam consultados quando a impressão ou a visualização de um relatório for solicitada.

Para armazenar os diversos tipos de valores, crio variáveis dentro da palavra chave TYPE, que tem a seguinte estrutura:

Faça o login aqui para ter acesso ao código.

Este conjunto de variáveis criadas dentro desta chave Type é passado para uma variável global (public), tornando possível o acesso em qualquer parte do projeto. 

Public setPrinter As typPrinter

A variável pública setPrinter agora é detentora de todas a variáveis criadas na chave Type.  Para acessar qualquer uma das variáveis, basta usar o ponto após o nome da variável setPrinter.  Exemplo:

setPrinter.NumeroDeCopias = 1

Observe que ao inserir o ponto, todas as variáveis são listadas.

Lista de variáveis do tipo Type

 

O próximo passo foi o de criar uma função para preencher as variáveis com os valores que determinei como padrão.

Faça o login aqui para ter acesso ao código.

Quando o aplicativo é encerrado, os valores inseridos nas variáveis, pela função acima, são perdidos. É necessário, então, carregar estes valores, sempre que iniciarmos o aplicativo. Isso é feito através da macro AutoExec, que irá executar a função fncPadraoPrinter() para alimentar as variáveis. 

Veja na figura, o comando ExecutarCódigo chamando pela função fncPadraoPrinter:

Chamando função pela macro

 

A função poderia também ser chamada através de um formulário de navegação ou de um formulário de login, ao invés da macro AutoExec.

Técnicas para alterar as configurações de um relatório:

Para alterar um relatório, via código, é preciso que este esteja carregado no modo Visualizar Impressão ou no modo Designer.  Para ter acesso ao modo Designer, selecionamos esta opção no argumento View do comando de abertura do relatório.

Docmd.OpenReport "NomeDoRelatório", acViewDesign

Esta técnica, de abrir o modo Designer pelo código, não é muito empregada, porque ele impedirá de gerar arquivos com extensão ACCDE (MDE).

Usaremos então a abertura do relatório no modo Visualizar Impressão e com a opção oculto.  Mantemos o relatório oculto até se concluir todas as modificações.

Docmd.OpenReport "NomeDoRelatório", acViewPreview ,,,acHidden 

Podemos agora alterar as configurações de impressão, com a coleção PRINTER, que está à nossa disposição. Veja a lista das propriedades, na figura abaixo:

Lista coleção Printer

Vamos supor que precisemos alterar as margens direita e esquerda:

reports("NomeRelatório").printer.LeftMargin = 2 * 567 'margem esquerda com 2cm
reports("NomeRelatório").printer.RightMargin = 1 * 567 'margem direita com 1cm

Ao terminar as alterações, basta chamar o relatório no modo Visualizar Impressão, para o usuário poder visualizar ou no modo Normal, que será enviado direto para a impressora.

Docmd.OpenReport "NomeDoRelatório", acViewPreview 'Visalizar Impressão
 
ou
 
Docmd.OpenReport "NomeDoRelatório", acViewNormal 'Imprimir direto

Usuário escolhendo a impressora:

Com a coleção PRINTER podemos listar as impressoras e assim oferecer ao usuário a opção para a escolha.

Veja o código abaixo, que preenche uma ListBox, com o nome das impressoras:

Faça o login aqui para ter acesso ao código.

Observe na figura, o resultado do carregamento da ListBox:

Lista das impressoras

 

Criado a função fncImprimir()

Com todos esses ingredientes vistos até aqui, montei uma função para ser usada toda vez que precisar imprimir um relatório.  Esta função estará substituindo o uso do comando Docmd.OpenReport diretamente.

Veja abaixo a função completa:

Faça o login aqui para ter acesso ao código.

Utilizando a função na prática

Carregando um relatório no modo Visualizar Impressão.  A função fncImprimir() aplicará os valores padronizados da função fncPadraoPrinter(),

'Usará as configurações padrão, estabelecida na função fncPadraoPrinter()
Call fncImprimir("NomeDoRelatório", acViewPreview)

Agora, vamos imaginar que eu precise alterar a orientação e as margens do papel.  Primeiro altero os valores na variável setPrinter, para depois chamar pela função fncImprimir()

Para acessar o código faça o seu cadastro de visitante aqui ou entre com o seu login aqui.

Viu como ficou fácil e rápido configurar um relatório com esta função?

Imagine que você tenha oferecido ao usuário a possibilidade da troca de impressora. Observe que o valor selecionado da ListBox é passado na função:

 'Imprimir na impressora selecionada da listbox
Call fncImprimir("NomeRealtório", acViewNormal, , , , Me!ListaImpressoras.ListIndex)

Arquivo Exemplo:

Temos alguns botões no formulário para você poder ver em ação a coleção PRINTER.  Altere os valores destes botões e veja os resultados na prática.

Formulário setPrinter

Para adaptar as funções ao seu projeto, basta copiar o módulo mod_imprimir.  Não esqueça que deverá chamar pela função fncPadraoPrinter() através da Macro AutoExec ou por um formulário que carregue na inicialização.

Altere os valores da função fncPadraoPrinter() , conforme a sua necessidade de padronização.

Download

Bom estudo!


 

 


37 comentários

Edu Cav   07/06/2023 08:08:46

Bom dia !
Tenho um sistema que gera vários relatórios de tamanhos, formas e orientações diferentes !
Como fazer tudo isto funcionar em cada um deles !
Terei de criar um botão para cada relatório ?

Bruno Gordino   02/04/2022 17:47:34

Sr. Avelino as minhas desculpas pelo comentário anterior.

A mensagem de erro pois estava a usar o exemplo sem 1º deixar correr a macro.

Coloquei o "=fncPadraoPrinter()" no "Load" do "Form" e ficou impecável.

Cumprimentos e até uma próxima.

Muito Obrigado .

Bruno Gordino   02/04/2022 16:16:29

Sr. Avelino muito obrigado por tudo o que me tem ensinado.

Estou com um problema, tenho o Office 2010 64 bits, abri uma BD em branco e importei todos os objectos deste exemplo e ao clicar a 1ª vez no "Imprimir relatório no padrão" dá o seguinte erro:
Erro:5
Invalid procedure call or argument

Isto só acontece no 1º clique pois na segunda tentativa já abre bem.

Consegue me ajudar a dar a volta a isto?

Muito Obrigado .

Wellington Buglia Soares   25/02/2022 17:26:45

Senhores, boa tarde.
segue abaixo um comando para copiar para um outro formulario esta ok, porem quando dou o duplo click não consigo ao abrir o formulario fechar o outro simultaneamente. Alguem poderia ajudar?

segue:
Private Sub Lista4_DblClick(Cancel As Integer)

DoCmd.OpenForm "FRM_AGENDA" 'ABRE FORMULARIO AGENDA
Form_FRM_AGENDA.FRM_SUB_AGENDA.SetFocus 'FOCA A TELA NO FORMULARIO SUB_AGENDA
Form_FRM_SUB_AGENDA.Recordset.AddNew ' PROCURA UMA NOVO CAMPO DE PREENCHIMENTO
Form_FRM_SUB_AGENDA.TXTCOD_CLIENTE.SetFocus ' FOCA NO CAMPO COD_CLIENTE
Form_FRM_SUB_AGENDA.TXTCOD_CLIENTE.Value = Form_FRM_PESQUISA_ANIMAL.Lista4.Column(0) ' O CAMPO DO FORM SUB-AGENDA RECEBE VALOR DO FORMULARIO PESQUISA_ANIMAL COLUNA 0
Form_FRM_SUB_AGENDA.TXTCOD_ANIMAL.Value = Form_FRM_PESQUISA_ANIMAL.Lista4.Column(1) ' O CAMPO DO FORM SUB-AGENDA RECEBE VALOR DO FORMULARIO PESQUISA_ANIMAL COLUNA 1
'================
Form_FRM_SUB_AGENDA.TXTANIMAL = DLookup("ANIMAL", "TAB_CAD_ANIMAL", "COD_ANIMAL=" & Form_FRM_SUB_AGENDA.COD_ANIMAL)
Form_FRM_SUB_AGENDA.TXTRAÇA = DLookup("RAÇA", "TAB_CAD_ANIMAL", "COD_ANIMAL=" & Form_FRM_SUB_AGENDA.COD_ANIMAL)
Form_FRM_SUB_AGENDA.TXTESPECIE = DLookup("ESPECIE", "TAB_CAD_ANIMAL", "COD_ANIMAL=" & Form_FRM_SUB_AGENDA.COD_ANIMAL)
Form_FRM_SUB_AGENDA.TXTCONVENIO = DLookup("CONVENIO", "TAB_CAD_ANIMAL", "COD_ANIMAL=" & Form_FRM_SUB_AGENDA.COD_ANIMAL)
'================
Form_FRM_SUB_AGENDA.TXTCLIENTE = DLookup("CLIENTE", "TAB_CAD_CLIENTE", "COD_CLIENTE=" & Form_FRM_SUB_AGENDA.COD_CLIENTE)
Form_FRM_SUB_AGENDA.TXTTELEFONE = DLookup("TELEFONE", "TAB_CAD_CLIENTE", "COD_CLIENTE=" & Form_FRM_SUB_AGENDA.COD_CLIENTE)
Form_FRM_SUB_AGENDA.TXTCELULAR = DLookup("CELULAR", "TAB_CAD_CLIENTE", "COD_CLIENTE=" & Form_FRM_SUB_AGENDA.COD_CLIENTE)
Form_FRM_SUB_AGENDA.TXTCELULAR1 = DLookup("CELULAR1", "TAB_CAD_CLIENTE", "COD_CLIENTE=" & Form_FRM_SUB_AGENDA.COD_CLIENTE)
DoCmd.Close acForm, Form_FRM_PESQUISA_ANIMAL

Marcelo Arruda   19/12/2021 19:09:21

Olá Avelino,

Não pude deixar de ler todos estes posts, mas assim mesmo fiquei com uma dúvida, pois quando abro um relatório, às vezes o mesmo perde as configurações de páginas, me refiro às margens esquerda, direita, superior e inferior, porém com este seu post vejo uma saída, pois independente de ter ou estar configurado, eu posso via vba forçar as margens do relatórios, porém não estou conseguindo fazer isso com o seu exemplo, por favor me ajude se puder, pois no meu caso eu utilizo o seguinte comando para abrir o relatório com um argumento:

stDocName = "RltCertificado2013"
DoCmd.OpenReport stDocName, acViewPreview, , , , strdtpersonalcertif

mas onde coloco as informações certas e em que instância da abertura do mesmo para que consiga sucesso.

Grato.

Hugo   24/09/2021 06:52:58

Eu uso esse código só para fazer uma impressão rapida dos equipamentos

If MsgBox("Impressão da Ficha?", vbOKCancel + vbQuestion, "Confirmação") = vbOK Then
DoCmd.PrintOut acSelection
End If

O meu problema é que a tabela tem muitos campos e na impressão tem que sai duas folhas para acabar de mostrar os resto dos campos, portante eu queria mudar a folha de vertical para horizontal é possível?

Hugo   24/09/2021 06:41:33

Boas,

Não dá para configurar a folha para horizontal em código?

Cleber   19/09/2021 10:45:57

Olá Prof.,

Estou tentando imprimir cheques em uma impressora a laser, tamanho, 7,5 cm x 17,5 cm. A impressora aceita formato personalizado.

Obrigado!

Avelino Sampaio   18/09/2021 07:18:09

Cleber,

qual formato de papel está usando ? Verifique se a impressora aceita formato de papel definido pelo usuário.

Sucesso!

cleber   17/09/2021 11:07:21

Olá Prof. Avelino,
Obrigado. Sempre me surpreende com suas dicas!
No seu exemplo, incluí as linhas a seguir:
.LarguraPapel = 7.5
.AlturaPapel = 17.5
Porém, o papel não fica formatado nessas medidas que inclui. Onde será que estou errando?
Grato!

MARCIO MELO - RJ   15/08/2021 15:59:51

Adorei mais esse artigo, como sempre super empolgante, conforme o colega acima, vou tentar aplicar a função de imprimir em frente e verso numa impressora nova que chegou no meu trabalho com esse poder de virar a folha, imagino criar um campo onde eu marcar significa que quero a impressao automatizada dos relatórios que tenho de imprimir um e depois o outro no verso, se tiver uma dica... são dois relatórios distintos, imagino que antes de imprimir tenho de selecionar a impressora, preparar informando que qro impressão frente e verso e ai disparar uma impressão depois a outra... vou fzer uns testes... kkk...

Sou mais Brasil!

Parabéns, Forte abraço! mestre Avelino

Nelson Braga   26/06/2021 10:09:16

Amigo,
Você é FANTÁSTICO.
O quanto eu ja tinha batido cabeça pra encontrar esses comandos.

Muito obrigado mesmo!!!

Sidney Brito   03/06/2021 22:26:24

Prezado Avelino,

Estou necessitando configurar um relatório para imprimir frente e verso e gostaria de saber como faço para aplicar margens espelho (a exemplo do que é possível no Word).
Forte abraço!

MARCIO MELO - RJ   16/05/2021 14:52:13

Olá, Avelino
Uma abordagem para acrescentar mais funcionalidade, no meu trabalho tem uma impressora nova da Lexmark modelo X656de que tem a capacidade de imprimir frente e verso sem precisar virar a folha manualmente, tenho relatório independente que precisar se impresso frente e verso tem como concatenar esses relatórios via código para utilizar a função, pois na prática relatórios de duas folhas num mesmo documento usando a propriendade da impressora consigo realizar esse tipo de impressão, porém em relatórios de 1 pagina e um outro também com uma página tenho de fazer esse processo manualmente.

Sou mais Brasil!

Forte abraço.

Thel   29/04/2021 09:55:42

Distraído digitei errado uma linha de comando:

Onde se lê:

DoCmd.PrintOut acPages, CurrentRecord, CurrentRecord, 1, Copias

Lê-se:

DoCmd.PrintOut acPages, CurrentRecord, CurrentRecord, 1

Obrigado!

Thel   28/04/2021 20:40:53

Prezados amigos,

Resolvi o meu problema e posto aqui a solução para ajudar outras pessoas:

1 - No evento AO CLICAR do botão IMPRIMIR digite este código:

Private Sub BotaoImprimir_Click()

' Prepara a impressão para LAYOUT PAISAGEM:
Forms("SeuFormulário").Printer.Orientation = acPRORLandscape

' Prepara a impressão para TIPO DE PAPEL A4:
Forms("SeuFormulário").Printer.PaperSize = acPRPSA4

' Manda imprimir somente o registro que está sendo visualizado no formulário:
DoCmd.PrintOut acPages, CurrentRecord, CurrentRecord, 1, Copias

' Macro criada para voltar ao formulário de consulta após a impressão,
' senão a tela de visualização do formulário fica escondida após a impressão e
' não aparece novamente.
DoCmd.RunMacro "EncerraImpressao"
End Sub


2 - Crie uma macro e salve com o nome EncerraImpressao com as seguintes linhas:

Ação Fechar; tipo de objeto Formulário, nome do objeto SeuFormulário; salvar não.

Ação AbrirFormulário; nome do Formulário SeuFormulárioPrincipal (deve ser diferente do formulário que está com o botão IMPRIMIR); Exibir formulário.

Créditos:
Avelino (Site Usando Access)
Natopb (Fórum Script Brasil)
Schoen (Fórum Comunidade ITLAB)
Fórum Máximo Access

Obrigado!

Thel   27/04/2021 12:59:28

Avelino,

Funcionou perfeitamente!
Agora eu queria que o form e o registro que está aparecendo no form fosse impresso através da caixa de impressora (para escolher a impressora) sem precisar visualizar o form antes ou então que o form e o registro que está aparecendo fosse impresso diretamente para a impressora padrão. Há como?

Abraços.

Avelino Sampaio   27/04/2021 06:51:20

Thel,

experimente a sequencia de código para o seu botão:

docmd.OpenForm "NomeFormulário",acPreview
forms("NomeFormulário").Printer.Orientation =acPRORLandscape
forms("NomeFormulário").Printer.PaperSize =acPRPSA4

Sucesso!

Thel   26/04/2021 19:29:03

Avelino,

Você tem algum código VBA que ao clicar no botão imprimir de um formulário seja impresso diretamente para a impressora, na orientação PAISAGEM, papel A4, aquele registro visualizado no formulário?

Abraços.

Roni   31/03/2021 09:17:11

Avelino,

Muito obrigado pela dica!

Vou adaptar ao meu projeto. Mais uma vez, parabéns pelo excelente exemplo.

Muito mais sucesso pra você!

Avelino Sampaio   30/03/2021 16:43:36

Roni,

a função fornecida neste artigo, atende perfeitamente este seu caso. Imagine então que vc tenha no seu formulário os campos para o usuário definir as margens direita e esquerda. basta então montar o código da seguinte forma:

With setPrinter
.MargemDireita = me!CampoMargemDireita
.margemEsquerda = me!CampoMargemEsquerda
End With

Call fncImprimir("NomeDoRelatório", acViewPreview)

Sucesso!

Avelino Sampaio   30/03/2021 16:37:06

Alex,

vou te passar um email de um colega seu de profissão, que fez um programa fantático de controle de inquéritos. Quem sabe ele te forneça o aplicativo ou te forneça dicas de construção.

Sucesso!

Avelino Sampaio   30/03/2021 16:33:53

Marcelo e Norberto,

fico muito grato pelos comentários!

Sucesso!

Roni   30/03/2021 16:18:17

Avelino,

Me desculpe a falta de conhecimento, mas, como o usuário final definiria as configurações que deseja para imprimir o relatório. Por exemplo: Margem Esquerda = 2,5 cm; Margem Direita = 2,5 cm; Orientação = Retrato e etc...?

Ou não é essa a finalidade do código?

De qualquer forma fiquei muito empolgado com mas esse excelente exemplo.

Parabéns por mais esta grande obra!

Alex Gondim Lima   30/03/2021 12:59:23

Mestre Avelino fiz um banco utilizando o maestro no que tange cadastro de ocorrencia policial, como sou oficial de policia vai quebrar um galho aqui no interior da bahia, mas ta com muitos defeitos queria saber quanto vc cobra para otimizar o banco de dados e como envia-lo para vc dá uma olhadinha.

Norberto Rost   30/03/2021 12:02:32

Avelino, tu não vais acreditar:
Ontem eu estava estudando esta coleção no vba para um trabalho, e tive a ideia de criar um exemplo para o fórum Maximo.
Então pensei: vou sugerir pro Avelino criar um exemplo para o site dele, e agora de manhã vejo a tua newsletter no meu email. Que coincidência!
Quanto ao tutorial, dispensa comentários, sendo da tua autoria.
Abraço!

Marcelo David   30/03/2021 09:57:47

Quanta possibilidade de programação o Access tem! Ainda mais quando o VBA está em mãos tão profissionais quanto as do Avelino. Parabéns!!

Avelino Sampaio   30/03/2021 08:09:29

Carlos,

copie e cole no seu navegador o endereço abaixo e garimpe o desejado:

http://comunidade.itlab.com.br/eve/forums?a=search&reqWords=margens+Access+2000

Sucesso!

Carlos   28/03/2021 19:22:41

Boa noite
Voce tem este exemplo em access 2000

Avelino Sampaio   24/03/2021 06:19:04

Itamar,

essas impressoras vem com uma Dll própria. Vc não tem o manual desta ?

Bom, copie e cole o endereço abaixo no seu navegador e dê uma garimpada:

http://comunidade.itlab.com.br/eve/forums?a=search&reqWords=Bematech

Bom estudo!

Itamar Jorge da Silva   23/03/2021 13:31:35

Como faço para imprimir no papel 80x30 bobina impressora Bematech MP4200TH?

Avelino Sampaio   10/02/2021 10:38:46

Wagner

meu office é 2013 de 32 bits e fiz alguns ensaios com sendObjetct e não tive problemas.
O Office 2013 veio com alguns Erros que são corrijidos com atualizações oferecidas. Vá na guia ARQUIVO do Access e clique em CONTA. Do lado direito, clique no botão "Opções de atualizações" clique em "Habilitar atualizações". Se não der resultado, baixe e instale esta atualização:

http://support.microsoft.com/kb/2767861

Essa atualização acima ajusta o erro de funcionamento com a extensão ACCDR. Pode ser que traga acertos para outros itens.

No aguardo

wagnergilson@hotmail.com   10/02/2021 10:17:22

Avelinoi, abre o outlook com o relatório anexado, com o assunto e para quem estou enviando. Quando clico em enviar no outlook não dá nenhuma mensagem mas não envia. Quando gero novamente ele abre o outlook e ao clicar em enviar dá a mensagem "o microsoft parou de funcionar". uso 64 bits e office 2013.

Avelino Sampaio   10/02/2021 09:43:20

Wagner

Ao abrir o PDF anexo, está de acordo com o relatório ?
Qual é versão do seu Access ? 32 ou 64 bits ? Está atualizado com o pacote SP?
Para teste, experimente outro relatório simples e envie para o seu proprio email. Aguardo pelas respostas acima e por esse teste.

wagnergilson@hotmail.com   10/02/2021 08:30:34

Bom dia meninos.
Tô tentando há vários dias enviar um relatório do access para um email e não dá certo. Uso o comando docmd, mas não tô conseguindo. Como devo proceder? Estou usando o comando: DoCmd.SendObject acSendReport, "comunicação interna teste", "pdf", "dtfiscalizacao@der.mg.gov.br", "dtfiscalizacao@der.mg.gov.br", , "Registro de ocorrência", "Segue o registro solicitado"
Abre o outlook e ao clicar em enviar, dá a mensagem de " o microsoft access parou de funcionar" e encerra a aplicação.

Avelino Sampaio   06/02/2021 11:38:10

Regis,

Se ele está duplicando o valor ao imprimir, vc tem que zerar as variáveis no evento "ao imprimir" do RODAPE. Exemplo: Se tiver uma variável de nome SomaDespesas

somaDespesas = 0

Aguardo

Regis da Silva   06/02/2021 11:25:46

Avelino dá pra definir a impressora com o relatório fechado? Ou seja, antes de abrir o relatório? Porque o meu relatório calcula os valores via vba (dum outro post seu), mas se eu abrir 2 vezes o relatório ele duplica todos os valores.


Envie seu comentário: