Excel VBA 编程 -- 四谈保护知识产权
- 2026-11-10 19:00:38
Excel VBA 编程 -- 四谈保护知识产权关于保护 Excel 中的 VBA 代码,我们已经讨论过 VBA 编译——VBA Padlock,还讨论过将 VBA 代码转换为 Delphi 代码并编译为 DLL。今天我们再讨论一种方法——VSTO。 VSTO 的全名是 Visual Studio Tools for Office,意思是用于开发 Office 解决方案的 Visual Studio 工具,其中一个重要的项目是用 VSTO 来开发 Office 加载项(Add-in)。 今天,我们就一个例子来说明如何用 VSTO 开发 Excel 的加载项。 我们在《Excel VBA 编程 -- 大数据量写入数据库(一)》中曾经讨论过一个例子:将一个 10 万行的 Excel 数据集写入 SQL Server 数据库。我们今天将这个数据集写入 Access 数据库,并且从 Access 数据库中再读到 Excel 中。 
将这个数据集写入 SQL Server 数据库,我们已经讨论过三种解决方案:VBA、Delphi、Python/Pandas。今天我们就来看看如何用 VSTO 将这个数据集写入 Access 数据库。 首先,启动 Visual Studio 2026,创建一个 Excel VSTO Add-in 项目,并命名为 MyAddin。如图: 
然后,在 VS Code 中,指挥 Copilot 将我们已经写过的 AceClient.cls、AceTestModule.bas 转换为 C#,如图: 
第三,将转换后的 AceClient.cs、AceTestModule.cs 导入到前面创建的 Visual Studio 项目中,对代码进行手工微调,并在加载项的启动事件处理程序中(ThisAddin_Startup)调用 AceTest,将数据集写入数据库并从数据库中读出。其中,AceTest 函数接受一个参数:Excel.Application(以 this.Application 表示)。如图: 
下图,VBA 的 AceTestModule 模块转换为了 C# 的 AceTestModule 静态类,其实现代码与 VBA 代码基本相同。 
下图,VBA 的 AceClient 类转换为了 C# 的 AceClient 类,基本保留了原来 VBA 代码的模样。 
MyAddin 项目编译后,生成如下一些文件: 
其中,MyAddin.dll 为加载项的程序代码,MyAddin.vsto 是加载项的安装文件,双击该文件即可安装,如图: 
下面,打开我们的 Excel 文件 myExcel.xlsm,点击主菜单栏上的“开发工具”,在 Ribbon 面板,点击“COM 加载项”,Excel 显示可用的加载项,点击选中 MyAddin 的复选框: 
点击“确定”,则关闭对话框,启动 MyAddin 加载项,随后在 ThisAddin_Startup 事件处理程序中调用 AceTest,从而完成我们的任务。结果如下: 
从结果的时间统计中,可以看出,创建数据库花费了 0.12 秒,写入数据库花费了 34.64 秒,读入到 Excel 花费了 1.22 秒。与以前的解决方案做一下对比: 
也许是因为数据库的能力不同,以前写入 SQL Server 数据库的方案,其写入时间比现在的写入 Access 数据库的时间都要短。 在我们的 VSTO 加载项中,不需要一行 VBA 代码,完全用 C# 写成,并且编译为 DLL。 VSTO 的能力远比本文所涉及的要广泛得多,也强大得多。不失为 VBA 的替代方案。但 VSTO 也存在短板: 纵观我们所讨论的三种知识产权保护方案,可以得出结论: 对于 Excel VBA 代码的知识产权保护,虽然写了几篇文章,但也只是匆匆一瞥,希望能抛砖引玉。 相关阅读 Excel VBA 编程 -- 保护知识产权 Excel VBA 编程 -- 再谈保护知识产权 Excel VBA 编程 -- 三谈保护知识产权 Excel VBA 编程 -- 大数据量写入数据库(一)











VSTO 只支持 .NET Framework,不支持跨平台的现代 .NET,这使得 VSTO 完全被限制在了 Windows 平台。 由于 .NET 的特点,由 C# 编译成的 DLL 仍然比较容易反编译,从知识产权保护的角度来说,VSTO 解决方案的保护力度仍然不够有力。
VBA Padlock:思路很好,但目前不成熟,且需要付费购买。 Delphi:保护力度最强,但学习曲线陡峭。 VSTO:保护力度中等,但因为学习曲线平缓,生产力高,对于 Windows 平台来说,不失为一种很好的解决方案。
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。