Excel 用户定义函数 (UDF) 自动化插件1,带有集成安装程序,均用 VB.Net 编写
完整的 Microsoft Visual Studio 2022 解决方案和项目源代码。
包含 32 位和 64 位 Office/Excel 的安装程序。
单击“版本”>“资产”以获取预构建的示例。
在 VB.Net 中开发的 Excel 用户定义函数 (UDF) 已存在多年,其早期示例包括 -
http://www.cpearson.com/Excel/CreatingNETFunctionLib.aspx
https://www.codeproject.com/Articles/7753/Create-an-Automation-Add-In-for-Excel-using-NET
虽然这些功能运行良好,但它们的部署可能会出现更多问题,特别是在最终用户可能不熟悉或不被允许运行命令行实用程序(例如 Regasm)来完成安装的情况下。
因此,该项目的设计目标是:-
构建解决方案需要安装有以下软件的 Windows PC
如果可能,建议在专用开发 PC 上对所有上述组件进行“全新构建”,并应用所有更新。
Visual Studio 应安装以下项目
以下实用程序对于检查注册过程很有用,但不是强制性的。
自动化插件在安装过程中注册。
对于 32 位和 64 位版本的 Office,需要将不同的值写入注册表。
安装程序类提供这些值,自定义操作属性是为每个安装程序项目中所需的版本设置的。
提供了单独的 32 位和 64 位 Office 安装程序项目,并且应为所需的每个版本构建。
Visual Studio 从每个安装程序项目生成两个输出文件setup.exe
和AUTO_INSTALLER_nn.msi
这些文件中的任何一个都可以分发给最终用户并由最终用户运行,以根据需要进行安装和卸载。
运行安装程序后,用户需要配置 Excel 以启用自动化插件。
从 Excel > 文件 > 选项 > 加载项 > 管理 Excel 加载项
单击自动化,向下滚动并选择 AUTOMATION.Functions
单击“确定”确认
提供了两个示例 Excel 公式
工作表单元格中的=IFX()
返回文本字符串AUTO FX OK
工作表单元格中的=TIMENOW()
返回当前时间(以毫秒为单位),例如12:34:56.789
这是一个“易失性”函数,当按下 F9 键或另一个单元格更改时将重新计算。
通过单击公式 > 插入函数并选择 AUTOMATION.Functions 作为类别,可以列出加载项提供的函数
用户可以通过右键单击 Windows 开始按钮并选择应用程序和功能来卸载加载项
向下滚动到Automation FX并选择卸载
当开发人员或最终用户运行安装程序 .exe 或 .msi 程序时,类模块Installer.vb
执行所需的程序集注册和注册表更新。
当新的 Installer 类模块添加到项目中时,vb.net 在文件Installer.Designer.vb
中自动提供标记<System.ComponentModel.RunInstaller(True)>
安装程序使用此标签通过项目 AUTO_INSTALLER_32 和 AUTO_INSTALLER_64 中的自定义操作属性调用Public Overrides Sub Install(stateSaver As IDictionary)
。
然后,子Install
调用RegisterAssembly
,其功能相当于手动运行RegAsm.exe
2 。
RegAsm.exe
本身使用 RegistrationServices 3公开的方法
应始终遵守以下几点,以避免在开发和测试期间执行任何冲突的注册表更新。
在项目 AUTO_FUNCTIONS > Properties 中,任何时候都不应选择以下选项。
Register for COM Interop
Make assembly COM-Visible
标签<ComRegisterFunction>
和<ComUnRegisterFunction>
也不应该在任何模块中使用。
在每个项目 > Primary Output Properties 中,Register 应设置为vsdrpDoNotRegister
应开发新的生产版本,以确保所有 GUID 都是唯一的,并且合并所有 Visual Studio 更新、引用和依赖项。
https://support.microsoft.com/en-us/topic/excel-com-add-ins-and-automation-add-ins-91f5ff06-0c9c-b98e-06e9-3657964eec72 ↩
https://learn.microsoft.com/en-us/dotnet/framework/interop/registering-assemblies-with-com ↩
https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.registrationservices?view=netframework-4.8.1 ↩