實例說明在VBA中如何使用Windows API

在Excel VBA中可以引用Excel工作表函數,也可以引用Excel VBA函數,還可以引用用戶自己定義的函數或過程。除此以外,還可以調用Windows API。

Windows API包括幾千個可調用的函數,這些函數是Windows提供給應用程序與操作系統的接口,他們猶如“積木塊”一樣,可以搭建出各種界面豐富,功能靈活的應用程序。它們大致可以分為以下幾個大類:

	基本服務;
組件服務;
用戶界面服務;
圖形多媒體服務;
消息和協作;
網絡;
Web服務。

Windows API使用 .lib 文件。.lib 文件也就是庫文件,分為靜態庫文件和動態庫文件(DLL)

靜態鏈接就是把靜態鏈接庫中的函數直接複製到程序中,成為程序的一部分。

動態鏈接是指在程序運行時將已駐留在內存中的動態鏈接庫中的函數在需要時鏈接起來一起運行。

API 的 dll 在 windows 系統的 system32 目錄下, 圖形界面相關的 API 在 USER32.dll 裡,進程、文件之類的操作在 kernel32.dll 裡。MSDN 的每個函數都會說明它在哪個頭文件, 哪個 lib, 哪個 dll 裡的。

動態鏈接庫中的函數可以被VBA調用,下面就以一個實例來說明。

在kernel32.dll中有一個 GetSystemDirectory()函數,可以到到Windows的系統路徑。以下就是通過一個過程來調用這個函數的實例:

Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Sub info()
Dim sPath As String * 260, lLen As Long
lLen = GetSystemDirectory(sPath, 260)
Text3 = Left(sPath, lLen)
VBA.MsgBox (Text3)
End Sub

效果如下:

實例說明在VBA中如何使用Windows API

1 調用API操作流程

1.1查詢如何傳遞參數到DLL函數的Declare語句格式

為了調用Windows API中的函數,需要描述這些可用的函數的文檔規範,如何在VBA中聲明這些函數,以及如何調用它們。下面是兩個有用的資源:

I 可以使用API Viewer加載宏查找和複製需要的Declare語句。可以在下面的站點下載API聲明查看器:

http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html

登錄以下頁面後在以下點擊下載:

實例說明在VBA中如何使用Windows API

安裝後打開需要的文件:

實例說明在VBA中如何使用Windows API

實例說明在VBA中如何使用Windows API

II Microsoft Platform SDK,包含複雜的Windows API文檔。可以在下面的地址中查看:http://www.office-cn.net/t/api/index.html?apihelp.htm

實例說明在VBA中如何使用Windows API

可以使用的API函數類別:

實例說明在VBA中如何使用Windows API

1.2 使用Declare語句

在從VBA中調用DLL裡的函數之前,必須為VBA提供在哪裡找到函數以及如何調用該函數的信息:

Declare語句是一個定義,告訴VBA在哪裡找到特定的DLL函數以及如何調用該函數。在代碼中添加Declare語句最簡單的辦法是使用API Viewer加載宏,其中包含Windows API中大多數函數的Declare語句,也包含一些函數所需要的常量和類型定義。

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

下面是GetTempPath函數的Declare語句的示例,該函數返回Windows臨時文件夾的路徑(默認為C:\Windows\Temp):

Private Declare Function GetTempPath Lib "kernel32" _
Alias "GetTempPathA" (ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long

I 關鍵字Declare告訴VBA在工程中要包含的DLL函數的定義。在標準模塊中的Declare語句可以是公共的或私有的,取決於你希望API函數僅用於單個模塊還是整個工程。在類模塊中,Declare語句必須是私有的。

II 在關鍵字Function之後是函數的名字,具體地說,是從VBA中調用該函數時使用的名字。這個名字可以與API函數本身的名字相同,也可以在Declare語句中使用關鍵字Alias指定打算在VBA中通過不同的名字(別名)調用該函數。

III 在上面的示例中,在DLL中API函數的名字是GetTempPathA,從VBA中調用該函數時使用的名字是GetTempPath。注意,DLL函數的實際名字出現在關鍵字Alias之後,同時也注意到GetTempPath是Win32API.txt文件用於該函數的別名(有充分必要使用別名),但你可以將其改變為任何你想要的名字。

IV 關鍵字Lib指定包含函數的DLL。

1.3 在過程中調用API函數。

2 實例應用場景

有如下任務:判斷一個文件框如果內容為空,則顯示一個提示文本框進行提示,並在3秒後自動消息。

我們知道,VBA提供以下代碼的提示對話框,但它需要用戶自己點擊關閉按鈕才可以關閉,不能滿足我們的需要。

MsgBox ("提示:編號不能為空!")

2.1 插入用戶窗體,並添加兩個文本框,如下:

實例說明在VBA中如何使用Windows API

2.2 在VBE中插入模塊,並添加以下代碼:

Private Declare Function MsgBoxTimeout Lib "user32" _
Alias "MessageBoxTimeoutA" ( _
ByVal hwnd As Long, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal wType As VbMsgBoxStyle, _
ByVal wlange As Long, _
ByVal dwTimeout As Long) _
As Long
Sub PopupMsgbox(Optional prompt As String = "OK", Optional title As String = "友情提示", Optional seconds As Long = 300)
MsgBoxTimeOut 0, prompt, title, 64, 0, seconds
End Sub

2.3 為文本框添加事件代碼:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1.Value = "" Then
'MsgBox ("提示:編號不能為空!")
PopupMsgbox "編號不能為空!", "提示", 1500 '1.5秒後提示窗口自動關閉
End If
End Sub

2.4 當文本框為空,鼠標光標點擊到文本框以外的其它位置時,就會彈出提示對話框,並在1.5秒後自動關閉,如下:

實例說明在VBA中如何使用Windows API

MsgBoxTimeout()是一個未公開的 API 函數。

此函數的參數如下:

  • hwnd:消息框擁有者窗口的句柄,可以設為 0
  • lpText:消息框顯示內容,類似於 MsgBox 函數的第一個參數 Prompt
  • lpCaption:消息框標題,類似於 MsgBox 函數的第三個參數 Caption
  • wType:消息框類型,類似於 MsgBox 函數的第二個參數 Buttons
  • wlange:函數擴展,一般取 0
  • dwTimeout:消息框延遲關閉時間,單位為毫秒

總結上例使用API的流程:

I Declare MsgBoxTimeOut

II 定義PopupMsgbox過程,在此過程中調用了MsgBoxTimeOut

III 在其他過程中調用PopupMsgbox()

Dim i As Long
i = MsgBoxTimeout(0, "編號不能為空!", "提示", vbYesNo, 0, 1500)

-End-


分享到:


相關文章: