vba - 保护 Excel 工作簿(使用 VBA)免于与不同数据重复使用

标签 vba excel security

我为客户创建了一个包含大量 VBA 代码的 Excel 工作簿。客户会给我提供数据。我会将该数据导入到 VBA 加载模板中,将其另存为 xlsm,然后将其交付给客户。我通过工作簿获得报酬,因此我需要阻止他们尝试将新数据复制到现有工作簿中并重新使用它。

如何以某种方式通过在主工作表上输入新数据,然后另存为新工作簿并获取使用来防止客户重复使用工作簿免费的 VBA 代码。 (或者,他们可以在 Windows 中复制文件,然后在复制的版本上输入新数据。)我需要检测初始导入数据中数据的显着变化。

主表上的数据相当静态(在许多已知列上甚至可能完全静态)。我正在考虑在导入时随机采样一些单元格数据(可能是 10 个随机单元格或行数等),并将该数据存储在某处。比如说,如果 50% 的单元格更改了数据,我可以禁用(或短路)代码中的公共(public)入口点...或者其他什么?

我希望允许客户有一定的灵 active ,但要防止滥用。

  • 有比我上面的总体想法更好的方法吗?
  • 我可以在哪里存储该数据(它应该是工作表的一部分,但客户不能更改)。也许是一个带有密码锁定单元格的隐藏工作表?
  • 是否有一些我不知道的公认的方法?

最佳答案

代码中的功能可能会过期

谢谢你提出这个问题。感谢您设置赏金。考虑到您希望将 VBA 代码货币化,这是一个非常有趣的问题,作为 VBA 程序员,我通常无法将 VBA 代码货币化。您的坚持是件好事,我会尽力提供答案。

首先,让我加入到 VBA 很容易被黑客攻击的答案中。密码保护可能被破解。我会加入受访者的行列,他们说你应该选择一种编译语言作为你的代码的容器。为什么不尝试使用 Visual Studio Tools For Office (VSTO) .NET 程序集中的 C# 或 VB.NET?

VSTO 会将已编译的程序集与工作簿关联起来。这种机制值得了解,因为如果您坚持使用 VBA,我们可以使用相同的机制(见下文)。每个工作簿都有一个 CustomDocumentProperties 集合,可以在其中设置自定义属性(它表示文档而不是电子表格,因为在 Word 中也可以找到相同的内容,因此文档是通用情况)。

Excel 将查看工作簿的 CustomDocumentProperties 集合并搜索“_AssemblyName”和“_AssemblyLocation”;如果 _AssemblyName 是一个星号,那么它知道需要加载 .NET/VSTO 程序集,_AssemblyLocation 提供对要加载的文件的查找(您必须深入研究这一点,我忘记了详细信息)。 Reference

无论如何,我想起了 VSTO CustomDocumentProperties 机制,因为如果您坚持使用 VBA,那么我建议在 CustomDocumentProperties 集合中存储一个值,以帮助您及时终止代码的功能。注意不要使用BuiltInDocumentProperties("Creation Date"),因为它很容易识别;而是使用代码字,例如“BlackHawk”。这是一些示例代码。

Sub WriteProperty()

    ThisWorkbook.BuiltinDocumentProperties("Creation Date") = CDate("13/10/2016 19:15:22")


    If IsEmpty(CustomDocumentPropertiesItemOERN(ThisWorkbook, "BlackHawk")) Then
        Call ThisWorkbook.CustomDocumentProperties.Add("BlackHawk", False, MsoDocProperties.msoPropertyTypeDate, Now())
    End If


End Sub

Function CustomDocumentPropertiesItemOERN(ByVal wb As Excel.Workbook, ByVal vKey As Variant)
    On Error Resume Next
    CustomDocumentPropertiesItemOERN = wb.CustomDocumentProperties.Item(vKey)
End Function


Sub ReadProperty()

    Debug.Print "ThisWorkbook.BuiltinDocumentProperties(""Creation Date""):=" & ThisWorkbook.BuiltinDocumentProperties("Creation Date")
    Debug.Print "CustomDocumentPropertiesItemOERN(ThisWorkbook, ""BlackHawk""):=" & CustomDocumentPropertiesItemOERN(ThisWorkbook, "BlackHawk")

End Sub

因此,您可以将 CustomDocumentProperty“BlackHawk”设置为工作簿的初始创建时间,然后允许客户端使用该代码 24 小时,甚至 48 小时(注意周末,创建周五工作到周二),然后代码可以拒绝操作,而是抛出一条消息,提示支付 LimaNightHawk 更多钱!

附注祝您的收入模式好运。

P.P.S。我读了你的个人资料,感谢你服兵役。

关于vba - 保护 Excel 工作簿(使用 VBA)免于与不同数据重复使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878276/

相关文章:

excel - 如何引用另一个工作表中的数据表列?

java - 在 Java Web 应用程序中放置安全数据

security - 存储并用于恢复的 mysql 电子邮件

vba - 从文件夹中的所有工作簿中删除 VBA 代码

excel - 在 MATLAB 中使用贝塞尔函数

vba - 如果 D1>O1 则隐藏行

security - 在整个 session 中使用相同的 CSRF token 是否可以接受?

arrays - 如何使用数组字典循环工作表

java - Excel VBA 从下载对话框打开文件

regex - 这是用于匹配 Excel 公式中任何单元格引用的正则表达式吗?