Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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
Excel 限制要打印的份数_Excel_Printing_Vba - Fatal编程技术网

Excel 限制要打印的份数

Excel 限制要打印的份数,excel,printing,vba,Excel,Printing,Vba,我有5台电脑和两台打印机通过局域网连接。其中一台计算机中有一个特定的excel文档(未共享),我希望将可打印的副本数限制为4份。这意味着用户打印该文档的副本不应超过4份 我知道影印(还有更多)的漏洞,但我仍然希望印刷品的数量能得到控制或限制 我浏览了一些打印控制软件的功能,但我了解到它们都有一个“配额”系统,用户在超过限额后必须支付打印费用。恐怕这对我不起作用 我也看到了一个类似问题的答案 谢天谢地,这个答案对我帮助很大,只是我不知道如何限制或限制用户打印超出指定数字的内容 我也读过很多答案,说

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

我知道影印(还有更多)的漏洞,但我仍然希望印刷品的数量能得到控制或限制

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

我也看到了一个类似问题的答案

谢天谢地,这个答案对我帮助很大,只是我不知道如何限制或限制用户打印超出指定数字的内容

我也读过很多答案,说限制拷贝数几乎是不可能的,但我仍然希望寻求帮助——也许能找到一些解决办法

我对计算机/打印机编程没有太深的知识。虽然不是专业人士,但我对excel vba有点熟悉

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

我一找到东西就把它贴在这里


非常感谢您的帮助。

这是一个粗糙的解决方案,但这会增加打印数量的限制

将以下内容放入本工作簿中:

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
,然后将此子例程(以及附带的函数)插入到
模块中

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
Private子打印按钮\u Click()
出错时继续下一步
Application.EnableEvents=False
如果(可以打印(4)),则
ActiveSheet.PrintOut
其他的
MsgBox(“抱歉,这是此文档的最大打印数!”)
如果结束
Application.EnableEvents=True
错误转到0
端接头
函数CanWePrint(ByVal MaxPrintVal为整数)为布尔值
Dim CurrentPrintCount作为字符串,SecretFile作为字符串
'请更改为您的“机密”TXT文件名和位置!
SecretFile=“C:\Users\Matt\Documents\countPrint.txt”
CurrentPrintCount=GetCount(SecretFile)
如果(CurrentPrintCount
这是干什么的 此代码将禁用该工作簿Excel中的标准打印选项。通过添加
命令按钮
可以创建一个手动打印选项,该选项将检查存储在
.txt
文件中的打印计数,这意味着文档可以关闭和重新打开,并且仍然只能打印4次

你需要做什么
  • 在与此文档相同的计算机上创建新的txt文件,并在
    CanWePrint
    中更新上面代码中的路径
撤回 就像我说的,这是一个粗糙的解决方案,有很多方法可以解决这个问题:

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

这一点也不粗糙,对我来说非常复杂:)我同意上面提到的缺点。当我将代码粘贴到表1而不是模块中时,代码运行良好。不过这里有一个陷阱,Matts代码适合一个文件。我拥有的是一个空的模板文件(保存为启用宏的excel工作簿,但对我来说像模板一样工作),它必须一次又一次地填充和打印,但我需要避免重复,因此不超过4份

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

  • 它需要4份打印件
  • 它在文件中插入水印(从而将其标记为无效)
  • 它将所选范围导出为pdf,并将其保存在我指定的文件夹中(因此所有保存的pdf都有水印,并且无法在adobe reader中删除)
  • 它删除水印,清除所有输入的数据,从而提供下次创建的新文档。 这对我来说是可行的,除了任何人都可以打印任意数量的副本,如果他们不使用我的快捷方式。 但有了Matts答案中的“打印前”代码,问题就迎刃而解了。 非常感谢马特! 正如你提到的,有更多的方法可以解决这个问题,我会继续努力, 现在这应该对我有用
  • 请让我知道我的方式是否好,是否有任何循环。。
    谢谢大家!

    非常感谢你,马特@塞普拉,不客气。如果这解决了您的问题,请不要忘记将问题标记为已完成!:-)是的,请看一看我的答案,然后告诉我是否足够好,再次感谢。