excel - VBA:如何为声明语句设置动态库路径?
问题描述
我在 Excel 的 VBA 中有一个程序,需要从 DLL 调用一些方法,在代码开发方面,两者都在我的控制之下。我需要能够选择在运行时应该使用什么 DLL 库(来自各种版本),但是 VBA 的 Declare 语句只允许 Lib 路径中的常量。
目标是多重的:
- 能够在运行时从一个 Excel 工作簿中选择库版本
- 由于使用了很多库方法,因此简化了代码维护,这意味着在更改库路径时要编辑大量的 Declare 语句
- 在运行时从各种预定义位置动态搜索库,以符合部署目的。在开发环境中,库位于 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 代码可以在运行时自行重写吗?
解决方案
正如L8n所建议的,更改工作目录的解决方案效果很好。
因此,如果库位于工作簿路径的子文件夹中,我们可以在每次调用 DLL 本地函数时执行以下过程:
- 更改工作目录以进入子文件夹
ChDir()
- 执行原生函数
- 返回到父文件夹
ChDir()
但是,我怀疑频繁调用ChDir()
可能会减慢 VBA 的执行速度,因为它似乎还使用 VBA 运行时中的一些隐藏变量来更新执行上下文。
推荐阅读
- javascript - 这是在js中进行回调的正确方法吗?
- python - 将 1D 数组连接到 3D 数组
- excel - 使密码不可见以保护工作表
- sql - Laravel 原始查询:总计与选择内部计数
- android - 有什么方法可以测试新的 google play referrer api 而无需在 Google Play 商店中发布应用程序?
- react-native - React Native Camera - 如何使捕获按钮粘在手机屏幕的一侧?
- r - R:更改列标签的高度/位置
- python - 串联多个神经网络的方法(非并行)
- javascript - Microsoft Bot Framework - 读取 bot 文件时出错,但所有环境变量都正确?
- angular6 - 如何以角度 6 获取数据对象的长度