ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 如何用VB6的COM外接程序定制word2007功能区[4-24更新代码]

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-4-21 15:20 | 显示全部楼层 |阅读模式
本帖最后由 kqbt 于 2012-7-15 21:51 编辑

备注:最新代码在7楼
用VB6的COM 外接程序可以方便的对office系列软件进行定制,下面是我在制作过程中的体会。
一、创建外接程序
启动VB,在新建工程对话框中选择“外接程序”,如图1所示

[ 本帖最后由 三戒 于 2009-4-24 10:10 编辑 ]
Snap1.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-21 15:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
二、初始定制
1、在“项目资源管理器”窗口中,通过右键单击“Connect”打开设计器窗口,然后选择“查看对象”。从“应用程序”列表中选择“Microsoft Word”。
2、在“初始加载行为”列表中,选择“Startup”。
3、将外接程序显示名称更改为“Word 2007功能区测试 ”。
如图2所示
Snap2.jpg
4、在项目资源管理器中,右键单击“MyAddin”,然后在“属性”窗口中将该外接程序的名称更改为“RibbonForWord2007”。
5、从该项目中删除“frmAddin”(这个在本例中暂时不需要)。
6、在工程-引用中将Microsoft Office Object 8.0更改为Microsoft Office Object 12。(备注:只有这样才能定制和添加对 IRibbonExtensibility 接口的引用)

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-21 15:22 | 显示全部楼层
三、输入代码
1、在“项目”窗口中,右键单击“Connect”项并选择“查看代码”。在设计器的代码窗口中删除所有代码,因为这些代码可用于 Visual Basic 外接程序而不适用于 Microsoft Office 外接程序。
2、输入如下的代码
Option Explicit
Dim oWD As Object
Implements IRibbonExtensibility2 '添加对 IRibbonExtensibility 接口的引用

'启动
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
Set oWD = Application
MsgBox "我的com加载项已经成功加载!"
End Sub

'实现IRibbonExtensibility接口的唯一成员 GetCustomUI,此过程调用 GetRibbonXML 方法,正如其名称所示,
'该方法将自定义 XML 返回到 GetCustomUI 方法,后者然后将自定义 XML 添加到功能区用户界面以便在加载外接程序时实现它。
Public Function IRibbonExtensibility_GetCustomUI(ByVal RibbonID As String) As String
      IRibbonExtensibility_GetCustomUI = GetRibbonXML()
End Function

'添加 XML 自定义标记代码
Public Function GetRibbonXML() As String
   Dim sRibbonXML As String

    sRibbonXML = "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui"" >" & _
                "<ribbon>" & _
                "<tabs>" & _
                "<tab id=""CustomTab"" label=""sanjie"">" & _
                "<group id=""SampleGroup"" label=""Sample Group"">" & _
                "<button id=""Button"" label=""Insert Name"" size=""large"" imageMso=""HappyFace"" onAction=""InsertCompanyName"" />" & _
                "</group >" & _
                "</tab>" & _
                "</tabs>" & _
                "</ribbon>" & _
                "</customUI>"
   
   GetRibbonXML = sRibbonXML
   
   End Function

'控件回调的过程
Public Sub InsertCompanyName(ByVal control As IRibbonControl)
   ' Inserts the specified text at the beginning of a range.
   Dim MyText As String
   Dim MyRange As Object
   Set MyRange = oWD.ActiveDocument.Range
   MyText = "http://www.excelhome.net"
   ' Inserts text at the beginning
   ' of the active document.
   MyRange.InsertBefore (MyText)
End Sub

3、需要注意的是:了解XML语言和Office Ribbon定制技术的朋友,每一项元素的值必须要用英文4个双引号引起来。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-21 15:24 | 显示全部楼层
四、发布该com加载项
单击菜单【文件】→【生成RibbonForWord2007.dll】即可完成加载项的发布。
五、测试
当你打开word2007的时候,如果成功加载首先会提示你“我的com加载项已经成功加载!”,然后会在功能区添加一个选项卡,如图3所示,单击该选项卡的按钮,就会自动输入信息。
Snap3.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-21 15:28 | 显示全部楼层
第一次写这样的帖子,请多提建议,附件如下:

test.rar

6.41 KB, 下载次数: 635

TA的精华主题

TA的得分主题

发表于 2009-4-21 16:14 | 显示全部楼层
做个记号,以便他日使用!现在用的是Word 2003,下次下个Word 2007使用学习一下!
谢谢三戒兄分享!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-23 16:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
增加了根据word的版本生成工具栏的判别,如果是word 2007则增加功能区,2003及以前的版本增加菜单。
Option Explicit

Private oWD As Word.Application
Private WithEvents objButton1 As Office.CommandBarButton
Private WithEvents objButton2 As Office.CommandBarButton
Private WithEvents objButton3 As Office.CommandBarButton

Implements IRibbonExtensibility '添加对 IRibbonExtensibility 接口的引用

'========================================================================
  ''启动时执行的任务
'========================================================================

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
Set oWD = Application
Select Case oWD.Version
      Case "12.0"
        MsgBox "你正使用的版本是Office 12"
      Case "11.0"
        MsgBox "你正使用的版本是Office 11"
        Call CreateMenu
      Case Else
        MsgBox oWD.Version
        Call CreateMenu
End Select
        
End Sub


'========================================================================
  '移除时执行的任务
'========================================================================
Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
  Call DeleteMenu
  Set objButton1 = Nothing
  Set objButton2 = Nothing
  Set objButton3 = Nothing
  Set oWD = Nothing
End Sub


'========================================================================
  ''实现IRibbonExtensibility接口的唯一成员 GetCustomUI,此过程调用 GetRibbonXML 方法,正如其名称所示,
'该方法将自定义 XML 返回到 GetCustomUI 方法,后者然后将自定义 XML 添加到功能区用户界面以便在加载外接程序时实现它。
'========================================================================
Public Function IRibbonExtensibility_GetCustomUI(ByVal RibbonID As String) As String
      IRibbonExtensibility_GetCustomUI = GetRibbonXML()
End Function


'========================================================================
  '添加 XML 自定义标记代码
'========================================================================

Public Function GetRibbonXML() As String
   Dim sRibbonXML As String

    sRibbonXML = "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui"" >" & _
                "<ribbon>" & _
                "<tabs>" & _
                "<tab id=""CustomTab"" label=""sanjie"">" & _
                "<group id=""SampleGroup"" label=""Sample Group"">" & _
                "<button id=""Button"" label=""Insert Name"" size=""large"" imageMso=""HappyFace"" onAction=""InsertCompanyName"" />" & _
                "</group >" & _
                "</tab>" & _
                "</tabs>" & _
                "</ribbon>" & _
                "</customUI>"
   
   GetRibbonXML = sRibbonXML
   
End Function


'========================================================================
  ''控件回调的过程
'========================================================================

Public Sub InsertCompanyName(ByVal control As IRibbonControl)
   ' Inserts the specified text at the beginning of a range.
   Dim MyText As String
   Dim MyRange As Object
   Set MyRange = oWD.ActiveDocument.Range
   MyText = "http://www.excelhome.net"
   ' Inserts text at the beginning
   ' of the active document.
   MyRange.InsertBefore (MyText)
End Sub


'========================================================================
  '创建2003菜单
'========================================================================

Private Sub CreateMenu()

    Dim NewMenu As Office.CommandBarPopup
   
    Call DeleteMenu
        
    Set NewMenu = oWD.CommandBars("Menu Bar").Controls.Add(Type:=msoControlPopup, Temporary:=True)

    With NewMenu
        .Caption = "sanjie"
       Set objButton1 = .Controls.Add(Type:=msoControlButton)
           With objButton1
              .Caption = "输入信息"
              .FaceId = 23
              .Tag = "Button1"
           End With
   
       Set objButton2 = .Controls.Add(Type:=msoControlButton)
          With objButton2
              .Caption = "显示当前Word版本"
              .FaceId = 116
              .Tag = "Button2"
          End With
   
      Set objButton3 = .Controls.Add(Type:=msoControlButton)
         With objButton3
              .Caption = "关于..."
             .BeginGroup = True
             .FaceId = 984
             .Tag = "Button3"
         End With
    End With
End Sub

'========================================================================
  '删除菜单2003
'========================================================================

Private Sub DeleteMenu()
    On Error Resume Next
    'CommandBars(1).Reset
    oWD.CommandBars("Menu Bar").Controls("sanjie").Delete
End Sub

'========================================================================
  '按钮1的动作
'========================================================================

Private Sub objButton1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   Dim MyText As String
   Dim MyRange As Object
   Set MyRange = oWD.ActiveDocument.Range
   MyText = "http://www.excelhome.net"
   MyRange.InsertBefore (MyText)
End Sub

'========================================================================
  '按钮2的动作
'========================================================================
Private Sub objButton2_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   MsgBox oWD.Version
End Sub

'========================================================================
  '按钮3的动作
'========================================================================

Private Sub objButton3_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   MsgBox "三戒制作!", vbInformation, Title:="ok"
End Sub

[ 本帖最后由 三戒 于 2009-4-24 10:05 编辑 ]

test.rar

31.49 KB, 下载次数: 635

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-23 16:35 | 显示全部楼层
这是编译好的dll文件,有兴趣的朋友请测试

[ 本帖最后由 三戒 于 2009-4-24 09:54 编辑 ]

RibbonForWord2007.rar

7.84 KB, 下载次数: 463

TA的精华主题

TA的得分主题

发表于 2009-4-23 18:45 | 显示全部楼层
谢谢分享,请教三戒兄,IRibbonExtensibility接口的问题,我第一次接触,不知有什么作用,是为了实现在word2007中功能区的定制,还是别的功能?能否详细说明?
在2003中测试 ,不知三戒兄注意到没有,您的加载项存在我们讨论过的一个问题:按钮只对第一个文档有效。卸载后菜单没有彻底卸载。

[ 本帖最后由 wjhere 于 2009-4-23 19:08 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-23 20:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 wjhere 于 2009-4-23 18:45 发表
谢谢分享,请教三戒兄,IRibbonExtensibility接口的问题,我第一次接触,不知有什么作用,是为了实现在word2007中功能区的定制,还是别的功能?能否详细说明?
在2003中测试 ,不知三戒兄注意到没有,您的加载项存在 ...

1、创建加载项项目后,需要实现 IRibbonExtensibility 接口(该接口包括在 Microsoft.Office.Core 命名空间中)。此接口包含一个称为 GetCustomUI 的方法。使用此方法可将 XML 功能区自定义代码返回到 Office 应用程序。然后您可以添加编程过程,实现自定义功能区的功能。
2、刚才又测试了一番,没有您说的按钮只对第一个文档有效。卸载后菜单没有彻底卸载。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-5 10:14 , Processed in 0.044325 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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