none
Problema ao tentar imprimir planilha do excel via vba RRS feed

  • Pergunta

  • Estou gerando uma planilha do excell com vba, 100%! 

    Mas quando peço um print preview, meu programa congela, e depois de um tempo, recebo a seguinte mensagem :

    Meu código é :

    Dim app As Excel.Application
        Dim Book As Excel.Workbook
        Dim Sheet As Worksheet
    
       'Carregar o Excel:
       Set app = CreateObject("Excel.Application")
       'Crie um WorkBook:
       Set Book = app.Workbooks.Add
    
       'Defina a planilha ativa p/ facilitar o trabalho:
       Set Sheet = app.ActiveWorkbook.ActiveSheet
        
      
       With Sheet
        (...)
    
    'Primeiro testei este método
            .PrintPreview True
    'Então testei o que se segue abaixo, claro, separadamente.
    'em ambos os casos, acontece o mesmo.
            .Select
            ActiveSheet.PrintPreview
    
       End With


    obs.: estou trabalhando com Office 2003

    Gostaria de contar com a colaboração de vocês. Sugestões?

    • Editado InfoProfi domingo, 17 de junho de 2012 00:07
    domingo, 17 de junho de 2012 00:01

Respostas

  • Estou supondo que você não está executando o código a partir do Excel.

    Algumas observações:

    Com esse código, você está sendo criando uma nova instância do Excel, independente se já existe uma aberta ou não. Sugiro que você use o método GetObject para verificar se existe uma instância já aberta e, caso não exista, criar uma nova. Um exemplo disso seria:

    Sub Exemplo()
        Dim appExcel As Object 'Excel.Application
        Dim wb As Object 'Excel.Workbook
        Dim ws As Object 'Excel.Worksheet
        
        On Error Resume Next
        Set appExcel = GetObject(, "Excel.Application")
        On Error GoTo 0
        If appExcel Is Nothing Then
            Set appExcel = CreateObject("Excel.Application")
        End If
        appExcel.Visible = True
        
        Set wb = appExcel.Workbooks.Add
        Set ws = wb.Sheets(1)
        
        'Povoa pelo menos uma célula para o modo de Visualizar Página funcionar:
        ws.Range("A1") = "Benzadeus!"
        
        'Põe foco no Excel, caso contrário, o código gera uma latência grande:
        AppActivate appExcel.Name
        
        'Mostra o modo de Visualizar Página:
        ws.PrintPreview
        
    End Sub

    Para saber mais sobre boas práticas de instanciação de Aplicações, sugiro que leia: http://www.ambienteoffice.com.br/officevba/boas_praticas_para_instanciacao_de_aplicacoes/

    Sobre o resto do código, você deve ter pelo menos alguma célula preenchido (ou AutoForma, Gráfico, etc.) para que o modo de Visualizar Página funcione. Além disso, é importante colocar o foco na Aplicação do Excel.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta InfoProfi segunda-feira, 18 de junho de 2012 11:27
    domingo, 17 de junho de 2012 21:49
    Moderador
  • Extrapolando um pouco sua pergunta, imagino que seu objetivo final seja imprimir a Planilha. Para fazer isso, use o comando, por exemplo:

    ws.PrintOut


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta InfoProfi segunda-feira, 18 de junho de 2012 11:27
    domingo, 17 de junho de 2012 21:50
    Moderador
  • Não testei, mas veja o código retirado de http://www.excelforum.com/excel-programming/777486-use-vba-to-print-to-a-specific-printer.html para listar todas as impressoras:

    'Written: April 15 ,2009
    'Author:  Leith Ross
    'Summary: Lists the printers and ports that are available to the user.
    
    Sub PrintersAndPorts()
    
     'This works with Windows 2000 and up
     
      Dim Arr As Variant
      Dim Device As Variant
      Dim Devices As Variant
      Dim Msg As String
      Dim RegObj As Object
      Dim RegValue As String
      Const HKEY_CURRENT_USER = &H80000001
           
        Set RegObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
        RegObj.enumvalues HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr
        
          For Each Device In Devices
              RegObj.getstringvalue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue
              Msg = Msg & Device & " on " & Split(RegValue, ",")(1) & vbCrLf
          Next
          
        MsgBox Msg, vbInformation, "Printers and Ports"
          
    End Sub

    Em seguida, para escolher a impressora, utilize a propriedade Application.ActivePrinter para alterar ao nome desejado, como mostrado:

    appExcel.ActivePrinter = "Microsoft Office Document Image Writer on Ne00:"
    Agora, use o método PrintOut para imprimir o documento desejado.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta InfoProfi segunda-feira, 18 de junho de 2012 14:05
    segunda-feira, 18 de junho de 2012 12:13
    Moderador

Todas as Respostas

  • Estou supondo que você não está executando o código a partir do Excel.

    Algumas observações:

    Com esse código, você está sendo criando uma nova instância do Excel, independente se já existe uma aberta ou não. Sugiro que você use o método GetObject para verificar se existe uma instância já aberta e, caso não exista, criar uma nova. Um exemplo disso seria:

    Sub Exemplo()
        Dim appExcel As Object 'Excel.Application
        Dim wb As Object 'Excel.Workbook
        Dim ws As Object 'Excel.Worksheet
        
        On Error Resume Next
        Set appExcel = GetObject(, "Excel.Application")
        On Error GoTo 0
        If appExcel Is Nothing Then
            Set appExcel = CreateObject("Excel.Application")
        End If
        appExcel.Visible = True
        
        Set wb = appExcel.Workbooks.Add
        Set ws = wb.Sheets(1)
        
        'Povoa pelo menos uma célula para o modo de Visualizar Página funcionar:
        ws.Range("A1") = "Benzadeus!"
        
        'Põe foco no Excel, caso contrário, o código gera uma latência grande:
        AppActivate appExcel.Name
        
        'Mostra o modo de Visualizar Página:
        ws.PrintPreview
        
    End Sub

    Para saber mais sobre boas práticas de instanciação de Aplicações, sugiro que leia: http://www.ambienteoffice.com.br/officevba/boas_praticas_para_instanciacao_de_aplicacoes/

    Sobre o resto do código, você deve ter pelo menos alguma célula preenchido (ou AutoForma, Gráfico, etc.) para que o modo de Visualizar Página funcione. Além disso, é importante colocar o foco na Aplicação do Excel.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta InfoProfi segunda-feira, 18 de junho de 2012 11:27
    domingo, 17 de junho de 2012 21:49
    Moderador
  • Extrapolando um pouco sua pergunta, imagino que seu objetivo final seja imprimir a Planilha. Para fazer isso, use o comando, por exemplo:

    ws.PrintOut


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta InfoProfi segunda-feira, 18 de junho de 2012 11:27
    domingo, 17 de junho de 2012 21:50
    Moderador
  • Obrigado pelas dicas meu caro. Sim, eu quero mesmo imprimir, mas preciso selecionar a impressora, e gostaria de imprimir só uma determinada região da minha planilha. Alguma dica pra isto?
    segunda-feira, 18 de junho de 2012 11:27
  • Não testei, mas veja o código retirado de http://www.excelforum.com/excel-programming/777486-use-vba-to-print-to-a-specific-printer.html para listar todas as impressoras:

    'Written: April 15 ,2009
    'Author:  Leith Ross
    'Summary: Lists the printers and ports that are available to the user.
    
    Sub PrintersAndPorts()
    
     'This works with Windows 2000 and up
     
      Dim Arr As Variant
      Dim Device As Variant
      Dim Devices As Variant
      Dim Msg As String
      Dim RegObj As Object
      Dim RegValue As String
      Const HKEY_CURRENT_USER = &H80000001
           
        Set RegObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
        RegObj.enumvalues HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr
        
          For Each Device In Devices
              RegObj.getstringvalue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue
              Msg = Msg & Device & " on " & Split(RegValue, ",")(1) & vbCrLf
          Next
          
        MsgBox Msg, vbInformation, "Printers and Ports"
          
    End Sub

    Em seguida, para escolher a impressora, utilize a propriedade Application.ActivePrinter para alterar ao nome desejado, como mostrado:

    appExcel.ActivePrinter = "Microsoft Office Document Image Writer on Ne00:"
    Agora, use o método PrintOut para imprimir o documento desejado.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta InfoProfi segunda-feira, 18 de junho de 2012 14:05
    segunda-feira, 18 de junho de 2012 12:13
    Moderador
  • Valeu meu caro. Aqui, você tem alguma  idéia de como criar um relatório no access no formato desta planilha? Algum componente específico, ou alguma dica?? Me pediram isto, e embora eu ache impossível, gostaria de pegar sua opinião.
    segunda-feira, 18 de junho de 2012 14:05
  • A ferramenta de elaborar relatórios do Access é, na minha opinião, a melhor que um SGBD pode ter. No entanto, acredito que com um certo esforço, o Excel pode fornecer um relatório mais bonito.

    Como não sei como é o relatório que você deseja criar (quando disse 'desta Planilha', não entendi), não tenho como opinar, mas antecipadamente posso afirmar que é possível elaborar relatórios bastante complexos no Access.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    segunda-feira, 18 de junho de 2012 23:47
    Moderador
  • Pra dizer a verdade o cara quer imprimir a planilha em pdf, de dentro do access. Sabe como é cliente, ne! Daí pensei, mandar a planilha de dentro do código fonte pra impressora, ou melhor pro preview, que lá ele escolhe impressora, visualiza, e tals.

    Mas não sei como seria o visualizar neste caso. O método "PrintOut"  dá conta do recado, ou  uso o "PrintPreview" mesmo?

    Abusando mais um pouquinho, pra tentar escapar de pesquisar no manual, rsrs ... ja que tenho "algumas" coisinhas pra fazer esta semana. 

    Sugestões?

    terça-feira, 19 de junho de 2012 13:47
  • A decisão se o comando irá imprimir (publicar) diretamente o arquivo em PDF ou mostrar uma tela de Visualizar Impressão é sua, juntamente com o cliente.

    Vale ressaltar que o método PrintOut imprime diretamente, sem mostrar a visualização.

    É possível salvar diretamente em PDF utilizando o método Publish. Considere que wb é uma variável que representa um objeto Workbook. Use o código:

    Sub Exemplo()
        wb.ExportAsFixedFormat Type:=xlTypePDF _
          , Filename:="c:\arquivos\pasta.pdf" _
          , Quality:=xlQualityStandard _
          , IncludeDocProperties:=True _
          , IgnorePrintAreas:=True _
          , OpenAfterPublish:=False 'Altere para True se quiser abrir o arquivo
                                    'PDF após salvá-lo (publicá-lo).
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quinta-feira, 21 de junho de 2012 21:55
    Moderador