如果您使用宏来打印文档,则您已经知道该宏可以指定将输出发送到的实际打印机。如果还要指定要在该打印机上使用的特定纸盒怎么办?不幸的是,这在Word中有点粘滞。简短的浏览和解释将有助于弄清为什么会这样。

Word使用哪个纸盒取决于许多因素,其中一些不受Word本身的控制。例如,考虑以下情况,其中一些取决于您使用的Word版本。

  • 如果显示“ Word选项”对话框并单击“高级”,则可以在“打印”组中指定“默认纸盘”。

  • 如果显示功能区的“页面布局”选项卡,然后单击“页面设置”组右下角的图标,您将看到“页面设置”对话框。在“纸张来源”选项卡上,您可以指定用于第一页的纸盘和用于后续页的纸盘。

如果按Ctrl + P *进行打印,然后单击“属性”,则通常(取决于您的打印机)会四处乱逛并选择一个纸盒。

因此,Word在两个位置可以指定纸盘,并且打印机可能有自己的位置来设置要使用的纸盘。这个最终的设置区域(通过“属性”按钮)超出了VBA的“范围”,该对话框显示的是打印机驱动程序中的设置,而不是Word本身。

更糟糕的是,没有明确的说明可用于任何给定打印作业中哪些设置优先。页面设置对话框中的设置是否覆盖打印机驱动程序设置?打印机驱动程序设置是否会覆盖“ Word选项”对话框的设置? “ Word选项”对话框设置与“页面设置”设置如何相关?你明白了。多种设置,再加上各种不同的打印机驱动程序设置和打印机功能,可能导致混乱;在一种情况下可能有效的条件在另一种情况下可能无效。

话虽如此,您可以尝试几种方法来通过宏控制纸盘的选择。重要的是要记住,您的宏可以在“字选项”对话框以及“页面设置”对话框中指定设置。但是,您的宏无法指定可通过“打印”对话框的“属性”按钮访问的设置。 (稍后对此有更多介绍。)

如果要设置页面设​​置纸盘设置,可以使用类似于以下内容的宏进行设置:

Sub CustomPageSetup()

Dim strTrayFirst As String     Dim strTrayOther As String     Dim lngTrayFirst As Long     Dim lngTrayOther As Long

'Other setup code goes here

strTrayFirst = System.PrivateProfileString(strIniFile, _       "Printer Trays", "Letter First")

If strTrayFirst <> "" Then         Select Case strTrayFirst             Case "Automatic Sheet Feed"

lngTrayFirst = wdPrinterAutomaticSheetFeed             Case "Default Bin"

lngTrayFirst = wdPrinterDefaultBin             Case "Large Capacity Bin"

lngTrayFirst = wdPrinterLargeCapacityBin             Case "Large Format Bin"

lngTrayFirst = wdPrinterLargeFormatBin             Case "Lower Bin"

lngTrayFirst = wdPrinterLowerBin             Case "Manual Feed"

lngTrayFirst = wdPrinterManualFeed             Case "Middle Bin"

lngTrayFirst = wdPrinterMiddleBin             Case "Upper Bin"

lngTrayFirst = wdPrinterUpperBin             Case Else                 lngTrayFirst = wdPrinterLowerBin         End Select     End If

strTrayOther = System.PrivateProfileString(strIniFile, _       "Printer Trays", "Letter Other")

If strTrayOther <> "" Then         Select Case strTrayOther             Case "Automatic Sheet Feed"

lngTrayOther = wdPrinterAutomaticSheetFeed             Case "Default Bin"

lngTrayFirst = wdPrinterDefaultBin             Case "Large Capacity Bin"

lngTrayOther = wdPrinterLargeCapacityBin             Case "Large Format Bin"

lngTrayOther = wdPrinterLargeFormatBin             Case "Lower Bin"

lngTrayOther = wdPrinterLowerBin             Case "Manual Feed"

lngTrayOther = wdPrinterManualFeed             Case "Middle Bin"

lngTrayOther = wdPrinterMiddleBin             Case "Upper Bin"

lngTrayOther = wdPrinterUpperBin             Case Else                 lngTrayOther = wdPrinterUpperBin         End Select     End If     With ActiveDocument.PageSetup         .FirstPageTray = lngTrayFirst         .OtherPagesTray = lngTrayOther     End With End Sub

尽管宏的长度很大,但它仅设置两个设置:“页面设置”对话框的“纸张来源”选项卡上的“第一页”设置和“其他页面”设置。宏也不是完整的,仅是如何在自己的宏中完成实际“设置”的一个示例。此特定代码从INI文件(文件名在strIniFile字符串中指定)中读取两个设置,然后根据检索到的值进行设置。显然,您将需要提供要使用的INI文件的名称,并确保已将其设置为包含正确格式的正确信息。 (设置INI文件超出了本技巧的范围,但是在其他地方可以找到很多信息。)一旦从INI文件中读取了设置,它们就会转换为Word可以理解的设置,最后在With中…​结束具有结构的对话框将进行更改。

由于前面提到的原因,此宏中例示的方法可能无法在所有情况下都有效。如果没有,则可能至少从宏无法控制打印机使用的纸盘。请记住,通过“属性”按钮设置的纸盒实际上是在打印机驱动程序的控制之下,并且打印机驱动程序设置对于VBA而言不是“可见”的。在这种情况下,潜在的解决方案是简单地设置不同的打印机驱动程序。请遵循以下一般步骤:

。确定要在打印机上使用多少个纸盘。

。在Windows中为要使用的每个纸盒定义一个新的打印机。

例如,如果要使用三个不同的纸盒,则应定义三台打印机,每台打印机的名称代表纸盒。

。右键单击打印机定义,然后更改打印机的属性,以便将其打印到所需的纸盒中。

。对其他每个打印机定义重复步骤3,确保为每个打印机指定不同的纸盘。

此时,您已经设置了多个打印机定义,并且每个定义都将打印到同一台打印机上的不同纸盒中。现在,您可以在宏中指定所需的打印机,以便打印输出进入所需的纸盒。当然,此解决方案的唯一缺点是,它需要进行大量的设置工作。如果您在有50位用户的办公室中工作,这意味着您需要确保所有50位用户都如上所述定义了每台打印机。

请记住,用户可以通过在各种对话框中选择一个或多个设置来指定Word使用的纸盒,如本技巧的第一部分所述。因此,有些人已经成功使用SendKeys语句来模拟用户用来指定纸盒的按键。 (您可以在Word提供的VBA联机帮助中找到有关SendKeys的信息。)

SendKeys实际执行的操作是用一系列按键填充键盘缓冲区,就像它们由用户键入一样。但是,SendKeys可能存在问题。这可能是不可靠的,因为无法确保击键实际上就在您想要的地方。在多线程操作系统(如Windows)上,某些其他进程可能会干预命令并使命令出轨。

底线是,不幸的是,没有“一种尺码适合所有人”

使用宏选择纸盘的解决方案。适用于一个人的解决方案可能不适用于另一个人。出于这个原因,您将需要进行实验,以查看哪种解决方案最适合您-但不要指望它对其他任何人都有效。

注意:

如果您想知道如何使用此页面(或_WordTips_网站上的任何其他页面)上描述的宏,我准备了一个包含有用信息的特殊页面。

_WordTips_是您进行经济有效的Microsoft Word培训的来源。

(Microsoft Word是世界上最流行的文字处理软件。)此技巧(9320)适用于Microsoft Word 2007、2010、2013和2016。您可以在此处找到适用于Word的较早菜单界面的该技巧的版本: