限制要打印的份数

时间:2016-01-12 07:35:05

标签: excel excel-vba printing vba

我有5台计算机和两台通过LAN连接的打印机。其中一台计算机(未共享)中有一个特定的Excel文档,我希望将可打印的副本数量限制为4.意味着用户不应该打印超过4份该文档。

我知道影印(以及更多)的漏洞,但我仍然希望打印副本能够以受控或有限的数量出现。

我已经浏览了一些打印控制软件的功能,但我了解到他们都有一个"配额"用户必须在超过限制后支付打印费用的系统。我担心这对我不起作用。

我还阅读了此处发布的类似问题的答案,Set number of copies per worksheet

值得庆幸的是,这个答案对我很有帮助,除了我不知道如何限制或限制用户将打印输出超出指定的数量。

我也读过许多答案,说限制复制数量几乎是不可能的,但我仍然希望寻求帮助 - 也许可以提出一些解决方案。

我对计算机/打印机编程知之甚少。虽然不是专业人士,但我对excel vba有点熟悉。

请告诉我是否有任何解决方案,

一旦我发现了某些内容,我就会在这里发布。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

这是一个粗略的解决方案,但这会在打印数量上添加一些限制......

放在ThisWorkbook

Private Sub Workbook_BeforePrint(Cancel As Boolean)    
    Cancel = True  
    If Cancel = True Then
        MsgBox "Please use the print button on Sheet1."
    End If   
End Sub

添加CommandButton并将其重命名为PrintButton,然后将此子例程(及附带的函数)插入Module

Private Sub PrintButton_Click()
  On Error Resume Next
    Application.EnableEvents = False

        If (CanWePrint(4)) Then
           ActiveSheet.PrintOut
        Else
            MsgBox ("Sorry this is the maximum number of prints for this document!")
        End If

    Application.EnableEvents = True
    On Error GoTo 0
End Sub


Function CanWePrint(ByVal MaxPrintVal As Integer) As Boolean

    Dim CurrentPrintCount As String, SecretFile As String

    'PLEASE CHANGE TO YOUR "SECRET" TXT FILE NAME AND LOCATION!
    SecretFile = "C:\Users\Matt\Documents\countPrint.txt"

    CurrentPrintCount = GetCount(SecretFile)

    If (CurrentPrintCount < MaxPrintVal) Then
        Call UpdatePrintCount(CurrentPrintCount, SecretFile)
        CanWePrint = True
    Else
        CanWePrint = False
    End If

End Function

Function GetCount(ByVal SecretFile As String) As Integer

   Dim nSourceFile As Integer
   Dim sText As String

   Close

   nSourceFile = FreeFile

   Open SecretFile For Input As #nSourceFile
    sText = Input$(LOF(1), 1)
   Close

   GetCount = CInt(sText)

End Function

Sub UpdatePrintCount(ByVal CurrentVal As Integer, ByVal SecretFile As String)

    Dim sBuf As String
    Dim sTemp As String
    Dim iFileNum As Integer

    iFileNum = FreeFile
    Open SecretFile For Input As iFileNum

    Do Until EOF(iFileNum)
        Line Input #iFileNum, sBuf
        sTemp = sTemp & sBuf & vbCrLf
    Loop
    Close iFileNum

    sTemp = Replace(sTemp, CurrentVal, CurrentVal + 1)

    iFileNum = FreeFile
    Open sFileName For Output As iFileNum

    Print #iFileNum, sTemp

    Close iFileNum

End Sub

这是做什么

此代码将禁用Excel中该工作簿的标准“打印”选项。通过添加CommandButton,您可以创建一个手动打印选项,该选项将检查存储在.txt文件中的打印计数,这意味着文档可以关闭并重新打开,但仍然只打印4次。

您需要做什么

  • 在与此文档相同的计算机上创建新的txt文件,并在CanWePrint中更新上述代码中的路径。

缺点

就像我说的那样,这是一个粗略的解决方案,并且有很多方法可以解决这个问题:

  • 手动更改.txt文件
  • 中的值
  • 不使用VBA保存工作簿
  • 禁用VBA

答案 1 :(得分:0)

这一点都不粗糙,对我来说非常复杂:)我对提到的缺点没问题。当我将它粘贴在表1而不是模块中时,代码工作正常。虽然这里有一个问题,Matts代码对于一个文件是好的..我有一个像文件一样的空模板(保存为启用宏的excel工作簿,但对我来说像模板一样工作),必须填写并重新打印,再次,但我需要避免重复,因此不超过4份。

所以我试过的是, 我用键盘快捷键创建了一个宏。这个宏执行此操作:

  1. 需要4次打印输出。
  2. 它会在文件中插入水印(因此将其标记为无效)
  3. 它将所选范围导出为pdf并将其保存在我指定的文件夹中(因此所有保存的pdf都有水印,并且无法在adobe reader中删除它)
  4. 删除水印,清除所有输入的数据,从而提供下次创建的新文档。 这对我有用,除非任何人都可以打印任意数量的副本,如果他们没有使用我的快捷方式。 但是使用&#34; beforeprint&#34; Matts中的代码答案将被解决。 非常感谢Matt! 正如你所提到的,可以有更多方法解决这个问题,我将继续工作, 现在这应该对我有用。
  5. 如果我的方式很好并且有任何循环,请告诉我.. 谢谢!