萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 辦公室軟體 >  >> Word 教學 >> Word 使用技巧

將 VBA 程式碼編譯封裝為 DLL 動態連結庫完整指南

為了保護 VBA 程式碼不被輕易破解,並提升執行速度,我們可以將 VBA 專案編譯封裝成 DLL 動態連結庫,再由 Word 呼叫。本文詳細說明從建立 VB 專案、修改程式碼差異、封裝使用者表單,到在 Word 中引用 DLL 的完整流程。

一、為什麼要編譯成 DLL?

VBA 程式碼以原始碼形式儲存在文件中,容易被檢視與修改。透過 Visual Basic 6.0 編譯為 DLL,程式碼將轉為機器碼,不僅難以逆向工程,執行效率也會顯著提升。

二、將 VBA 程式碼封裝成動態連結庫

1. 建立 VB 專案與基本操作

  • 開啟 Microsoft Visual Basic 6.0,選擇 「ActiveX DLL」 專案類型。
  • 在屬性視窗將專案名稱改為 VBAPrj,類別模組名稱改為 VBACls。
  • 在「專案」→「參考」中勾選 「Microsoft Office 11.0 Object Library」(此步驟關鍵,不可遺漏)。
  • 將 VBA 專案中的程序(如 Test)複製貼上至 VB 的類別模組 VBACls 中,使其成為類別的方法。
  • 編譯專案產生 VBAPrj.dll 檔案。

2. 修正 VBA 與 VB 的程式碼差異

VBA 與 VB 6.0 雖同源但有差異,需對移植的程式碼做必要修改:

A. 修改 VBA 特有物件型別

如 Document、Range、Bookmark 等物件,VB 無法辨識。解決方法:將這些物件作為參數傳遞,參數型別統一設為 Object。
範例:原 Sub Test() 需存取 ThisDocument,改為 Sub Test(Doc As Object),呼叫時傳入 ThisDocument。

B. 修改 VBA 特有一般變數

如 ProtectType 等常數,VB 也不認得。同樣改為參數傳遞,型別設為 Variant。

C. 修改 VBA 特有常數

例如 wdNoProtection 是 Word 專有常數。可在 Word 的立即執行視窗輸入 MsgBox CStr(wdNoProtection) 取得其數值(如 -1),再將程式碼中的常數直接替換為數值。

三、封裝使用者表單

  1. 在 Word VBA 編輯器中,於專案總管右鍵選擇使用者表單 → 「匯出檔案」 儲存 .frm 檔。
  2. 切換至 VB 編輯器,「專案」→「加入檔案」匯入該 .frm,表單與其程式碼將一併匯入。
  3. 對匯入的表單程式碼同樣套用上述修正方法,確保編譯通過。

四、在 Word 中引用動態連結庫

假設已產生 VBAPrj.dll,包含類別 VBACls 與方法 Test(Doc As Object),提供三種引用方式:

方法 1:透過 VBA 編輯器「工具」→「參考」加入 DLL

Dim VBACls As New VBAPrj.VBACls
VBACls.Test(ThisDocument)

方法 2:以程式碼指定 DLL 路徑引用

Private Sub Document_Open()
    On Error Resume Next
    Me.VBProject.References.AddFromFile "D:\VBAPrj.dll"
End Sub

方法 3:將 DLL 放在文件同目錄,使用 CreateObject(推薦)

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

' 呼叫範例
Dim objPrjDoc As Object
Set objPrjDoc = GetProjectDoc
Call objPrjDoc.Test(ThisDocument)
Set objPrjDoc = Nothing

建議使用方法 3,雖較繁瑣,但只要 DLL 與文件同目錄,即可確保程式碼可攜性,不受絕對路徑限制。

完成上述步驟後,即使不設定 VBA 專案密碼,外人也難以窺探核心程式碼,達到保護與效能雙重效果。

copyright © 萬盛學電腦網 all rights reserved