用于检查打印的份数或打印除了宏

时间:2018-06-11 05:26:41

标签: vba ms-word word-vba office-2013

我正在寻找帮助,为Word 2013创建一个简单的宏,用于检查用户是否正在打印多份副本并取消打印作业。

一些解决方案,例如:

  • 强制它为1份打印作业
  • MsgBox“您应该一次只选择打印1份”

显然强制1自动会更好,但可能更复杂。我想只是一个提示+取消打印作业将是最简单的,然后用户可以返回并更改为打印1份。

推理:

我有一个打印带有递增编号的文档的宏,但是如果你选择说打印2份,然后宏询问“多少份”,你说2,你就得到4份文件。

2x Doc # 1
2x Doc # 2

我需要用户始终在Word Print屏幕中选择1份,然后在宏提示框中选择#份。

如何执行此操作?

2 个答案:

答案 0 :(得分:0)

一种解决方案是关闭所有打印按钮和命令(禁用菜单 - 例如CommandBars("Standard").Items(ID:=XX).Enabled = False,其中XX是打印和快速打印选项的ID),然后只允许自定义打印宏调用打印功能。您还必须禁用功能区打印按钮和热键(OnKey命令“^ p”),您也可以将其重定向到宏。

答案 1 :(得分:0)

所以我的解决方案涉及ActiveDocument.PrintOut中的一个标志,它指定了副本Copies:=1。这进入了打印文档的宏,并在DocumentBeforePrint我使用Cancel = True内部。

这允许用户在Word中选择他们想要的任何数字并将其汇集到Cancel = True,然后宏询问您想要多少份?"并打印每次递增数量的X份数。不知怎的,以前,即使宏将采用word中设置的副本数量并将其应用于宏中,因此我会得到同一个序列号文档的副本,这不是我想要的。

我看到用户在Word和Macro MsgBox中都放了相同的数字,但实际上他们可以在Word中放置任何内容,而且重要的只是宏MsgBox。

最后两段代码片段如下所示:

Public WithEvents App As Word.Application
Private Sub App_DocumentBeforePrint(ByVal Doc As Document, Cancel As Boolean)

'Cancel = True = Don't bother printing whatever was selected in Word Print Page
Cancel = True
Call FilePrint

End Sub

模块:

Sub FilePrint()
Dim i As Long, j As Long
With ActiveDocument
     j = CLng(InputBox("How many copies to print?", "Print Copies"))
  For i = 1 To j
    With .CustomDocumentProperties("Counter")
      .Value = .Value + 1
    End With
    .Fields.Update
    ' Added Copies:=1 to force no Duplicates!
    ActiveDocument.PrintOut Copies:=1
  Next
  .Save
End With
End Sub