Usuário com melhor resposta
Problema ao tentar imprimir planilha do excel via vba

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
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
-
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
-
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
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
-
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
-
-
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
-
-
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
-
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?
-
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