用VB.NET(Visual Basic 2010)封裝EXCEL VBA為DLL_COM組件(一)


為了保護自己辛辛苦苦編寫的Excel VBA代碼不被盜用,我們需要對Excel VBA代碼進行加密。通常的做法是利用給工程設置密碼的方法實現加密,對於這類加密方法,由於存在安全度低、易破解等問題,因此往往起不到應有的效果。通過將Excel VBA代碼封裝成DLL動態鏈接庫,可有效防止代碼被非法查看。

在百度里搜索“封裝EXCEL VBA”關鍵字,有很多封裝VBA的教程,但99%是利用VB6(Microsoft Visual Basic 6.0)來封裝,主要原因是VB6的操作界面及語法與Excel的VBA具有極高的相似度。2002年,隨着VB.NET的引入,大部分人都放棄使用VB而選擇VB.NET,VB6終將被淘汰,因此我們必須與時俱進,學習用Microsoft Visual Basic 2010封裝VBA。我們可以在VS里建立com類項目,把NET類庫的一些方法重新包裝后暴露給VBA使用。

案例:在工作表的C1單元格得出A1單元格+B1單元格的值。

設計的VBA代碼:

1 Sub Test()
2     On Error Resume Next
3     Range("C1").Value = Range("A1").Value + Range("B1").Value
4 End Sub

一、使用Microsoft Visual Basic 2010制作DLL文件

工具及原料:

1Microsoft Office Excel 2003

2Microsoft Visual Studio 2010

3Windows XP 32位操作系統

操作步驟:

1、啟動Microsoft Visual Studio 2010,在起始頁界面點擊“新建項目”,如圖1所示。

1

2、在彈出的“新建項目”對話框選擇“類庫”,修改名稱為“VBADLL”,點擊確定,如圖2所示。

 

2

3、在右側的“解決方案資源管理器”視圖里,找到系統默認建立的類庫“Class1.vb”,右鍵刪除該類庫,如圖3所示。

3

4、在菜單欄上點擊“項目”——“添加類”,在彈出的“添加新項”窗口里往下拉,選擇“com類”,並修改名稱為ComExcel.vb。然后點擊“添加”。如圖4所示。

 

4

5、在菜單欄上點擊“項目”——“VBADLL屬性”,在“VBADLL”窗口里點擊“引用”——“添加”,如圖5所示。

 

5

6、在彈出的“添加引用”窗口里點擊“COM”,往下拉選擇“Microsoft Excel 11.0 Object Library”,然后點擊“確定”,如圖6所示。

 

6

注意,不同版本的EXCEL在“添加引用”——“COM”窗口里顯示的版本號是不同的:

EXCEL2000Microsoft Excel 9.0 Object Library

EXCEL2002Microsoft Excel 10.0 Object Library

EXCEL2003Microsoft Excel 11.0 Object Library

EXCEL2007Microsoft Excel 12.0 Object Library

EXCEL2010Microsoft Excel 14.0 Object Library

EXCEL2013Microsoft Excel 15.0 Object Library

7、按圖7所示把窗口滾動條往下拉,勾選“Microsoft Office Interop”。 

7

8、在右側的“解決方案資源管理器”視圖里,找到第4步添加的類ComExcel.vb,右擊彈出的菜單里點擊“查看代碼”,在ComExcel.vb代碼窗口里添加如下代碼。

 

 1 Public Sub Test()
 2 
 3         On Error Resume Next
 4 
 5         Dim VbApp As Excel.Application '定義Excel對象
 6 
 7         Dim VbSht As Excel.Worksheet '定義工作表對象
 8 
 9  
10 
11         VbApp = GetObject(, "Excel.Application")    '當前EXCEL對象賦值給VbApp
12 
13         VbSht = VbApp.ActiveSheet     '使VbSht表示為EXCEL的當前工作表
14 
15  
16 
17         '注意要在對象前加上VbSht變量以表示是EXCEL當前工作表的對象
18 
19         VbSht.Range("C1").Value = VbSht.Range("A1").Value + VbSht.Range("B1").Value
20 
21     End Sub

 

8

9、如圖9所示,在工具欄上點擊“全部保存”按鈕(像一疊磁盤),在彈出的“保存項目”窗口里選擇保存的位置,如本例保存到E盤,文件夾名稱為VBDLL,然后點擊“保存”。

 

9

10、菜單欄點擊“生成”——“生成 VBADLL”,稍等片刻即可在E:\VBADLL\bin\Debug看到生成的DLL文件,同時還有一個TLB文件,如圖10所示。

 

10

二、注冊及在VBE里調用DLL文件

11、如果你在圖5所示窗口里點擊“應用程序”,在圖11所示窗口里點擊“程序集信息”,彈出“程序集信息”里勾選“使用程序集COM可見”,然后點擊“確定”。如此勾選后生成DLL文件的同時也就已經注冊了DLL文件,如果你之前沒有勾選,請勾選后重新生成DLL文件即可。

 

11

12、打開EXCEL,再打開“Visual Basic 編輯器”,在菜單欄點擊“工具”——“引用”,在彈出的“引用”窗口里往下拉動滾動條,勾選“VBDLL”,然后點擊“確定”。我們可以可以看到該引用定位到E:\VBADLL\bin\Debug\VBADLL.tlb,是TLB文件而不是DLL文件。如圖12所示。


12

13、在ExcelV BE窗口中新建一個模塊,並輸入調用DLL文件Test過程的代碼:

1 Sub DLLtest()
2     Dim DLL As New ComExcel '定義DLL為新類,即為DLL文件中的類模塊ComExcel
3     DLL.Test  '調用DLL中提供的過程,來完成原來在VBA中的功能,起到隱藏代碼的效果
4     Set DLL = Nothing  '釋放類資源
5 End Sub

如圖13所示,輸代碼時可以利用智能感知下拉列表框快速輸入DLL文件里的對象,而沒有必要一一記住再輸入。

 

13

14、在Excel工作表中新建3個按鈕並為其指定宏,現在可以測試調用了。

 

14

三、客戶端注冊及調用DLL的方法

工具及原料:

1、以上一、二步制作的ExcelDLL文件

2、注冊DLLBat批處理文件(等下制作)

3Microsoft Office Excel 2003及以上

4Windows XP/7/8/1032位操作系統

5Microsoft .NET Framework 4.0

操作步驟:

1、制作Bat批處理文件供客戶注冊DLL

ExcelVBADLL .DLL文件放到同一文件夾內,在該文件夾內新建一個Txt記事本文件,打開記事本輸入以下批處理命令:

@Echo off

cd /d %~dp0

xcopy /y zykc.dll %windir%\system32\

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase %windir%\system32\VBADLL.dll /tlb:VBADLL.tlb

if errorlevel 1 goto err

Echo.

Echo 注冊類庫成功!

goto end

:err

Echo.

Echo 注冊類庫失敗!應以管理員身份運行!

:end

Pause>nul

保存關閉記事本,重命名記事本包括后綴名.txt為“注冊類庫.bat”。

到此,即可將包含ExcelDLLBAT文件的文件夾(如圖15所示)發送給客戶。

 

15

2、客戶端注冊DLL

保證客戶端已安裝Microsoft .NET Framework 4.0,雙擊“注冊類庫.bat”文件即可完成注冊,當注冊不成功時,在“注冊類庫.bat”文件上單擊右鍵,選擇以管理員身份運行即可完成注冊。

Microsoft .NET Framework 4.0組件可以到微軟官網下載:https://www.microsoft.com/zh-cn/download/details.aspx?id=17718

現在,客戶端即可在Excel里調用DLL文件了。

筆者在Microsoft Office Excel 2010Windows 10 32位操作系統的客戶端測試成功。若客戶端為Microsoft Office Excel 2003不能成功注冊DLL時,需要打一個補丁(office2003-KB907417-FullFile-CHS.exe),可以到微軟官網下載:https://www.microsoft.com/zh-cn/download/details.aspx?id=10624

若你希望用VB6封裝VBA代碼可參考163博客老木小屋的文章《VBA封裝為DLL及調用》:http://ych4943.blog.163.com/blog/static/376967502012842360885/

為了保護自己辛辛苦苦編寫的Excel VBA代碼不被盜用,我們需要對Excel VBA代碼進行加密。通常的做法是利用給工程設置密碼的方法實現加密,對於這類加密方法,由於存在安全度低、易破解等問題,因此往往起不到應有的效果。通過將Excel VBA代碼封裝成DLL動態鏈接庫,可有效防止代碼被非法查看。

在百度里搜索“封裝EXCEL VBA”關鍵字,有很多封裝VBA的教程,但99%是利用VB6Microsoft Visual Basic 6.0)來封裝,主要原因是VB6的操作界面及語法與ExcelVBA具有極高的相似度。2002年,隨着VB.NET的引入,大部分人都放棄使用VB而選擇VB.NETVB6終將被淘汰,因此我們必須與時俱進,學習用Microsoft Visual Basic 2010封裝VBA。我們可以在VS里建立com類項目,把NET類庫的一些方法重新包裝后暴露給VBA使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM