我在Excel的VBA中有一个程序,需要从DLL调用某些方法,这两者都在我的代码开发方面受到控制。我需要能够在运行时选择哪个DLL库(来自各个版本(,但是VBA的声明仅允许在LIB路径中使用常数。
目标是多个:
- 能够从一个Excel Workbook 从运行时选择库版本
- 使用代码维护,因为使用了许多库方法,这意味着更改库路径时要编辑的声明
- 在运行时动态搜索库从各个预定义位置,以符合部署目的。在开发环境中,库位于DEV目录中,但是对于最终用户,库可能位于3个不同的位置:工作簿路径,计算机上的特定目录或网络驱动器中的特定目录。
我试图在公共const变量中声明路径,但行之有效:
' This work
Private Declare PtrSafe Function addAmplifier Lib "pathtolib.dll" (...) As Integer
' This don't work
Public Const libPath As String = "pathtolib.dll"
Private Declare PtrSafe Function addAmplifier Lib libPath (...) As Integer
是否有劫机方式可以在声明语句中使用变量?还是有一种方法可以创建一个能够编辑声明语句所在的第二个模块的VBA代码并替换为REGEXP的VBA代码,然后替换为字符串的出现,保存VBA项目然后执行模块?更正式:VBA代码可以在运行时重写?
l8n 建议,更改工作目录的解决方案正常。
因此,如果库位于工作簿路径中的子文件夹中,我们可以每次调用DLL本机函数时进行以下过程:
- 更改工作目录以使用
ChDir()
进入子文件夹 - 执行本机函数
- 使用
ChDir()
返回父文件夹
但是,我怀疑 ChDir()
的频繁调用可能会减慢VBA的执行速度,因为它似乎还会更新执行上下文,并使用VBA运行时的一些隐藏变量更新执行上下文。