为了保护自己辛辛苦苦编写的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所示。
图1
2、在弹出的“新建项目”对话框选择“类库”,修改名称为“VBADLL”,点击确定,如图2所示。
图2
3、在右侧的“解决方案资源管理器”视图里,找到系统默认建立的类库“Class1.vb”,右键删除该类库,如图3所示。
图3
4、在菜单栏上点击“项目”——“添加类”,在弹出的“添加新项”窗口里往下拉,选择“com类”,并修改名称为ComExcel.vb。然后点击“添加”。如图4所示。
图4
5、在菜单栏上点击“项目”——“VBADLL属性”,在“VBADLL”窗口里点击“引用”——“添加”,如图5所示。
图5
6、在弹出的“添加引用”窗口里点击“COM”,往下拉选择“MicrosoftExcel 11.0 Object Library”,然后点击“确定”,如图6所示。
图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”。
图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、在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文件里的对象,而没有必要一一记住再输入。
图13
14、在Excel工作表中新建3个按钮并为其指定宏,现在可以测试调用了。
图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所示)发送给客户。
图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使用。