我们如何在声明语句中使用字符串变量?

时间:2018-09-11 19:19:26

标签: excel vba

DLL函数的“正常”声明语句看起来像这样:

   Declare Sub subName Lib "path_to_lib" _
   Alias "aliasName" _
   (...)

在我的应用程序中,最好让用户选择其库位置,然后再将该位置写入单元格中。我想将此值传递给“ path_to_lib”参数,但是提取单元格值有困难。

我尝试将单元格值分配给全局变量,例如pathVariable并编写:

Declare Sub subName Lib " & pathVariable & "  _
   Alias "aliasName" _
   (...)

但是返回错误:找不到文件:&pathVariable&

我还尝试了双引号,返回了错误:File Not Found“&pathVariable&”

然后我尝试了三重引号,VBA有用地将其简化为双引号,给了我同样的错误。

这里有一些特殊的句法酱吗?甚至替代方法?还是应该放弃此(有用的)功能?

3 个答案:

答案 0 :(得分:2)

不能。模块的(declarations)部分中的所有内容都只能是 declarative 语句,这些语句不可执行:变量在声明性上下文中没有任何意义,不能有一个价值。尽管可以想象Const可以工作,但是如果尝试运行,则会出现编译错误:VBA将仅接受字符串文字。

expected: string constant

答案 1 :(得分:2)

我接受了Mathieu的回答,因为它可以直接回答我的问题。

但是,对于任何想知道如何解决动态dll位置问题的用户,我有以下解决方案:

调用dll时,系统首先搜索当前工作目录,然后搜索用户和环境路径变量。我发现很难修改用于dll调用的path用户变量,因此我通过添加以下内容来利用第一部分:

    ChDir (dllFolder)

在dll调用之前。声明语句可以像以前一样保留,只是库名用引号引起来:

   Declare Sub subName Lib "DLLName.dll" _
   Alias "aliasName" _
   (...)

如果程序的其他部分希望位于某个目录中,请随时跟踪上一个目录,并在调用后将其改回。

答案 2 :(得分:0)

虽然不能用这种方式声明,但至少可以加载库和函数。

hDLL = LoadLibrary(myDLL)
hProc = GetProcAddress(hDLL, "myProcName")

所以现在我们有了一个指向函数的指针。调用该函数有点麻烦,但您可以使用 DispCallFunc 来执行此操作。

如前所述,这有点乱LaVolpe on the vbforums made a neat class for this kind of thing

Private cMyDLL as cUniversalDLLCalls
set cMyDLL = new cUniversalDLLCalls
'... later ...
cMyDLL.CallFunction_DLL(myDllPath, "myMethodName", hasStrinParams, returnType, CC_STDCALL, param1, param2, param3, ...)

警告:

此类仅在 Windows 操作系统上受支持