安全的Excel工作簿(与VBA)从不同的数据重用

我已经为客户创build了一个包含大量VBA代码的Excel工作簿。 客户将向我提供数据。 我将把这些数据导入到VBA载入的模板中,将其保存为xlsm,并将其交付给客户。 我通过工作簿获得付款,所以我需要阻止他们尝试将新数据复制到现有工作簿并重新使用它。

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

主表上的数据是相当静态的(甚至在许多已知的列上甚至是完全静态的)。 我正在考虑随机抽样一些导入的单元格数据(可能是10个随机单元格或行数等),并将这些数据存储在某个地方 。 比方说,如果有50%的单元格改变了数据,我只能禁用(或短路)代码中的公共入口点…或其他东西?

我想允许客户有一定的灵活性,但是要防止滥用。

  • 上面有更好的办法吗?
  • 我可以在哪里存储这些数据(它应该是表格的一部分,但不能由客户更改)。 也许隐藏工作表与密码locking单元格?
  • 有没有一些可以接受的做法,我不知道?

也许时间到期代码中的function

所以谢谢你这个问题。 谢谢你设置赏金。 考虑到您希望将VBA代码币种化,这是一个非常有趣的问题,作为一名VBA程序员,我一般会自to为不能将VBA代码币种化。 你坚持这是好事,我会为答案作出贡献。

首先,让我joinVBA很容易被黑客攻击的答案。 密码保护可以被破坏。 我会join那些认为你应该select一种编译语言作为你的代码的应用程序的合唱团队。 为什么不尝试在Visual Studio Tools For Office(VSTO).NET程序集中安装C#或VB.NET?

VSTO将把编译后的程序集与工作簿关联起来。 这个机制是值得了解的,因为如果你坚持使用VBA,我们可以使用相同的机制(见后面)。 每个工作簿都有一个CustomDocumentProperties集合,可以设置自定义属性(它表示Document not Spreadsheet,因为在Word中可以find相同的内容,所以Document是一般情况)。

Excel将查看工作簿的CustomDocumentProperties集合并search“_AssemblyName”和“_AssemblyLocation”; 如果_AssemblyName是一个星号,那么它知道它需要加载一个.NET / VSTO程序集,_AssemblyLocation提供了一个查找文件加载(你将不得不深入研究,我忘记了细节)。 参考

无论如何,我想起了VSTO CustomDocumentProperties机制,因为如果你坚持使用VBA,那么我build议在CustomDocumentProperties集合中存储一个值,以帮助你使代码的function失效。 注意不要使用BuiltInDocumentProperties(“创builddate”),因为它很容易识别; 而是使用一个代码字,说“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”设置为工作簿的初始创build时间,然后允许客户端使用该代码24小时甚至48小时(小心周末,周五至周二创build星期五),然后代码可以拒绝操作,而不是扔LimaNightHawk更多的钱说消息!

PS祝你好运与您的收入模式。

PPS我读了你的个人资料,谢谢你的军事服务。

不pipe你做什么,破解它都是可行的(VBA代码很容易破解)。 然而:

  • 有这样的合同,这对他们来说是不合法的
  • 您可以将部分代码放在FTP服务器上,并控制正在执行的内容

虽然这里很less有想法

编译Excel文件到EXE。 谷歌的。

关注1似乎是文件的基本重用。 您可以在ThisWorkbook模块中创build一个子选项,以便在select时保存位于其他模块中的代码。

关心2似乎是一个黑客你的密码保护。 可以采用类似的策略,比如使用“打开开发者窗口”作为你的事件而不是另存为。

我已经尝试使用ThisWorkbook模块以保存事件logging用户条目,并取得了巨大的成功。 我不确定如何/如果可以检测开发者选项卡是否打开。

这是我所做的。 也许有一个完全更好的方法,或者有下面的tweeks,将使它更好:

  1. 从“VBA工具”菜单>“VBAProject属性”>“保护(选项卡)”,我locking项目以使用密码查看。

  2. 我创build了一个新的“许可证”表。 该工作表对用户是隐藏的。 如果你通过这样的代码隐藏工作表:

Me.Visible = xlSheetVeryHidden

然后表单不能被用户隐藏(它需要运行vba代码来取消隐藏)。

  1. 在最初的导入我样品:
    • 导入的行数
    • 从我知道的列中随机select的单元格*数目不会/不应该改变。 (有列允许自由改变。)

我将这些存储在“ 地址 / ”对的“许可”表中。

在这里输入图像描述

  1. 打开Workbook_Open会触发Workbook_Open事件,然后快速比较当前的行数以及存储在“许可”表中的当前值。 然后我做一个百分比计算:如果行大于x%不同,或者改变值的数量多于y%,那么我
 Sheets(1).Protect LOCKOUT_PASSWORD Application.Calculation = xlCalculationManual Application.EnableEvents = False 

如果需要,还有一种方法可以解锁纸张。

这可能是一个简单的答案,但有时我们不会想到最简单的解决scheme:

你为什么不直接向客户提供一份输出的副本? 您可以通过启用macros的工作簿运行他们的数据,将输出表复制到一个新的工作簿,然后打破所有链接,以便没有公式,更新或绑定到您的工作簿。

我将创build另一个包含代码的工作簿,然后引用来自该代码的客户wb。