Excel VBA:如何为declare语句设置动态库路径?

Excel VBA:如何为declare语句设置动态库路径?,excel,vba,dynamic,dll,path,Excel,Vba,Dynamic,Dll,Path,我在Excel的VBA中有一个程序,需要从DLL调用一些方法,在代码开发方面,这两个方法都在我的控制之下。我需要能够选择在运行时应该使用哪个DLL库(来自各种版本),但是VBA中的Declare语句只允许库路径中的常量 目标是多方面的: 能够在运行时从一个Excel工作簿中选择库版本 简化代码维护,因为使用了很多库方法,这意味着在库路径更改时需要编辑很多Declare语句 在运行时从各种预定义位置动态搜索库,以符合部署目的。在dev环境中,库位于dev目录中,但对于最终用户,库可以位于3个不同的

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

目标是多方面的:

  • 能够在运行时从一个Excel工作簿中选择库版本
  • 简化代码维护,因为使用了很多库方法,这意味着在库路径更改时需要编辑很多Declare语句
  • 在运行时从各种预定义位置动态搜索库,以符合部署目的。在dev环境中,库位于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替换所有出现的字符串,保存VBA项目,然后执行该模块?更正式地说:VBA代码可以在运行时重写自身吗?

    正如L8n所建议的,更改工作目录的解决方案可以很好地工作

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

  • 使用
    ChDir()
  • 执行本机函数
  • 使用
    ChDir()返回父文件夹

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

    更正式地说:VBA代码是否可以在运行时重写自身?简言之:是的:但这不是真正的建议,因为它是一个潜在的攻击路径。。。此外,防病毒软件可能会标记代码。感谢您的澄清,所以这不是我想要的方式:我的应用程序必须是安全的,并且将在带有公司防病毒软件的计算机上运行,并且我无法管理白名单。也许此解决方案能有所帮助?正在更改工作目录。。。有趣的解决方案,我会试试,谢谢