我們都知道,Visual Basic® for Applications (VBA) 是一種功能強(qiáng)大的編程語言,可用來開發(fā)自定義 Microsoft Office 解決方案。將 VBA 和一個或多個 Office 應(yīng)用程序?qū)ο竽K配合使用,您可以輕松地修改 Office 應(yīng)用程序的功能,或者使兩個或多個應(yīng)用程序協(xié)同工作,從而完成單個應(yīng)用程序無法完成的任務(wù)。VBA 只能控制操作系統(tǒng)的一小部分,即直接向 VBA 公開的那些函數(shù)和對象。Windows® 應(yīng)用程序編程接口 (API) 提供了眾多函數(shù),可讓您深入控制操作系統(tǒng)的絕大部分內(nèi)容。您可以從 VBA 中調(diào)用 Windows API 函數(shù),擴(kuò)展和優(yōu)化自定義 Office 解決方案。
在這個月的專欄中,我將為您簡單介紹如何在 VBA 中使用 Windows API,并提供一些有用的示例。您可以復(fù)制這些示例,在自己的自定義解決方案中直接使用它們。
警告:調(diào)用 Windows API 和其他 DLL 函數(shù)可能會影響您的應(yīng)用程序的可靠性。當(dāng)您從自己的代碼中直接調(diào)用 DLL 函數(shù)時,會跳過 VBA 在正常情況下提供的一些安全機(jī)制。如果您錯誤地定義或調(diào)用 DLL 函數(shù)(任何程序員都難免犯這類錯誤),就可能會產(chǎn)生應(yīng)用程序錯誤,也稱為常規(guī)保護(hù)錯誤,即 GPF。如果使用了 API,那么在運(yùn)行代碼前一定要保存項(xiàng)目,并確保已理解調(diào)用 DLL 函數(shù)的原理。
理解 API
簡單地說,API 就是您用來控制組件、應(yīng)用程序或操作系統(tǒng)的一組函數(shù)。API 通常包含一個或多個可以提供某些特定功能的 DLL。
DLL 是一些包含任何 Windows 應(yīng)用程序都可以調(diào)用的函數(shù)的文件。在運(yùn)行過程中,DLL 中的函數(shù)“動態(tài)地鏈接”到調(diào)用它的應(yīng)用程序中。不管有多少個應(yīng)用程序調(diào)用 DLL 中的函數(shù),該函數(shù)只存在于驅(qū)動器上的一個單一的文件中,并且該 DLL 在內(nèi)存中只創(chuàng)建一次。
您最常聽說的 API 可能是 Windows API,它包含組成 Windows 操作系統(tǒng)的所有 DLL。每個 Windows 應(yīng)用程序都直接或間接地與 Windows API 交互作用。Windows API 可以保證所有在 Windows 中運(yùn)行的應(yīng)用程序都按照統(tǒng)一的方式運(yùn)行。
除了 Windows API 外,還有其他一些公開的 API。例如,郵件應(yīng)用程序編程接口 (MAPI) 是用于編寫電子郵件應(yīng)用程序的一組 DLL。
傳統(tǒng)上 API 是為那些創(chuàng)建 Windows 應(yīng)用程序的 C 和 C++ 程序員編寫的,但使用 VBA 也可以調(diào)用 DLL 中的函數(shù)。由于大部分 DLL 及其文檔最初是為 C/C++ 程序員編寫的,所以調(diào)用 DLL 函數(shù)和調(diào)用 VBA 函數(shù)可能會有所不同。為了使用 API,您需要了解如何向 DLL 函數(shù)傳遞參數(shù)。
為了調(diào)用 Windows API 中的函數(shù),您需要參考有關(guān)文檔,了解有哪些函數(shù)可供使用以及如何在 VBA 中聲明和調(diào)用這些函數(shù)。以下是兩個很有用的資源:
1. 文件 Win32API.txt,包含在 Microsoft Office 2000 Developer 和 Microsoft Visual Basic 中。文件 Win32API.txt 包含了大部分 Windows API 函數(shù)所使用的 VBA Declare 語句。您可以使用 API Viewer 外接程序(同樣包含在 Office 2000 Developer 中)來查找和復(fù)制您需要的 Declare 語句。有關(guān)安裝和使用 API Viewer 外接程序的信息,請參閱 Office 2000 Developer 中的 apiload.txt 文件。Microsoft Visual Basic 附帶的 API Viewer 應(yīng)用程序具有相同的功能,只不過它是一個獨(dú)立的應(yīng)用程序。
初次運(yùn)行 API Viewer 應(yīng)用程序時,它將加載 Win32API.txt 文件。該文本文件可以導(dǎo)出到一個 Microsoft Access 數(shù)據(jù)庫(.mdb 文件)中,這樣能加速加載和瀏覽 API 數(shù)據(jù)的過程。
2. Microsoft Platform SDK,包含完整的 Windows API 文檔。它可以在 Microsoft Developer Network 站點(diǎn)上免費(fèi)獲得(英文)。
使用 Declare 語句
在從 VBA 調(diào)用 DLL 中的函數(shù)前,您必須先告訴 VBA 該函數(shù)位于何處以及如何調(diào)用它。有兩種方法可以實(shí)現(xiàn)這一目的:
1. 設(shè)置 DLL 類型庫的引用。
2. 在模塊中使用 Declare 語句。
設(shè)置 DLL 類型庫的引用是使用 DLL 函數(shù)的最簡單的方法。一旦設(shè)置了引用,您便可以調(diào)用 DLL 函數(shù),就好象它是項(xiàng)目中的一部分。然而,這里有一些需要注意的地方。首先,設(shè)置引用多個類型庫會影響應(yīng)用程序的性能。其次,并非所有 DLL 都提供類型庫。盡管可以設(shè)置引用一個不提供類型庫的 DLL,但卻不能象將其作為項(xiàng)目中的一部分那樣調(diào)用該 DLL 中的函數(shù)。
請注意,組成 Windows API 的 DLL 不提供類型庫,因而不能通過設(shè)置引用這些 DLL 來調(diào)用其中的函數(shù)。要調(diào)用 Windows API 中的函數(shù),您必須在項(xiàng)目中的模塊聲明部分插入一條 Declare 語句。
Declare 語句是一條定義語句,它告訴 VBA 從何處獲得特定的 DLL 函數(shù)以及如何調(diào)用該函數(shù)。在代碼中添加 Declare 語句的最簡單方法是使用 API Viewer 外接程序,該程序包含了大部分 Windows API 函數(shù)所使用的 Declare 語句,以及一些函數(shù)需要的常量和類型定義。
下例所示為 GetTempPath 函數(shù)的 Declare 語句,該函數(shù)將返回 Windows 臨時文件夾的路徑(默認(rèn)情況下為 C:\Windows\Temp