繁体   English   中英

在excel-vba中使用DLL

[英]Use DLL in excel-vba

我很想知道如何在vba中声明和使用DLL。 我有一个用C编写的代码,我想使用excel表中的一些数据来测试我的c代码。 这怎么可能? 提前谢谢了

您必须在VBA模块中声明该功能:对于命令:

[Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]

对于函数调用:

[Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]

我的一个应用程序中的一些示例:

Public Declare Function apiGetUserName Lib "advapi32.dll" Alias _
    "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Declare Function WM_apiGetDeviceCaps Lib "gdi32" Alias _
    "GetDeviceCaps" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Declare Function WM_apiGetDesktopWindow Lib "user32" Alias _
    "GetDesktopWindow" () As Long
Declare Function WM_apiGetDC Lib "user32" Alias _
    "GetDC" (ByVal hwnd As Long) As Long
Declare Function WM_apiReleaseDC Lib "user32" Alias _
    "ReleaseDC" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Declare Function WM_apiGetSystemMetrics Lib "user32" Alias _
    "GetSystemMetrics" (ByVal nIndex As Long) As Long
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
    (ByVal lpBuffer As String, nSize As Long) As Long

编辑添加PtrSafe信息:请参阅MSDN PtrSafe语言参考

在64位版本的Office中运行时,Declare语句必须包含PtrSafe关键字。 PtrSafe关键字断言Declare语句在64位开发环境中运行是安全的。 将PtrSafe关键字添加到Declare语句只表示Declare语句显式指向64位,语句中需要存储64位的所有数据类型(包括返回值和参数)仍必须修改为使用64位数量保存要么是LongLong用于64位积分,要么是LongPtr用于指针和句柄。

在模块的顶部包含声明部分。 在这里,您通常会找到您的期权声明(如果存在)。

您可以在同一区域声明您的DLL函数,您可以在任何过程之外执行此操作。

在64位MS Office发布之前的几天,您只需使用以下参数声明DLL过程:

[Bracket Statements]是可选的
Function可与Sub互换 - 您不会在子上使用[As Type]

[Public|Private] Declare Function "PublicName" Lib LibName _ 
    [Alias "AliasName"] [(Arguments)] [As Type].

以下是sleep API的示例:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

但是,MS发布了他们软件的64位版本,并附带了一个新版本的VBA,称为VBA7 问题是64位操作系统和软件使用不同的内存指针和句柄,因此重要的是VBA知道declare语句在64位环境中运行是安全的。 为了让VBA知道这一点,你需要修改函数的数据类型,通常是内存指针类型为LongPtr而不是Long (或者数量应该LongLong类型)。

您可以使用以下声明通知VBA您的声明是正确的:

[Private|Public] Declare PtrSafe Function...

声明为PtrSafe的相同Sleep API的示例:

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

如果您不确定最终用户是否使用新的VBA7? 幸运的是, If...Then如果前缀为#If...Then声明中有声明。 您可以使用以上声明使代码适用于任何VBA环境:

#If VBA7 Then
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM