第二节 Excel VBA 程序的保密 Excel VBA 程序的保密是个难点,大家对此都感兴趣,原因是想保护核心代码和技术以及对商业的Excel VBA 程序进行安全保障。Excel 对 VBA 工程加密仅起简单保护作用,稍懂一点的程序员就可手工破解或使用网上的破解软件。目前唯一能保障 VBA 代码就一个方法,把VBA 核心代码封装到动态连接库(DLL)文件中。大家可以放心动态连接库,因为它是很难被反编译的(反编译的代价比开发还大)、非常安全。下面就开始介绍如何制作和使用动态连接库DLL。
一、动态连接库DLL的制作和使用 1)用VB6 企业版下ActiveX.DLL 工具开发,在缺省类代码窗口输入下面代码: Sub copy12(x As Integer, y As Integer) '目的是把表x单元格值赋值给表y '定义将要用到的变量数据,对象变量,整型数据变量 Dim xlapp As Object, xlbok As Object,xlsht1 As Object,xlsht2 As Object, xlrng As Object Dim i As Integer, j As Integer, irow1 As Integer, icol1 As Integer Dim irow2 As Integer, icol2 As Integer, cellssum As Integer Set xlapp = GetObject(, "Excel.Application") '取得Excel实例 Set xlbok = xlapp.activeworkbook '取得Excel实例下活动工作簿 Set xlsht1 = xlbok.Worksheets(x) '取得Excel实例下活动工作簿的第x表格 Set xlsht2 = xlbok.Worksheets(y) '取得Excel实例下活动工作簿的第y表格 Set xlrng = xlsht1.UsedRange '取得Excel实例下活动工作簿的第x表格的已用区域 cellssum = xlrng.Count 'x表格的已用区域的单元格数目 irow1 = xlrng.cells(1).row '已用区域的第1单元格的行 icol1 = xlrng.cells(1).Column '已用区域的第1单元格的列 irow2 = xlrng.cells(cellssum).row '已用区域的最后单元格的行 icol2 = xlrng.cells(cellssum).Column '已用区域的最后单元格的列 For i = irow1 To irow2 '从已用区域第1行到最后一行循环 For j = icol1 To icol2 '从已用区域第1列到最后一列循环 xlsht2.cells(i, j) = xlsht1.cells(i, j) '把x表已用区域单元格数据赋值给y表相同位置 Next '此处目的可用别方法实现,或加判断实现别的 Next Set xlapp = Nothing '清除定义的对象为空 Set xlbok = Nothing Set xlsht1 = Nothing Set xlsht2 = Nothing Set xlrng = Nothing End Sub Function Getstrgs(STRG As String, FC As String, LC As String) As Variant '求字符间各子串赋值给数组 Dim ss() As String On Error Resume Next Sum = 0 For i = 1 To Len(STRG) - 1 If Mid(STRG, i, 1) = FC Then For j = i + 1 To Len(STRG) If Mid(STRG, j, 1) = LC Then Sum = Sum + 1 Next End If Next If Sum < 1 Then MsgBox "No substring found!" Exit Function End If ReDim ss(Sum - 1) As String Sum = 0 For i = 1 To Len(STRG) - 1 If Mid(STRG, i, 1) = FC Then For j = i + 1 To Len(STRG) If Mid(STRG, j, 1) = LC Then ss(Sum) = Mid(STRG, i + 1, j - i - 1) Sum = Sum + 1 End If Next End If Next Getstrgs = ss End Function 以上代码仅展示类中的过程和函数,以便在VBA中使用。 2)修改将要引用的类名称,在VB6的类属性窗口修改,本例修改为 mycopy1to2 3)工程保存,本例保存为sheetcopy1to2 4)DLL生成,本例保存为sheetcopy1to2.dll 2,3,4步骤我想对大家来说,不应该存在问题的。 二.VBA中调用DLL 1)VBE窗口下,点工具菜单-引用,在点弹出窗口的浏览按钮,找到你的DLL文件,最好和EXCEL文件放一个目录下,便于下一步骤。 2)DLL的注册,如下: Private Sub Workbook_BeforeClose(Cancel As Boolean) Shell "Regsvr32 /u /s " & Chr(34) & ThisWorkbook.Path & "\sheetcopy1to2.dll" & Chr(34) End Sub Private Sub Workbook_Open() '一定要先引用 dll,才可以自动注册."Regsvr32 /s " 中/s是表示不出现对话框 On Error GoTo errline Shell "Regsvr32 /s " & Chr(34) & ThisWorkbook.Path & "\sheetcopy1to2.dll" & Chr(34) Exit Sub errline: MsgBox "程序在注册DLL函数时出现错误!" End Sub 也可以在Windows 开始菜单下的运行命令对话框中运行 Regsvr32 "DLL全路径/文件名.dll" 来注册DLL文件 3)VBA中使用DLL的过程和函数,代码示例如下 VBE下新建如下模块: Sub mycopy1to2() Dim bb As New mycopy1to2 '定义bb为DLL中的类mycopy1to2 bb.copy12 1, 2 '表格1内容到表格2,使用类mycopy1to2新实例bb的过程 Set bb = Nothing End Sub Sub mycopy2to3() Dim bb As New mycopy1to2 bb.copy12 2, 3 '表格2内容到表格3 Set bb = Nothing End Sub Sub mycopy3to1() Dim bb As New mycopy1to2 bb.copy12 3, 1 Set bb = Nothing End Sub Sub string1() Dim aa As Variant Dim bb As New mycopy1to2 '定义bb为DLL中类 mycopy1to2 新实例 aa = bb.Getstrgs(Cells(1, 1), Cells(1, 2), Cells(1, 3)) '使用类mycopy1to2新实例bb的函数 For i = 0 To UBound(aa) '用DLL中类的函数求字符串的各子串 Cells(i + 2, 1) = aa(i) Next Set bb = Nothing End Sub 代码能理解多少就多少,这是次要的,主要是学会如何轻松使用DLL保护自己的VBA代码。学到这,相信大家应该已经会制作DLL文件和在VBA中使用它了。
[此贴子已经被作者于2006-7-23 18:25:15编辑过] |