时间:2020-07-08 12:12作者:admin来源:未知人气:927我要评论(0)
遇到几个朋友问COM加载项怎么做,搜索一下论坛似乎没有这方面详细的做法。所以根据我摸索出来的道路,写这篇东西糊弄糊弄大众,赚赚黑心水晶。嘿嘿。。。条条大道通罗马,这篇东东不是绝对正确也不是唯一一条道路。修仙也好,修魔也好,方向不同,但最终都是与天争命都是追求天道的真理(网络小说看多了)。欲练神功,请先自宫。。。
由于贫道作文能力有限,写出来的东西逻辑不清晰,觉得烦的朋友直接研究代码去吧。
废话不说了,转入正题:
一、创建工程并设置属性
二、连接Excel
三、响应Excel事件
四、调试编译分发安装
我们编写COM加载项就是要在Excel里面做点什么,如果用一个变量来保存Excel对象的话,我们基本上就能任意把Excel捏圆捏扁。变量的作用域是作为模块级的还是全局的就看你的实际情况,为了方便,这里定义为全局变量。添加一个模块“mduMain”,在模块中定义变量:
Public gExcelApp As Excel.Application
|
Public gExcelApp As Excel.Application
即出现
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
End Sub
|
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant) End Sub
在该过程中写入“Set gExcelApp = Application”
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
Set gExcelApp = Application
End Sub
|
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant) Set gExcelApp = Application End Sub
添加一个类“ButtonEvent”,在类中定义一个响应事件的变量。
Public WithEvents Button As Office.CommandBarButton
|
Public WithEvents Button As Office.CommandBarButton
如果事先知道有多少个按钮的话,可以用类数组。为了更好的扩展性,这里用一个集合类“ButtonEventCol”来管理“ButtonEvent”类。
添加一个类“ButtonEventCol”,“ButtonEventCol”类的代码:
Option Explicit
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 Office.CommandBarButton) '添加按钮
Dim objNew As New ButtonEvent '创建“ButtonEvent”类新实例
Set objNew.Button = Button '连接事件
mCol.Add objNew '将类添加到集合中,只要“ButtonEventCol”类生存期未完,所有添加的“ButtonEvent”类就一直生存
Set objNew = Nothing
End Sub
|
Option Explicit 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 Office.CommandBarButton) '添加按钮 Dim objNew As New ButtonEvent '创建“ButtonEvent”类新实例 Set objNew.Button = Button '连接事件 mCol.Add objNew '将类添加到集合中,只要“ButtonEventCol”类生存期未完,所有添加的“ButtonEvent”类就一直生存 Set objNew = Nothing End Sub
双击设计器“Connect”,按“F7”进入代码编辑窗口。刚才我们的代码
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
Set gExcelApp = Application
End Sub
|
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant) Set gExcelApp = Application End Sub
已经在 OnConnection 事件中连接 Excel 对象。我们就用“gExcelApp”这个对象变量来创建工具栏和按钮,并与响应事件的类连接。
'定义一个变量用于存放“ButtonEventCol”类实例
Private mButtonEventCol As New ButtonEventCol
|
'定义一个变量用于存放“ButtonEventCol”类实例 Private mButtonEventCol As New ButtonEventCol
'定义一个变量用于存放“ButtonEventCol”类实例
Private mButtonEventCol As New ButtonEventCol
|
'定义一个变量用于存放“ButtonEventCol”类实例 Private mButtonEventCol As New ButtonEventCol
假设我们在Excel创建一个名叫“外接程序”的工具栏,工具栏中有二个按钮,分别为:“新建工作簿”、“关闭工作簿”。
在“AddinInstance_OnStartupComplete”(对象已加载完毕)事件中创建工具栏、按钮,并把按钮和响应事件的类连接,代码如下:
Private Sub AddinInstance_OnStartupComplete(custom() As Variant)
Dim MyControl As Office.CommandBarButton
Set mMyBar = gExcelApp.CommandBars.Add(Name:="外接程序", Position:=msoBarFloating, Temporary:=True)
mMyBar.Visible = True
Set MyControl = mMyBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
With MyControl
.BeginGroup = False
.Caption = "新建工作簿"
.Enabled = True
.Visible = True
.FaceId = 18
.Style = msoButtonIconAndCaption
.Parameter = "New" 'Parameter 属性是类在响应按钮事件时区分按钮的标记。
'如果用 Tag 属性来区分的话,会发生二次事件。不知道为什么。
End With
mButtonEventCol.Add MyControl
Set MyControl = mMyBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
With MyControl
.BeginGroup = False
.Caption = "关闭工作簿"
.Enabled = True
.Visible = True
.FaceId = 1088
.Style = msoButtonIconAndCaption
.Parameter = "Close"
End With
mButtonEventCol.Add MyControl
Set MyControl = Nothing
End Sub
|
Private Sub AddinInstance_OnStartupComplete(custom() As Variant) Dim MyControl As Office.CommandBarButton Set mMyBar = gExcelApp.CommandBars.Add(Name:="外接程序", Position:=msoBarFloating, Temporary:=True) mMyBar.Visible = True Set MyControl = mMyBar.Controls.Add(Type:=msoControlButton, Temporary:=True) With MyControl .BeginGroup = False .Caption = "新建工作簿" .Enabled = True .Visible = True .FaceId = 18 .Style = msoButtonIconAndCaption .Parameter = "New" 'Parameter 属性是类在响应按钮事件时区分按钮的标记。 '如果用 Tag 属性来区分的话,会发生二次事件。不知道为什么。 End With mButtonEventCol.Add MyControl Set MyControl = mMyBar.Controls.Add(Type:=msoControlButton, Temporary:=True) With MyControl .BeginGroup = False .Caption = "关闭工作簿" .Enabled = True .Visible = True .FaceId = 1088 .Style = msoButtonIconAndCaption .Parameter = "Close" End With mButtonEventCol.Add MyControl Set MyControl = Nothing End Sub
Private Sub AddinInstance_OnBeginShutdown(custom() As Variant)
Set mButtonEventCol = Nothing
'关闭 Excel 时释放类。
'因为工具栏、按钮在创建的时候已经把 Temporary 属性设为 True 了,关闭 Excel 自动删除。
'所以这里不用编写删除工具栏的代码。
End Sub
|
Private Sub AddinInstance_OnBeginShutdown(custom() As Variant) Set mButtonEventCol = Nothing '关闭 Excel 时释放类。 '因为工具栏、按钮在创建的时候已经把 Temporary 属性设为 True 了,关闭 Excel 自动删除。 '所以这里不用编写删除工具栏的代码。 End Sub
打开类“ButtonEvent”的代码编辑窗口,添加事件过程
Private Sub Button_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
End Sub
|
Private Sub Button_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) End Sub
在该事件过程中添加代码如下:
Private Sub Button_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
Select Case Ctrl.Parameter '根据按钮的 Parameter 属性决定执行什么动作。
Case "New"
gExcelApp.Workbooks.Add
Case "Close"
If Not (gExcelApp.ActiveWorkbook Is Nothing) Then
gExcelApp.ActiveWorkbook.Close
Else
MsgBox "没有活动工作簿", vbExclamation
End If
End Select
End Sub
|
Private Sub Button_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) Select Case Ctrl.Parameter '根据按钮的 Parameter 属性决定执行什么动作。 Case "New" gExcelApp.Workbooks.Add Case "Close" If Not (gExcelApp.ActiveWorkbook Is Nothing) Then gExcelApp.ActiveWorkbook.Close Else MsgBox "没有活动工作簿", vbExclamation End If End Select End Sub
关闭Excel,设计器代码窗口中的“AddinInstance_OnConnection”事件中,在“Set gExcelApp = Application”这句代码设置断点。按“F5”运行,然后打开 Excel 。这时,代码执行到“Set gExcelApp = Application”这里就暂停了。你可以一步一步按“F8”进行跟踪调试,看看加载项的工作方法,找到错误的地方并改正。当调试没什么问题之后,编译就比较简单了,按“文件”菜单“生成工具栏连接.DLL”。然后生成就行了。
这里介绍用“WinRAR”制作安装包。
按“工程”菜单引用,查看引用项目的路径,把引用项目的文件复制到生成的DLL文件目录中。
如果有窗体,在工具栏点右建“部件”,查看引用的项目的路径,把引用项目的文件复制到生成的DLL文件目录中。
打开“记事本”,输入
RegSvr32.exe 工具栏连接.dll
|
RegSvr32.exe 工具栏连接.dll
另存为,保存类型选“所有文件”,文件名“安装.BAT”,保存到生成的DLL文件目录中。
打开“记事本”,输入
RegSvr32.exe 工具栏连接.dll /U
|
RegSvr32.exe 工具栏连接.dll /U
另存为,保存类型选“所有文件”,文件名“卸载.BAT”,保存到生成的DLL文件目录中。
打开“WinRAR”,定位到生成的DLL文件的目录。选中要DLL文件、安装和卸载两个BAT文件、被工程引用项目的文件等。按“添加”。
在压缩参数对话框中的“常规”选项卡中,勾选“创建自解压格式压缩文件”。
切换到“高级”选项卡,按“自解压选项”。
在“高级自解压选项”对话框中,解压路径中填入“工具栏连接”,选中“在 Program Files 中创建”,不勾选“保存并恢复路径”,“解压后运行”中填入“安装.BAT”。全部确定后生成的“工具栏连接.exe”就是安装文件了。
1文件名称 1下载链接 COMAddin.zip http://pan.baidu.com/s/1kTojK6j
相关阅读 Excel有哪些常用的数学函数?Excel取消表格中虚线的两种方法Excel最常见的「错误值」,这些含义你都知道吗?实现快速找出Excel表格中两列数据不同内容的3种方法!如何利用Excel一键提取身份证的这些重要信息,公式直接套用!Excel如何制作动态红绿灯,工作可不要亮红灯哦Excel身份证号大探索excel如何根据日期按月汇总计算公式Excel浪漫表白公式,发给心仪的她/他Excel表格如何自动求和
热门文章 excel 两表数据快速对比,高手都是这样做,四种方法随你选.xlsm是什么文件格式,以及xlsm文件怎么打开的方法excel if函数如何多个条件并列excel中计算加权平均数的公式:用SUMPRODUCT和SUM函数计算加权平均
最新文章
Excel有哪些常用的数学函数?Excel取消表格中虚线的两种方法
Excel最常见的「错误值」,这些含义你都知道吗?实现快速找出Excel表格中两列数据不同内容的3种方法!如何利用Excel一键提取身份证的这些重要信息,公式直接套用!Excel如何制作动态红绿灯,工作可不要亮红灯哦
人气排行 excel 两表数据快速对比,高手都是这样做,四种方法随你选.xlsm是什么文件格式,以及xlsm文件怎么打开的方法excel if函数如何多个条件并列excel中计算加权平均数的公式:用SUMPRODUCT和SUM函数计算加权平均excel中IF条件函数10大用法完整版,全会是高手,配合SUMIF,VLOOKUPexcel中COUNTIFS函数9种高级用法详解,条件统计重复值,告别加班涨工如何解除Excel VBA工程密码excel 如何根据身份证号码提取户籍所在省份地区函数公式
盖楼回复X
(您的评论需要经过审核才能显示)
查看所有0条评论>>