在VBA for Access中更改打印机也会更改页面布局

时间:2016-02-25 15:19:47

标签: vba ms-access access-vba

我试图为表单上的打印机选择提供控件。

名为cbxPrinterList的组合框列出了打印机名称。当用户点击CompanyHistory按钮时,应从所选打印机打印Command1报告。如何强制它以横向打印。

以下代码适用于一个例外。该报告以横向设计。但它是纵向打印。

Private Sub Command1_Click()

   Dim reportName As String
   reportName = "CompanyHistory"

   Dim vPrinter As Access.Printer

   Set vPrinter = Application.Printers(cbxPrinterList.ListIndex)
   vPrinter.Orientation = acPRORLandscape

   DoCmd.OpenReport reportName, View:=acViewPreview, WindowMode:=acHidden
   Set Reports(reportName).Printer = vPrinter

   DoCmd.OpenReport reportName, View:=acViewNormal
   Set Application.Printer = Nothing

   ' Close report without saving.
   DoCmd.Close ObjectType:=acReport, ObjectName:="Invoice", Save:=acSaveNo

End Sub

1 个答案:

答案 0 :(得分:1)

您可能最好采用稍微不同的方法来更改目标打印机以解决此问题。而不是打开报表和更改报表打印机,尝试暂时更改Microsoft Access中的默认打印机,然后再将其更改回来。我过去从未遇到任何问题。

首先,我不知道您的组合框是如何设置的,但我希望它提供打印机名称列表,以便所选择的组合框将返回打印机的Windows DeviceName。下面是一些使用可用打印机列表填充组合框的示例代码。你可以把它放在Form_Open事件中。

Dim prt As Access.Printer

'Populate the Printer Combo Box
For Each prt In Application.Printers
    Me.cbxPrinterList.AddItem prt.DeviceName
Next prt
Set prt = Nothing

您可能遇到的另一个问题是,可能会为特定打印机而不是默认打印机设置报告。在报表的设计视图中,检查页面设置以确保“Printer for CompanyHistory”设置为“默认打印机”(而不是“使用特定打印机”。)我发现为特定打印机保存报表时,在运行时更改为其他打印​​机时,可能会导致布局出现问题。

Microsoft Access, Report Designer, Page Setup dialog

然后,按照以下方式修改代码,以便在打印前更改默认打印机。

Dim DefaultPrinter As String
Dim ReportPrinter As String
Dim prt As Access.Printer
Dim reportName As String

reportName = "CompanyHistory"
ReportPrinter = cbxPrinterList

'Get the current default printer so we can restore it after printing
DefaultPrinter = Application.Printer.DeviceName
'No need to change the printer if they chose the current default
If ReportPrinter <> DefaultPrinter Then
    For Each prt In Application.Printers
        If prt.DeviceName = ReportPrinter Then
            Set Application.Printer = prt
            Exit For
        End If
    Next prt
End If
DoCmd.OpenReport reportName, acViewNormal
If ReportPrinter <> DefaultPrinter Then
    Set Application.Printer = Application.Printers(DefaultPrinter)
End If