如何在一个excel文件的同一个目录下使用dll

这与我的另一个问题有些相关。

我一直在使用DLL来创build一个Excel电子表格。 一切正在与DLL和Excel正在使用它就好了。 但是有可能指定一个dll驻留在同一个目录下的excel文件时声明函数?

Declare Sub FortranCall Lib "Fcall.dll" (r1 As Long, ByVal num As String) 

不幸的是,这不起作用,我不得不使用类似于:

 Declare Sub FortranCall Lib "C:\temp\Fcall.dll" (r1 As Long, ByVal num As String) 

这是有效的,但是当分发给我的同事时会引起头痛。 将dll放在c:\ windows \ system32等中也不是真正的选项。

以下是从VBA动态加载/调用DLL的三种可能性 ,包括指向相关信息的链接和一些示例代码。 不能说我曾经不得不使用这里描述的任何解决方案,但是就VBA需要静态路径而言,这似乎是对这些选项的合理探索。

  1. 在运行时创建一个新的模块(可以从磁盘导入.bas文件,不需要用字符串文字对模块进行硬编码),使用VBIDE Extensibility API。 缺点:没有编译时验证; 您将需要使用字符串型的Application.Run调用来调用它。 需要可信任的编程访问VBIDE API(即,您允许VBA执行生成代码的代码,然后执行…就像宏病毒一样)。
  2. 使用LoadLibrary Win32 API …现在你已经得到了指针和地址: 这个可怕的代码 (.zip下载)本质上是一个巨大的不可维护的破解,它使用汇编语言来启用API函数的名称调用。 看起来它只适用于受支持的Win32 API函数的一个子集。
  3. 改变DLL的搜索路径,但是那需要在运行时添加动态代码,所以不妨跟上面的。

这是另一个可能的解决方案 ,建议在调用DLL之前以编程方式更新PATH环境变量。 不是一个坏主意,如果它可以工作,你可以添加到你的工作簿公开事件。

祝你好运!

我通常关心这个的方式是增加:

 Dim CurrentPath As String CurrentPath = CurDir() ChDir (ThisWorkbook.Path) 

若要:Private Sub Workbook_Open()

ChDir()应该做的伎俩。 它可能无法在网络文件夹上工作。

 Declare Sub FortranCall Lib "Fcall.dll" (r1 As Long, ByVal num As String) ... Dim CurrentPath As String CurrentPath = CurDir() ChDir (ThisWorkbook.Path) Call FortranCall(r, n) ChDir (CurrentPath) ' Change back to original directory 

现在将您的.dll保存在工作簿所在的文件夹中。

您可以将该DLL放在某个目录中,并将其添加到EnVar路径中。

ActiveWorkbook.Path为您提供包含当前活动工作簿的文件夹的完整路径。 所以试试这个:

 Declare Sub FortranCall Lib ActiveWorkbook.Path & "\Fcall.dll" (r1 As Long, ByVal num As String)