VBA:如何为声明语句设置动态库路径?

时间:2019-06-25 07:13:44

标签: excel vba dynamic dll path

我在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代码,并用regexp替换所有出现的String,保存VBA项目然后执行该模块?更正式地说:VBA代码可以在运行时自行重写吗?

1 个答案:

答案 0 :(得分:0)

正如 L8n 所建议的,更改工作目录的解决方案工作正常。

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

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

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