Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 检查打印份数的宏,或按宏以外的方式阻止打印_Vba_Ms Word_Office 2013 - Fatal编程技术网

Vba 检查打印份数的宏,或按宏以外的方式阻止打印

Vba 检查打印份数的宏,或按宏以外的方式阻止打印,vba,ms-word,office-2013,Vba,Ms Word,Office 2013,我正在寻找帮助,为Word 2013创建一个简单宏,用于检查用户是否正在打印多份副本并取消打印作业。 一些解决方案,如: 强制为1份复印打印作业 MsgBox“您一次只能选择打印一份” 显然,自动强制1会更好,但可能更复杂。我想只需一个提示+取消打印作业将是最简单的,然后用户可以返回并更改为打印1份 推理: 我有一个宏,它以递增的数字打印文档,但如果选择“打印2份”,则宏询问“有多少份”,然后选择“2”,则得到4份文档 2x Doc # 1 2x Doc # 2 我需要用户始终在Word打

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

一些解决方案,如:

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

推理:

我有一个宏,它以递增的数字打印文档,但如果选择“打印2份”,则宏询问“有多少份”,然后选择“2”,则得到4份文档

2x Doc # 1
2x Doc # 2
我需要用户始终在Word打印屏幕中选择1份副本,然后在宏提示框中选择副本的#


如何执行此操作?

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

因此,我的解决方案在
ActiveDocument.PrintOut
中包含一个标志,该标志指定了副本
copies:=1
。这进入了打印文档的宏和
DocumentBeforePrint
中,我使用
Cancel=True

这允许用户在Word中选择他们想要的任何数字,并将其导入到
Cancel=True
,然后宏询问“您想要多少份”,并按每次递增的数字打印X份。以前,即使是宏也会获取word中设置的副本数,并将其应用到宏中,因此我会得到相同序列号文档的副本,这不是我想要的

我看到用户在Word和宏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

很接近,但方法过于复杂。我不认为有什么方法可以实现我上面的要求,但我将使用一种与您的回答非常类似的方法我将使用“打印前”事件取消所有打印作业,并显示消息以仅通过宏快捷键打印。。。。为什么不取消打印作业,然后运行宏?当然,这种方法也有一些缺点,但我相信你会解决的!