为了保护自己辛辛苦苦编写的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文件

工具及原料:

1、Microsoft Office Excel 2003

2、Microsoft Visual Studio 2010

3、Windows XP 32位操作系统

操作步骤:

1、启动Microsoft Visual Studio 2010,在起始页界面点击“新建项目”,如图1所示。

vba链接access封装dll vba封装成dll_VBA

图1

2、在弹出的“新建项目”对话框选择“类库”,修改名称为“VBADLL”,点击确定,如图2所示。

vba链接access封装dll vba封装成dll_vba链接access封装dll_02

 

图2

3、在右侧的“解决方案资源管理器”视图里,找到系统默认建立的类库“Class1.vb”,右键删除该类库,如图3所示。

vba链接access封装dll vba封装成dll_封装_03

图3

4、在菜单栏上点击“项目”——“添加类”,在弹出的“添加新项”窗口里往下拉,选择“com类”,并修改名称为ComExcel.vb。然后点击“添加”。如图4所示。

vba链接access封装dll vba封装成dll_封装_04

 

图4

5、在菜单栏上点击“项目”——“VBADLL属性”,在“VBADLL”窗口里点击“引用”——“添加”,如图5所示。

 

vba链接access封装dll vba封装成dll_封装_05

图5

6、在弹出的“添加引用”窗口里点击“COM”,往下拉选择“MicrosoftExcel 11.0 Object Library”,然后点击“确定”,如图6所示。

 

vba链接access封装dll vba封装成dll_vba链接access封装dll_06

图6

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

EXCEL2000(MicrosoftExcel 9.0 Object Library)

EXCEL2002(MicrosoftExcel 10.0 Object Library)

EXCEL2003(MicrosoftExcel 11.0 Object Library)

EXCEL2007(MicrosoftExcel 12.0 Object Library)

EXCEL2010(MicrosoftExcel 14.0 Object Library)

EXCEL2013(MicrosoftExcel 15.0 Object Library)

7、按图7所示把窗口滚动条往下拉,勾选“MicrosoftOffice Interop”。 

vba链接access封装dll vba封装成dll_封装_07

图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

 

vba链接access封装dll vba封装成dll_VBA_08

图8

9、如图9所示,在工具栏上点击“全部保存”按钮(像一叠磁盘),在弹出的“保存项目”窗口里选择保存的位置,如本例保存到E盘,文件夹名称为VBDLL,然后点击“保存”。

 

vba链接access封装dll vba封装成dll_vba链接access封装dll_09

图9

10、菜单栏点击“生成”——“生成 VBADLL”,稍等片刻即可在E:\VBADLL\bin\Debug看到生成的DLL文件,同时还有一个TLB文件,如图10所示。

 

vba链接access封装dll vba封装成dll_Visual_10

图10

二、注册及在VBE里调用DLL文件

11、如果你在图5所示窗口里点击“应用程序”,在图11所示窗口里点击“程序集信息”,弹出“程序集信息”里勾选“使用程序集COM可见”,然后点击“确定”。如此勾选后生成DLL文件的同时也就已经注册了DLL文件,如果你之前没有勾选,请勾选后重新生成DLL文件即可。

 

vba链接access封装dll vba封装成dll_Visual_11

图 11

12、打开EXCEL,再打开“Visual Basic 编辑器”,在菜单栏点击“工具”——“引用”,在弹出的“引用”窗口里往下拉动滚动条,勾选“VBDLL”,然后点击“确定”。我们可以可以看到该引用定位到E:\VBADLL\bin\Debug\VBADLL.tlb,是TLB文件而不是DLL文件。如图12所示。

vba链接access封装dll vba封装成dll_封装_12

图12

13、在Excel的VBE窗口中新建一个模块,并输入调用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文件里的对象,而没有必要一一记住再输入。

 

vba链接access封装dll vba封装成dll_vba链接access封装dll_13

图13

14、在Excel工作表中新建3个按钮并为其指定宏,现在可以测试调用了。

 

vba链接access封装dll vba封装成dll_Visual_14

图14

三、客户端注册及调用DLL的方法

工具及原料:

1、以上一、二步制作的Excel及DLL文件

2、注册DLL的Bat批处理文件(等下制作)

3、Microsoft Office Excel 2003及以上

4、Windows XP/7/8/10等32位操作系统

5、Microsoft .NET Framework 4.0

操作步骤:

1、制作Bat批处理文件供客户注册DLL。

将Excel及VBADLL .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”。

到此,即可将包含Excel、DLL、BAT文件的文件夹(如图15所示)发送给客户。

 

vba链接access封装dll vba封装成dll_vba链接access封装dll_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 2010及Windows 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%是利用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使用。