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.
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.
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:
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:
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:
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()
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.
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!
Os dez artigos mais visitados
MontaRibbons v.7.0 - Assistente completo para criar ribbons no Access
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Aprenda sobre filtragens
Vídeo - Segurança máxima, usando o OPEN
Uma ajuda para quem está começando um negócio ou um projeto
Integrando o Access com Servidor MySQL - Introdução
Desabilitando a faixa(ribbon) superior do Access
Vídeo - Programação de relatórios - Parte 1
Como carregar o seu menu sem que ele vá para lista de suplementos
Adquira o kit UsandoAccess e aprenda em alta velocidade
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. |