用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文件
工具及原料:
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”,往下拉选择“Microsoft Excel 11.0 Object Library”,然后点击“确定”,如图6所示。
图6
注意,不同版本的EXCEL在“添加引用”——“COM”窗口里显示的版本号是不同的:
EXCEL2000(Microsoft Excel 9.0 Object Library)
EXCEL2002(Microsoft Excel 10.0 Object Library)
EXCEL2003(Microsoft Excel 11.0 Object Library)
EXCEL2007(Microsoft Excel 12.0 Object Library)
EXCEL2010(Microsoft Excel 14.0 Object Library)
EXCEL2013(Microsoft 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、在Excel的V 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、以上一、二步制作的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使用。