首页 > 解决方案 > VBA:如何为声明语句设置动态库路径?

问题描述

我在 Excel 的 VBA 中有一个程序,需要从 DLL 调用一些方法,在代码开发方面,两者都在我的控制之下。我需要能够选择在运行时应该使用什么 DLL 库(来自各种版本),但是 VBA 的 Declare 语句只允许 Lib 路径中的常量。

目标是多重的​​:

  1. 能够在运行时从一个 Excel 工作簿中选择库版本
  2. 由于使用了很多库方法,因此简化了代码维护,这意味着在更改库路径时要编辑大量的 Declare 语句
  3. 在运行时从各种预定义位置动态搜索库,以符合部署目的。在开发环境中,库位于 dev 目录中,但对于最终用户,库可能位于 3 个不同的位置:工作簿路径、计算机上的特定目录或网络驱动器中的特定目录。

我试图在 Public Const 变量中声明路径,但它不起作用:

' This work
Private Declare PtrSafe Function addAmplifier Lib "path\to\lib.dll" (...) As Integer

' This don't work
Public Const libPath As String = "path\to\lib.dll"
Private Declare PtrSafe Function addAmplifier Lib libPath (...) As Integer

是否有劫持方式在 Declare 语句中使用变量?或者有没有办法创建一个 VBA 模块,能够编辑 Declare 语句所在的第二个模块的 VBA 代码,并用正则表达式替换所有出现的字符串,保存 VBA 项目然后执行模块?更正式地说:VBA 代码可以在运行时自行重写吗?

标签: excelvbadynamicdllpath

解决方案


正如L8n所建议的,更改工作目录的解决方案效果很好。

因此,如果库位于工作簿路径的子文件夹中,我们可以在每次调用 DLL 本地函数时执行以下过程:

  1. 更改工作目录以进入子文件夹ChDir()
  2. 执行原生函数
  3. 返回到父文件夹ChDir()

但是,我怀疑频繁调用ChDir()可能会减慢 VBA 的执行速度,因为它似乎还使用 VBA 运行时中的一些隐藏变量来更新执行上下文。


推荐阅读