ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 45138|回复: 77

[分享]使用VB6创建COM加载宏

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2006-6-26 20:07 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:插件开发

这两天学习了关于创建COM加载宏的知识,将学习成果进行了整理,供大家参考.

使用VB6创建COM加载宏
摘要:本文通过示例详细描述了如何使用VB6创建COM加载宏的过程,以及如何在Excel中加载和使用。
创建一个COM加载宏的步骤
1、打开VB6应用程序,在“新建工程”中选择“外接程序”,打开新工程。
2、在右侧工程资源管理器窗口中将会有一个名为frmAddin的窗体和一个名为Connect的设计器对象。移除frmAddin窗体,然后对Connect设计器对象进行设置。
双击设计器对象,出现一个设计器窗体,窗体中有如下字段及相应的文本框:
• 外接程序显示名称 – 填写加载宏的名字。
• 外接程序描述 – 描述你所创建的加载宏的作用和功能。
• 应用程序 – 使用你所创建的加载宏的应用程序。在这里,选择Microsoft Excel。
• 应用程序版本 – 使用你所创建的加载宏的应用程序版本。当在应用程序文本框中选择了Microsoft Excel后,该文本框自动出现Microsoft Excel 11.0。
• 初始化加载行为 – 当应用程序开启时,是否自动装载该加载宏,有四个选项。若设置这为Startup,那么当Excel开始时将装载该加载宏;若设置为Load on demand,则在Excel中需要时再装载该加载宏。
3、添加对Excel的引用。选择菜单“工程——引用”命令,在出现的“引用”对话框中选中Microsoft Excel 11.0 Object Liabrary前的复选框。
4、设置工程属性。选择菜单“工程——MyAddIn属性”命令,或在工程资源管理器窗口中击右键选择“MyAddIn属性”命令,在出现的工程属性对话框中设置工程名称和工程描述。
5、编辑Connect设计器代码。在Connect设计器对象上右击并选择“查看代码”或者点选Connect设计器后单击窗口顶部的“查看代码”按钮,将出现VB自动生成的代码。删除其中的代码,只保留OnConnection过程和OnDisconnection过程,用于在应用程序中装载和卸载加载宏,并在其中添加自已实现加载宏功能所需要的代码。在本示例中,Connect设计器中的最终代码如下:
‘****************************************
Option Explicit
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
   '设置应用程序变量
   Set xlApp = Application
   '设置自已的菜单的子程序
   CreateToolbarButtons
End Sub
Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
  '释放占用的内存
   Set xlApp = Nothing
  '移除自已的菜单的子程序
   RemoveToolbarButtons
End Sub
‘****************************************
6、选择菜单“工程——添加模块”命令,添加一个标准的模块并添加相应的代码。在本示例中,该标准模块的代码如下:
‘****************************************
‘声明变量、类实例和集合
Public xlApp As Excel.Application
Dim ButtonEvent As cbEvents
Dim ButtonEvents As Collection
'定义自已菜单的子程序
Public Sub CreateToolbarButtons()
     '为了确保只添加按钮一次,先移除它们
    RemoveToolbarButtons
     '声明变量
    Dim cbBar As Office.CommandBar
    Dim btNew As Office.CommandBarButton
     '创建一个新的集合
    Set ButtonEvents = New Collection
    '查找excel中的工作表菜单栏(带有文件,编辑、视图等命令)
    Set cbBar = xlApp.CommandBars("Worksheet Menu Bar")
     '添加一个新按钮到工具菜单
    Set btNew = cbBar.FindControl(Id:=30007).Controls.Add(msoControlButton, , , , True)
    With btNew
        .OnAction = "Sub1"
         '设置一个唯一的标签,使我们自定义控件在后面容易找到或删除
        .Tag = "COMAddinTest"
         '设置提示文本
        .ToolTipText = "Calls Sub1"
         '设置显示在菜单中的标题
        .Caption = "Sub1"
    End With
    '获取cbevents类中的一个新实例
    Set ButtonEvent = New cbEvents
     '将它指定给我们所创建的按钮
    Set ButtonEvent.cbBtn = btNew
    ButtonEvents.Add ButtonEvent
    '添加另一个按钮
    Set btNew = cbBar.FindControl(Id:=30007).Controls.Add(msoControlButton, , , , True)
    With btNew
        .OnAction = "Sub2"
         '设置一个唯一的标签,使我们自定义控件在后面容易找到或删除
        .Tag = "COMAddinTest"
         '设置提示文本
        .ToolTipText = "Calls Sub2"
         '设置显示在菜单中的标题
        .Caption = "Sub2"
    End With
    '获取cbevents类中的一个新实例
    Set ButtonEvent = New cbEvents
     '将它指定给我们所创建的按钮
    Set ButtonEvent.cbBtn = btNew
ButtonEvents.Add ButtonEvent
End Sub

'删除自已定义的菜单的子程序
Public Sub RemoveToolbarButtons()
    Dim cbBar As CommandBar
    Dim cbCtr As CommandBarControl
     '忽略错误
    On Error Resume Next
     '需要从命令条中移除按钮
     '首先找到该按钮
    Set cbBar = xlApp.CommandBars("Worksheet Menu Bar")
     '运用我们所设置的标签查找控件
    Set cbCtr = cbBar.FindControl(, , "COMAddinTest")
    While Not cbCtr Is Nothing
         '删除
        cbCtr.Delete
        Set cbCtr = cbBar.FindControl(, , "COMAddinTest")
    Wend
     '恢复占用的内存
    Set ButtonEvents = Nothing
    Set ButtonEvent = Nothing
End Sub

'示例子过程
Sub sub1()
  MsgBox "Hello!"
End Sub

'示例子过程
Sub sub2()
  MsgBox "Hi!"
End Sub
‘****************************************
7、创建一个类模块来处理菜单栏事件。选择菜单“工程——添加类模块”,并命名为cbEvents,然后添加如下代码:
‘****************************************
Public WithEvents cbBtn As CommandBarButton
Private Sub cbBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
  '忽略产生的任何错误
  On Error Resume Next
  '检查OnAction属性并执行相应的程序
  Select Case Ctrl.OnAction
    Case "Sub1"
      sub1
    Case "Sub2"
      sub2
  End Select
  '查找指定给OnAction属性的程序删除Excel
  CancelDefault = True
End Sub
‘****************************************
8、生成dll文件。选择菜单“文件——生成dll”命令,将工程生成dll文件。
安装Excel COM加载宏
注册Dll
(1) Dll文件需要注册到Windows中以便能够运行。如果是在VB6中生成Dll文件,将在所创建该加载宏的计算机上自动注册。
(2)当然,也可以手工注册。点击屏幕左下角“开始”按钮,选择“运行”,在出现的“运行”对话框中的“打开”文本框中输入“regsvr32.exe <dllfilename>。
(3)若要移除或删除dll,先要注销它,即在“运行”对话框中使用regsvr32.exe命令并附加/u参数实现。
在Excel中安装加载宏
(1)若在VB6中创建该加载宏时,在设计器中设置初始化加载行为时选择“Startup”,则在装载Excel时,加载宏会自动装载并运行。
(2)如果没有选择“Startup”,则需要手动装载。选择菜单“工具——自定义”,在出现的“自定义”对话框中,选取“命令”标签,选择左侧“类别”中的“工具”项,在右侧中找到“COM加载项…”,拖动它到菜单栏中,关闭“自定义”对话框。此时,点击菜单栏中的“COM加载项…”命令,出现“COM加载项”对话框,刚才所生成的加载宏已出现在“可用加载项”列表中,选中或取消该加载宏前面的复选框来装载或卸载加载宏。
示例文档见testCOM加载宏文件夹中的test(Visual Basic Project)文件。 rQhZVafw.rar (25.53 KB, 下载次数: 1471)


(By fanjy in 2006-6-26)


[此贴子已经被作者于2006-6-26 20:07:54编辑过]

TA的精华主题

TA的得分主题

发表于 2006-6-26 20:20 | 显示全部楼层

谢谢分享~~有空试试~^_^

TA的精华主题

TA的得分主题

发表于 2006-6-26 20:31 | 显示全部楼层

哦,偶不大懂VB...

不过以后要好好学了...谢谢楼主分享!

TA的精华主题

TA的得分主题

发表于 2006-6-26 21:34 | 显示全部楼层
请问我的VB6为什么在新建工程中没有外接工程选项?可否告知,我是VB6简体中文版。谢谢!

TA的精华主题

TA的得分主题

发表于 2006-6-26 22:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-6-26 22:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习。。。谢楼主

TA的精华主题

TA的得分主题

发表于 2006-6-27 07:48 | 显示全部楼层

为什么“RemoveToolbarButtons”没有执行


[分享]使用VB6创建COM加载宏

[分享]使用VB6创建COM加载宏

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-27 08:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

请问我的VB6为什么在新建工程中没有外接工程选项?可否告知,我是VB6简体中文版。谢谢!

你可能安装的是标准版,请安装企业版试试.

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-27 08:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

为什么“RemoveToolbarButtons”没有执行

此主题相关图片如下:

取消COM加载项对话框中加载宏前面的复选框选中即可.

TA的精华主题

TA的得分主题

发表于 2006-6-27 08:31 | 显示全部楼层
QUOTE:
以下是引用fanjy在2006-6-27 8:24:05的发言:

QUOTE:
为什么“RemoveToolbarButtons”没有执行

此主题相关图片如下:

取消COM加载项对话框中加载宏前面的复选框选中即可.

取消过了,RemoveToolbarButtons没有把菜单清除,当再次选中复选框后,就变成如图所示了。

在While Not cbCtr Is Nothing下面加一句Msgbox cbCtr.Caption没有执行,很显然没有进入循环。

    While Not cbCtr Is Nothing
        MsgBox cbCtr.Caption
         '删除
        cbCtr.Delete
        Set cbCtr = cbBar.FindControl(, , "COMAddinTest")
        
    Wend

我是OFFICE2000下测试的,我已经重新引用了EXCEL9.0,并且已经在外接程序设计器中重新进行了设置,重新生成DLL。

[此贴子已经被作者于2006-6-27 8:35:06编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 11:33 , Processed in 0.049565 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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