在 Excel 中引用 DLL(动态链接库)通常有两种主要场景:
- VBA 中调用 DLL:通过
Declare语句调用 Windows API 或自定义的 COM/非托管 DLL。 - 使用 .NET 集成(如 VSTO 或 Power Query):通过 .NET 程序集(通常是 DLL)扩展 Excel 功能。
下面分别介绍这两种方法:
在 VBA 中调用 DLL(非托管 DLL)
基本语法
使用 Declare 语句声明外部 DLL 中的函数:
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" _
(ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long) As Long
调用示例
Sub TestDLL()
Dim result As Long
result = MessageBox(0, "Hello from VBA!", "Title", 0)
MsgBox "MessageBox returned: " & result
End Sub
注意事项
- DLL 路径:Windows 会自动在系统目录(如
C:WindowsSystem32)中查找 DLL,如果是自定义 DLL,需将其放在 Excel 同一目录或系统路径下,或使用完整路径(不推荐,因跨平台问题)。 - 32位 vs 64位:
- 32位 Excel 只能调用 32位 DLL。
- 64位 Excel 只能调用 64位 DLL。
- 在 64位 Excel 中,
Declare语句需添加PtrSafe关键字:Declare PtrSafe Function MessageBox Lib "user32" Alias "MessageBoxA" _ (ByVal hwnd As LongPtr, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long) As LongPtr
- 数据类型匹配:确保 VBA 数据类型与 C/C++ DLL 中的参数类型一致(如
Long对应int,LongPtr对应指针)。
在 VBA 中调用 .NET DLL(COM 可见)
如果你希望调用 .NET 编写的 DLL,需将该 DLL 注册为 COM 组件:
创建 .NET DLL 并注册为 COM
- 在 Visual Studio 中创建类库项目。
- 启用“为 COM 互操作注册”选项。
- 生成 DLL 后,使用
regasm.exe注册:regasm MyLibrary.dll /codebase
在 VBA 中引用
- 打开 VBA 编辑器 → 工具 → 引用 → 浏览 → 选择注册后的类型库(.tlb 或 .dll)。
- 或使用
CreateObject动态创建:Dim obj As Object Set obj = CreateObject("MyLibrary.MyClass") obj.DoSomething
使用 Power Query(M 语言)调用 .NET DLL
Power Query 本身不支持直接调用 DLL,但可以通过以下方式间接实现:
- 编写自定义函数:使用 C# 编写 .NET 函数,编译为 DLL。
- 注册为 COM 组件:同上,注册为 COM。
- 通过 VBA 或 Power Automate 调用:从 Excel 中通过 VBA 调用 COM 组件,再返回结果给 Power Query。
⚠️ Power Query 不直接支持加载 .NET DLL,此方法较复杂,建议优先考虑 VBA 或 VSTO。
使用 VSTO(Visual Studio Tools for Office)
VSTO 允许你创建 Excel 加载项(Add-in),直接引用 .NET DLL:
- 在 Visual Studio 中创建“Excel 加载项”项目。
- 添加对目标 DLL 的引用。
- 在代码中使用该 DLL 的功能。
- 部署到 Excel 中。
常见问题
| 问题 | 解决方案 |
|---|---|
| “找不到入口点” | 检查 DLL 是否注册正确,或函数名是否匹配(注意 Alias) |
| “类型不匹配” | 检查 VBA 与 DLL 之间的数据类型是否一致 |
| “权限不足” | 以管理员身份运行 Excel,或正确注册 COM 组件 |
| “DLL 未注册” | 使用 regsvr32.exe 注册 COM DLL |
- 简单调用 Windows API 或 C/C++ DLL → 使用 VBA
Declare语句。 - 调用 .NET 代码 → 将 DLL 注册为 COM 组件,再通过 VBA 或 VSTO 调用。
- 复杂业务逻辑 → 建议使用 VSTO 或 Power Automate 集成。
如需具体示例(如调用某个特定 DLL),请提供 DLL 名称和函数签名,我可以给出更详细的代码。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/477237.html



