excel COM 加载项编写过程
发布时间:2022-06-28 05:19:33
遇到几个朋友问COM加载项怎么做,搜索一下论坛似乎没有这方面详细的做法。所以根据我摸索出来的道路,写这篇东西糊弄糊弄大众,赚赚黑心水晶。嘿嘿。。。条条大道通罗马,这篇东东不是绝对正确也不是唯一一条道路。修仙也好,修魔也好,方向不同,但最终都是与天争命都是追求天道的真理(网络小说看多了)。欲练神功,请先自宫。。。
由于贫道作文能力有限,写出来的东西逻辑不清晰,觉得烦的朋友直接研究代码去吧。
废话不说了,转入正题:
一、创建工程并设置属性
二、连接Excel
三、响应Excel事件
四、调试编译分发安装
一、创建工程并设置属性。
新建工程:打开VB6.0,新建一个工程。在新建工程选项中选择“外接程序”(有的是“Addin”)
为工程添加引用:“工程”菜单“引用”勾上“Microsoft Excel 11.0 Object Libray”。(如果不引用,ExcelApplication、工具栏、按钮需声明为“Object”,且代码编写过程中没有自动完成对象的属性、方法等)
设置设计器属性:在工程资源管理器中双击“Connect(Connect)”,打开设计器设计窗口。
在设计器中。外接程序显示名称输入你想要的名称(这里为“TestAddin”);外接程序描述中输入外接程序的描述;应用程序选择“Microsoft Excel”;应该程序版本取决于你的电脑装了什么版本的Office我装的是Office2003,故选“Microsoft Excel 11.0”;初始化加载行为选择“Startup”。
二、连接 Excel
我们编写COM加载项就是要在Excel里面做点什么,如果用一个变量来保存Excel对象的话,我们基本上就能任意把Excel捏圆捏扁。变量的作用域是作为模块级的还是全局的就看你的实际情况,为了方便,这里定义为全局变量。添加一个模块“mduMain”,在模块中定义变量:
Public gExcelApp As Excel.Application |
Public gExcelApp As Excel.Application
连接Excel对象
双击设计器“Connect”,按“F7”进入代码编辑窗口,把除了“Option Explicit”之外的代码都删除。在“对象框”中选择“AddinInstance”,“过程/事件框”中选择“OnConnection”。
即出现
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 = ApplicationEnd 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 ExplicitPrivate mCol As Collection '集合,用来存放“ButtonEvent”类。Private Sub Class_Initialize() Set mCol = New Collection '类实例化时实例化集合End SubPrivate Sub Class_Terminate() Set mCol = Nothing '类销毁时销毁集合End SubPublic Sub Add(ByRef Button As Office.CommandBarButton) '添加按钮 Dim objNew As New ButtonEvent '创建“ButtonEvent”类新实例 Set objNew.Button = Button '连接事件 mCol.Add objNew '将类添加到集合中,只要“ButtonEventCol”类生存期未完,所有添加的“ButtonEvent”类就一直生存 Set objNew = NothingEnd 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 = ApplicationEnd 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 = NothingEnd 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
关闭 Excel 时执行
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 SelectEnd 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 COM 加载项编写过程的下载地址:


猜你喜欢
- 大家都知道pdf文件是一种跨平台、轻便式的文件格式,打印的内容可以精确地显示原来pdf文件中的每一个像素。而word文档中的doc文件格式转
- 有时候我们会碰到一个问题,就是在文档中输入文本或者复制文本后,文字显示不全,只显示一部分,这是因为什么呢,今天我们就来教大家,如何在WPS文
- 一键Ghost其实就是快速还原的意思,Ghost软件可以对用户曾经备份过系统留下的*.GHO文件进行还原操作,避免了系统安装的麻烦。那Gho
- 正在大家都在焦急等待Win10 Mobile预览版10240推送的时候,微软WDG副总裁Gabe Aul在推特上表示,Win10 Mobil
- 安司密信是一款隐私保密专家软件,不少用户会选择使用安司密信进行沟通聊天,因为它的安全性能非常强大,可以有效的保护用户的个人隐私。相较于微信,
- 永劫无间是一款多人竞技游戏,由网易开发,最近在玩永劫无间的玩家们却发现游戏中的语音功能失效了,按了也没有反应,这是怎么回事呢?该
- Win11电脑亮度调节失灵怎么办?windows11调节亮度没反应的解决方法,最近有win11用户反应在调节亮度的时候没有反应,遇到这种情况
- 一般来说,如果我们Windows10使用的默认账户不是管理员账户,那么我们在打开软件的时候就会提示“是否允许应用对电脑进行更改”,我们要如何
- 摘要:本文介绍如何在PowerPoint 2007 中将表格中的数字与小数点制表符对齐。当您希望按照小数点对齐列中的数字时,此过程很有用。解
- 表格数据统计的方法月份汇总表1.该单位使用的所有电话费用的月度汇总。2.按住“ctrl”键,按列选择当月的所有电话费用,直到“总计”列关闭。
- Win10系统输入法不能切换是怎么回事?有用户反映在Win10系统上不能切换输入法,该如何解决呢?本文将给大家介绍Win10系统电脑输入法无
- 在工作之余,我们偶尔会下载游戏来玩,可是每当游戏安装完想要打开却提示d3dx9 36.dll丢失,那么当你遇到Win7系统提示d3dx9 3
- wps怎么冻结?在工作中,为了更好的展示我们做好的表格,我们都会选择冻结首行或首列,那这些操作都是如何实现的呢?请看下文:冻结行01、点击w
- 我们在准备对自己的操作系统进行重新安装的时候,有的情况下可能就会遇到在重装系统软件的选择上出现各种的问题,不知道目前市面上的哪个系统软件是最
- 在Excel表格中,我们经常需要设置一些时间的格式,而为了精准的分辨,许多用户在使用的时候就会在时间后面添加星期几,今天小编就带着大家一起看
- VBA是Excel的底层根本。只有明白使用最底层的东西,使用起来才能随心所欲,下面小编就为大家介绍excel如何通过vba代码关闭工作薄方法
- 有不少用户都喜欢使用系统中的平板模式,而最近一些用户在打开这个模式的时候发现自己的桌面上的图标全都消失不见, 那么这是什么情况呢?又应该如何
- 有用户发现自己升级的Win11电脑系统无法正常安装中文输入法,今天我们一起来看看如何处理这个问题的方法Win11无法安装中文输入法怎么办?我
- 很多朋友都碰到桌面图标莫名其妙的消失不见了,但又不知道怎么解决,所以下面小编就为大家介绍Win10专业版桌面图标消失的三种情况及相应解决方法
- WPS2013表格如何通过SUMPRODUCT函数统计数据1、打开WPS表格2013,导入我课前准备好的数据源,下面我们要利用SUMPROD