一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

利用VB封裝VBA代碼,?生成DLL

 昵稱QAb6ICvc 2013-06-08

利用VB封裝VBA代碼, 生成DLL

(2010-04-19 14:03:46)

封裝我們的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工程設置密碼保護,別人也將很難窺視到我們的代碼。

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲一区二区久久观看| 黄色国产精品一区二区三区| 久久re6热在线视频| 日本高清一区免费不卡| 国产麻豆一区二区三区在| 欧美日韩亚洲国产精品| 欧美一区二区口爆吞精| 日韩欧美国产三级在线观看| 日本一区二区三区久久娇喘| 91香蕉视频精品在线看| 欧美夫妻性生活一区二区| 欧美中文日韩一区久久| 国产又粗又猛又长又大| 国产真人无遮挡免费视频一区| 成人你懂的在线免费视频| 日韩欧美一区二区黄色| 成人免费观看视频免费| 亚洲熟妇熟女久久精品| 91人妻人人揉人人澡人| 色婷婷国产熟妇人妻露脸| 国产精品二区三区免费播放心| 日本三区不卡高清更新二区| 大尺度激情福利视频在线观看| 在线观看视频国产你懂的| 日韩欧美国产三级在线观看| 久久热九九这里只有精品| 国内精品一区二区欧美| 国产又长又粗又爽免费视频| 国内外激情免费在线视频| 国产精品一区二区成人在线| 亚洲国产精品久久精品成人| 91插插插外国一区二区| 中文人妻精品一区二区三区四区| 午夜福利黄片免费观看| 日本加勒比不卡二三四区| 亚洲成人精品免费在线观看| 午夜日韩在线观看视频| 欧美色婷婷综合狠狠爱| 日韩精品一区二区毛片| 久久99热成人网不卡| 日韩欧美好看的剧情片免费|