封裝我們的VBA代碼
是否可以將VBA代碼封裝到動態(tài)鏈接庫文件中,然后用Word調(diào)用?回答是肯定的。而且這樣做還有一個好處,即可以加快代碼的運行速度。
將VBA代碼封裝成動態(tài)鏈接庫
假如我們已經(jīng)寫好了一個VBA工程,而且運行無誤。
1.建立VB工程及一般性操作
首先,我們需要兩種工具,其中當然包括Microsoft Word,另外一種是Microsoft Basic 6.0。
打開Microsoft Basic 6.0,在“新建工程”中選取“ActiveX
DLL”,新建一個工程。在屬性窗口中將工程名改為VBAPrj,類模塊名改為VBACls。然后在“工程”菜單下打開“引用”,選取“Microsoft
Office 11.0 Object
Library”——這一步很是關鍵,切不可遺漏,然后保存工程。下面我們所做的是向工程內(nèi)添加代碼。
將VBA工程中的一個名為Test過程的代碼選定后復制,然后切換到VB編輯器,選中VB的工程管理器中的類模塊VBACls,將代碼粘貼至代碼編輯窗口中,于是這段代碼便成了類模塊VBACls一個方法,然后將工程編譯生成dll文件(如果編譯成功的話)。
在Word中,我們就可以通過類模塊VBACls建立的對象來調(diào)用此方法
修改代碼
雖然VBA源于VB,但是兩者畢竟存在著一些差異。因此,需要對轉(zhuǎn)移到VB中的VBA代碼做一些必要的修改。
(1)修改VBA代碼中所特有類型的對象。
如果我們所添加的代碼里有VBA所特有類型——如Document、Rang、BookMark等所建立的對象,編譯時會提示錯誤,因為VB不能夠識別這些對象。此時修改的方法是,將這些對象作為過程或函數(shù)的參數(shù)進行傳遞。需要注意的是,這些參數(shù)的類型都一律設為Object。
我們在過程Test中要訪問對象ThisDocument,但是VB無法識別ThisDocument,于是我們就為過程test添加一個參數(shù)Doc來傳遞ThisDocument,即Test可定義為Test(Doc
As Object)。
修改VBA所特有一般變量。
VB也無法識別VBA特有的一般變量,如ProtectType,同樣,我們也將其作為過程后函數(shù)的參數(shù)進行傳遞,不過其類型名都一律設為Variant。
(3)修改VBA所特有常量。
如果在VBA代碼中出現(xiàn)了這樣的語句:
ProtectionType = wdNoProtection
很明顯,wdNoProtection是Word所獨有的常量,不為VB所能識別,因而無法通過編譯。
如果我們知道了wdNoProtection的值,就可以直接將值賦給ProtectionType。但是接下來的一個問題是:我們怎樣才能獲得wdNoProtection的值呢?方法很簡單,就是讓Word“開口”告訴我們。
在Word一個事件中添加以下語句:
MsgBox CStr (wdNoProtection)
其中CStr是類型轉(zhuǎn)換函數(shù),返回參數(shù)相應的字符串。只要在Word中觸發(fā)此事件,會彈出一個對話窗,顯示“-1”,這就是Word所告訴我們的:wdNoProtection
的值是-1。于是我們就可以將語句 ProtectionType = wdNoProtection 改為 ProtectionType
= -1,
封裝用戶窗體
我們也可以將用戶窗體封裝到動態(tài)鏈接庫文件里。首先打開Word的VBA編輯器,選中工程資源管理器中的用戶窗體,點擊右鍵,選擇“導出文件”,選定路徑后,將窗體文件保存。然后切換到VB編輯器,在“工程”菜單中選擇“添加文件”命令,添加保存的窗體文件。添加結(jié)束后,我們會發(fā)現(xiàn)VB編輯器中的工程資源管理器中的設計器出現(xiàn)了剛添加的窗體名,選中后雙擊,在窗體編輯器中就會顯現(xiàn)所添加的用戶窗體。
到了這里,讀者會問:窗體還有代碼呢,怎么辦?先別急,試一試下面的操作,你就會明白,問題早已不再是問題了。選中工程資源管理器中的用戶窗體,點擊右鍵,選擇“查看代碼”,你就會高興發(fā)現(xiàn),在代碼編輯框中出現(xiàn)了窗體所對應的代碼。原來,在我們導入窗體文件的同時也導入了窗體的代碼!當然高興之余,不要忘了還要對這些代碼按照我們上述的方法進行必要修改,以保證代碼順利地通過編譯。這樣Word就可以通過類模塊VBACls間接地調(diào)用窗體。
在Word中引用動態(tài)鏈接庫
假如經(jīng)過我們編譯已生成了一個動態(tài)鏈接庫文件VBAPrj.dll,其中有一類模塊VBACls,此類模塊有一個方法Test(Doc As
Object)。
接下來我們所要做的是用Word調(diào)用Test,有三種方法可供選擇:
1.打開Word的VBA編輯器中ThisDocument代碼窗口,點"工具"菜單下的"引用"命令,在引用對話框中引用該動態(tài)鏈接庫。
調(diào)用代碼如下:
Dim VBACls As New VBAPrj.VBACls
VBACls.Test(ThisDocument)
2.如果知道該動態(tài)鏈接庫文件的位置,可以在ThisDocument代碼窗口以代碼形式引用, 代碼如下:
Private Sub Document_Open()
On Error Resume Next
Me.VBProject.References.AddFromFile "D:\VBAPrj.dll"
End Sub
將動態(tài)鏈接庫文件拷貝到Word文檔同一目錄下,可在ThisDocument代碼窗口中建立如下引用函數(shù):
Private Function GetProjectDoc() As Object
On Error Resume Next
Dim VBACls As Object
Set VBACls = CreateObject("VBAPrj.VBACls")
If VBACls Is Nothing Then
MsgBox "VBAPrj.dll必須和文檔在同一目錄下!"
Exit Function
End If
Set GetProjectDoc = VBACls
End Function
然后以以下代碼形式調(diào)用Test:
Dim objPrjDoc As Object
Set objPrjDoc = GetProjectDoc
Call objPrjDoc.Test(ThisDocument)
Set objPrjDoc = Nothing
只要動態(tài)鏈接庫與Word文檔處于同一目錄下,可保證程序的可移植性。
到目前為止,我們已完成了我們所要達的目的。此時,即便我們不對VBA工程設置密碼保護,別人也將很難窺視到我們的代碼。