COM加载宏的制作与安装全过程

COM加载宏的制作与安装全过程作者:bengdeng | 来源:Excel吧 | 时间:2008-10-07 | 阅读权限:游客 | 会员币:0 | 【大 中 小】
VBA的密码保护很容易破解,因此,在需要保护代码时,一般都用其它编程工具生成COM加载宏,然后再让Excel加载,这样就没有办法查看到原代码了。Excel吧一向主张都是知识分享,所有的文件都没有进行保护(非本站原创的作品,原作者有保护的除外),但做为一项技术与知识点,这里我们通过创建一个COM加载宏的过程来了解怎么创建COM加载宏。

首先说明一下编程的环境。我使用的是VB6.0企业版与Excel2003,在Winxp中测试通过,操作系统一般影响不大,而编程工具还可以选择其它,不过基本过程类似,但代码就不一样了,而Excel版本如果是2007版的话,下面这个例子生成的工具栏会在加载项菜单中出现。

接下来就开始动手了,创建一个Excel工作表目录的COM加载宏,而Excel加载宏版的Excel各页名,大家可以参见一下https://www.360docs.net/doc/2b4045747.html,/Soft/Html/5.html。

1、创建工程:打开VB6.0,新建一个外接程序,这时程序就创建一个新的工程,这里我们删除新建工程中自己创建的我们这不需要的窗体。然后在工程菜单中的最后一项“XXXX”属性里,把工程的名称修改为:ExcelAllSheets;在工程描述中中加入说明。

2、添加引用:在“工程”菜单中点击“引用”,然后选上“Microsoft Excel 11.0 Object Libray”这个选项,因为我用的是Excel2003版,其它版本的版本号就不是11.0,选择对应的即可。引用后,在代码编写过程中,就可以自动完成对象的属性、方法了。

3、设置设计器属性:在工程资源管理器中双击“Connect(Connect)”,打开设计器设计窗口。在设计器中的外接程序显示名称输入你想要的名称(这里为“ExcelAllSheets”);外接程序描述中输入外接程序的描述;应用程序选择“Microsoft Excel”;应该程序版本取决于你的电脑装了什么版本的Office,这里使用Excel2003,故选“Microsoft Excel 11.0”;初始化加载行为选择“Startup”。

4、连接Excel:添加一个模块“mduMain”,在模块中定义一个全局变量xlApp,代码如下:

Public xlApp As Excel.Application

这样我们就创建了一个Application 对象,用它我们就可以操控Excel了。

5、定义响应按钮事件的类:创建一个类模块,并把它重命名为ButtonEvent,这个名称在后面有用到,然后添加一个响应事件的变量Button,代码如下。

Public WithEvents Button As https://www.360docs.net/doc/2b4045747.html,mandBarButton

之后就可以创建其响应按钮的事件Button_Click,在这个事件中就可以加入我们的代码:

Private Sub Button_Click(ByVal Ctrl As https://www.360docs.net/doc/2b4045747.html,mandBarButton, CancelDefault As Boolean)
O

n Error Resume Next
Dim AWB As Excel.Workbook
Dim ASH As Excel.Worksheet
Dim i As Integer
Select Case Ctrl.Tag '根据按钮的 Tag 属性决定执行什么动作。
Case "ExcelbaZy"
xlApp.ActiveWorkbook.FollowHyperlink "https://www.360docs.net/doc/2b4045747.html,"
Case "ExcelAllSheets"
If Not (xlApp.ActiveWorkbook Is Nothing) Then
xlApp.Application.ScreenUpdating = False
Set AWB = xlApp.ActiveWorkbook
With AWB
If .Worksheets("目录") Is Nothing Then
.Worksheets.Add
https://www.360docs.net/doc/2b4045747.html, = "目录"
End If
Set ASH = .Worksheets("目录")
ASH.Move Before:=.Worksheets(1)
End With

With ASH
.Range("A:B").Clear
.Range("B:B").NumberFormatLocal = "@"
.Range("A1").Value = "序号"
.Range("B1").Value = "名称"
.Range("A1:B1").Font.Bold = True
.Range("A:A").HorizontalAlignment = xlLeft

For i = 2 To AWB.Worksheets.Count
.Cells(i, 1).Value = i
.Cells(i, 2).Value = AWB.Worksheets(i).Name
.Hyperlinks.Add Anchor:=.Cells(i, 2), Address:="", _
SubAddress:="'" & AWB.Worksheets(i).Name & "'!A1", _
TextToDisplay:=AWB.Worksheets(i).Name
Next
End With
xlApp.Application.ScreenUpdating = True
Else
MsgBox "没有活动工作簿", , "提示"
End If
End Select

End Sub

6、添加ButtonEvent的类集合:为了更好的扩展性,这里用一个集合类“ButtonEventCol”来管理“ButtonEvent”类。添加一个类模块并重命名为“ButtonEventCol”,“ButtonEventCol”类的代码如下:

Private mCol As Collection '集合,用来存放“ButtonEvent”类。

Private Sub Class_Initialize()
Set mCol = New Collection '类实例化时实例化集合
End Sub

Private Sub Class_Terminate()
Set mCol = Nothing '类销毁时销毁集合
End Sub

Public Sub Add(ByRef Button As https://www.360docs.net/doc/2b4045747.html,mandBarButton) '添加按钮

Dim objNew As New ButtonEvent '创建“ButtonEvent”类新实例

Set objNew.Button = Button '连接事件
mCol.Add objNew '将类添加到集合中,只要“ButtonEventCol”类生存期未完,所有添加的“ButtonEvent”类就一直生存。
Set objNew = Nothing
End Sub

7、定义一个工具栏对象与"ButtonEventCol"类实例:右击设计器“Connect”,点查看代码进入代码编程,册除除了第一行的“Option Explicit”之外的代码的其它代码,然后加入下面的代码:

'定义一个

变量用于存放工具栏对象。
Private mMyBar As https://www.360docs.net/doc/2b4045747.html,mandBar
'定义一个变量用于存放"ButtonEventCol"类实例
Private mButtonEventCol As New ButtonEventCol

8、添加加载时的代码:在“对象框”中选择“AddinInstance”,“过程/事件框”中选择“OnConnection”。创建工具栏与按钮,并把按钮和响应事件的类连接起来:

在Private Sub AddinInstance_OnConnection过程中加入

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
Dim MyControl As https://www.360docs.net/doc/2b4045747.html,mandBarButton

Set xlApp = Application
Set mMyBar = https://www.360docs.net/doc/2b4045747.html,mandBars.Add(Name:="Excel吧工具栏", Position:=msoBarTop, Temporary:=True)
mMyBar.Visible = True
Set MyControl = mMyBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
With MyControl
.BeginGroup = False
.Caption = "Excel吧主页"
.Enabled = True
.Visible = True
.FaceId = 263
.Style = msoButtonIconAndCaption
.Tag = "ExcelbaZy"
End With
mButtonEventCol.Add MyControl
Set MyControl = mMyBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
With MyControl
.BeginGroup = False
.Caption = "创建Excel目录"
.Enabled = True
.Visible = True
.FaceId = 11
.Style = msoButtonIconAndCaption
.Tag = "ExcelAllSheets"
End With
mButtonEventCol.Add MyControl
Set MyControl = Nothing
End Sub


9、添加卸载后的代码。在AddinInstance_OnDisconnection事件中加入如下代码:

Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
Set mButtonEventCol = Nothing
mMyBar.Delete
Set xlApp = Nothing
End Sub


10、调试和编译:关闭Excel,设计器代码窗口中的“AddinInstance_OnConnection”事件中,在“Set xlApp = Application”这句代码设置断点。按“F5”运行,然后打开 Excel 。这时,代码执行到“Set xlApp = Application”这里就暂停了。你可以一步一步按“F8”进行跟踪调试,看看加载项的工作方法,找到错误的地方并改正。当调试没什么问题之后,编译就比较简单了,按“文件”菜单?“ExcelAllSheets.DLL”。然后生成就行了。

11、加载与卸载:我们可以利用RegSvr32.exe 来加载与卸载Dll文件,为了方便使用,我们可以把下面的代码另存为Bat文件。

打开“记事本”,输入加载代码:
RegSvr32.exe ExcelAllSheets.DLL
然后另存为,保存类型选“所有文件”,文件名“安装.BAT”,保存到生成的DLL文件目录中。

打开“记事本”,输入卸码代码:
RegSvr32.exe ExcelAllSheets.DLL /U
。另存为,保存类型选“所有文件”,文件名“卸载.BAT”,保存到

生成的DLL文件目录中。

之后我们就可以运行“安装.BAT”来加载这个COM加载宏,用“卸载.BAT”来卸载。

到此,所有的知识介绍完毕,为了更好的理解上面老长老长的文章,大家可以下载上面说明的所有文件,自己参考后动手做一下吧,完整文件的地址为:https://www.360docs.net/doc/2b4045747.html,/Soft/Html/118.html

注,回留言:首先,我没有说是原创,好多Excel知识都是在网络搜索获得后整理而成;再者,我在整理这个知识点时没有见过楼主的文章,我参考的文章地址:https://www.360docs.net/doc/2b4045747.html,/viewthread.php?tid=174063&extra=page%3D3%26amp%3Bfilter%3Ddigest,这个贴子发表于2006-6-26 20:07 。

转载请注明:本文来自:Excel吧 (https://www.360docs.net/doc/2b4045747.html,) 详细出处参考:https://www.360docs.net/doc/2b4045747.html,/Art/Html/298.html

相关文档
最新文档