ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 91499|回复: 212

VBA封装为Dll的例子、方法与总结【逐步完善中...】

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2008-9-13 10:47 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:封装

制作DLL时,ThisWorkBook中的代码封装方法如下:
1、打开VB6,新建ActiveX DLL。修改“工程”名称和“类模块”名称为需要的名称。本例中,工程修改为TestDLL,类模块修改为Test。
2、建立引用。一般需要引用Microsoft Office 11.0 Object Library和Microsoft Excel 11.0 Object Library。如果VBA代码中还有其他引用,在VB中也要对他们引用。
3、这一步就是具体封装代码了。
在刚才建立好的TestDLL中,将代码放入Test类模块中。
如封装ThisWorkBook中的Open事件:
Sub wbk_open(EApp As Excel.Application, wb As Excel.Workbook, sh As Excel.Worksheet)
'--VBA中需要封装的主体代码
End Sub
其中VBA中的代码为事先做好的要封装的代码,如下面这个例子:
'打开工作薄后在当前的工作表A1中输入Test
Private Sub workbook_open()
    Cells(1, 1) = "Test"
End Sub
封装为DLL的代码为:
Sub wbk_open(EApp As Excel.Application, wb As Excel.Workbook, sh As Excel.Worksheet)
    Cells(1, 1) = "Test"
End sub
现在在VB6中生成Dll,到此就完成封装了。
4、在VBA中使用封装的代码
首先,在VBA中要引用刚才生成的TestDll.dll。
然后新建一个模块,在其中定义这样一个变量T:
Public T As New TestDll.Test
然后在ThisWorkBook的Open中引用TestDll中的Test,代码如下:
Private Sub workbook_open()
   On Error Resume Next
   T.wbk_open Application, ThisWorkbook, ActiveSheet
End Sub
这样每次打开Excel后,就在Sheet1的Cells(1,1)中输入“Test”。
当然,如果你想在第2张工作表的A1中输入Test,那么可以这样用:
Private Sub workbook_open()
   On Error Resume Next
   T.wbk_open Application, ThisWorkbook, Sheets(2)
End Sub

以上就是代码封装的全过程,需要注意的是变量的传递要互相对应。

上面示例中的封装代码是用3个变量传递的,如果只用1个变量传递,代码如下:
'封装为DLL的代码为:
Sub wbk_open(sh As Excel.Worksheet)
    Cells(1, 1) = "Test"
End sub
'ThisWorkBook中使用Dll的代码为
Private Sub workbook_open()
   On Error Resume Next
   T.wbk_open ActiveSheet
End Sub

Dll文件和Test文件,测试时请重新引用TestDll.dll文件: KuUrBNQj.rar (9.68 KB, 下载次数: 2797)

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-9-20 21:44 | 显示全部楼层

总结】VBA封装为Dll的关键有以下两点:

1、在vb中要引用,这样可以使用早期绑定的方法定义变量,加快程序运行速度;

2、变量的传递要从最上层的一级开始,并且要依次传递到需要的层次,因此在VBA中对象要使用完整的形式表示。比如,要使用cell(1,1),则应改为类似这样的形式 Application.Thisworkbook.sheets(1).cell(1,1)。

第3条及以后几条正在思考中.....

[此贴子已经被作者于2008-9-20 22:13:10编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-9-20 22:03 | 显示全部楼层

看看下面常用的VBA界面处理代码,封装为Dll时应该如何改代码?

'需要封装的VBA代码
Sub 恢复系统界面()
    On Error Resume Next
    With Application
        .Caption = "版权所有:GoodFortune From
www.ExcelHome.net"
        .CommandBars("Worksheet Menu Bar").Enabled = True
        .CommandBars("Toolbar List").Enabled = True
        .CommandBars("Standard").Visible = True
        .CommandBars("Formatting").Visible = True
        .DisplayFormulaBar = True
    End With
    With ActiveWindow
        .DisplayGridlines = True
        .DisplayHeadings = True
        .DisplayHorizontalScrollBar = True
        .DisplayVerticalScrollBar = True
        .DisplayWorkbookTabs = True
    End With
End Sub
Sub 隐藏系统界面()
    On Error Resume Next
    With Application
        .CommandBars("Worksheet Menu Bar").Enabled = False
        .CommandBars("Toolbar List").Enabled = False
        .CommandBars("Standard").Visible = False
        .CommandBars("Formatting").Visible = False
        .DisplayFormulaBar = False
    End With
    With ActiveWindow
        .DisplayGridlines = True
        .DisplayHeadings = False
        .DisplayHorizontalScrollBar = False
        .DisplayVerticalScrollBar = False
        .DisplayWorkbookTabs = False
    End With
End Sub

首先,分析一下,上面的VBA代码中有几个需要传递的变量(或者先分析“对象”),一个是Application,一个是ActiveWindow,其中ActiveWindow是Application的下一级对象,因此,按第2条原则,从最上一层开始,完整形式为Application.ActiveWindow,因此上面的代码可以改成如下的形式,用一个变量传递就可以了。

'封装为Dll的代码
Sub 恢复系统界面(oExcel as Excel.Application)
    On Error Resume Next
    With oExcel
        .Caption = "版权所有:GoodFortune From
www.ExcelHome.net"
        .CommandBars("Worksheet Menu Bar").Enabled = True
        .CommandBars("Toolbar List").Enabled = True
        .CommandBars("Standard").Visible = True
        .CommandBars("Formatting").Visible = True
        .DisplayFormulaBar = True
    End With
    With oExcel.ActiveWindow
        .DisplayGridlines = True
        .DisplayHeadings = True
        .DisplayHorizontalScrollBar = True
        .DisplayVerticalScrollBar = True
        .DisplayWorkbookTabs = True
    End With
End Sub
Sub 隐藏系统界面(oExcel as Excel.Application)
    On Error Resume Next
    With oExcel
        .CommandBars("Worksheet Menu Bar").Enabled = False
        .CommandBars("Toolbar List").Enabled = False
        .CommandBars("Standard").Visible = False
        .CommandBars("Formatting").Visible = False
        .DisplayFormulaBar = False
    End With
    With oExcel.ActiveWindow
        .DisplayGridlines = True
        .DisplayHeadings = False
        .DisplayHorizontalScrollBar = False
        .DisplayVerticalScrollBar = False
        .DisplayWorkbookTabs = False
    End With
End Sub

由上可见,封装中需要修改的是将对象变量换成从根一级开始的完整形式,其他部分则不需要修改。

上面的例子是我学习中的经验总结,拿出来分享,虽然写的不好,但却是自己一步一步琢磨的,希望能抛砖引玉,请朋友们多指点。

TA的精华主题

TA的得分主题

发表于 2008-9-20 22:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2008-9-20 22:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2008-9-21 09:49 | 显示全部楼层

请问:是不是封装为.DLL后,就不能通过其它程序把DLL还原为VBA的程序代码呢?

TA的精华主题

TA的得分主题

发表于 2008-9-21 13:58 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-9-21 21:49 | 显示全部楼层
QUOTE:
以下是引用xunxujianjin在2008-9-21 13:58:00的发言:
厉害! 请问封装dll的目的....主要是为了防止篡改?

当您不想或不愿意让别人查看你的程序VBA源代码时,您通常会怎么做?对了,给VBE窗口加密,这样只有知道密码的人才能访问你的工程了,或者你更进一步,直接将工程设置为不可查看。但是对Excel做的所有加密(也许只是绝大部分,本人孤陋寡闻)都是很脆弱的,不管怎么加密,终是道高一尺,魔高一丈,往往在几秒内就被破解了,这样保护源代码的目的就达不到了。因此,需要采用其他的方法,一般可以进行EXE封装、Dll封装等。其中DLL封装,将您的VBA代码和程序文件本身分离开来,而且相对来说,DLL的反编译还是不容易实现的,这样封装后的源代码就就具有相对高的安全性了,如果您再进行更深层次的加工,那么VBA代码的安全性就会很高了。但是,同时要明白的是,不管怎样都没有绝对的安全性的,只是程度有所区别而已。

TA的精华主题

TA的得分主题

发表于 2008-9-23 08:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2008-9-24 14:09 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,每天学会一个新技能

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-10-18 17:56 , Processed in 0.135252 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表