在宏(Microsoft Word)中指定纸盘
如果您使用宏来打印文档,则您已经知道该宏可以指定将输出发送到的实际打印机。如果还要指定要在该打印机上使用的特定纸盒怎么办?不幸的是,这在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的较早菜单界面的该技巧的版本: