对 Microsoft Office 命令栏进行更多编程(2)

编程

可以使用如下所示的代码测试该函数:

Public Sub TestAddComboBoxToCommandBar()

    ' 用途:测试 AddComboBoxToCommandBar 函数。

    Dim strChoices(4) As String
    
    strChoices(1) = "Vanilla"
    strChoices(2) = "Chocolate"
    strChoices(3) = "Strawberry"
    strChoices(4) = "Other"
    
    If AddComboBoxToCommandBar("Tools", "Favorite Ice Cream", _
        strChoices) = True Then
        
        MsgBox "组合框已成功添加。"
        
    Else
    
        MsgBox "未能添加组合框。"
        
    End If
    
End Sub

禁用和隐藏命令栏与命令栏控件
开发 Office 解决方案时,您可能需要防止用户在与该解决方案关联的某些命令栏和命令栏控件上单击。例如,您可能需要防止用户单击“窗体”工具栏上的任何控件,以免修改您在 Microsoft Word 中创建的自定义窗体。您也可能需要为给定的解决方案禁用“工具”菜单上的“宏”命令。

将命令栏或命令栏控件的 Enabled 属性设置为 False 可禁用命令栏或命令栏控件;同样,将命令栏或命令栏控件的 Enabled 属性设置为 True 可启用命令栏或命令栏控件。

将命令栏或命令栏控件的 Visible 属性设置为 False 可隐藏命令栏或命令栏控件;同样,将命令栏或命令栏控件的 Visible 属性设置为 True 可显示命令栏或命令栏控件。

要尝试此操作,请将以下代码行输入到“立即”窗口。每个代码行将切换指定的命令栏或命令栏控件的启用或可见状态。如果在 Outlook 或 Microsoft Visual Basic Editor 中输入此代码,请务必使用 Application.ActiveExplorer 或 Application.VBE 术语。要返回到开始时的启用或可见状态,请确保将每行运行两次。

Application.CommandBars("Tools").Enabled = _
  Not Application.CommandBars("Tools").Enabled
Application.CommandBars("Tools").Controls("Macro").Enabled = _
  Not Application.CommandBars("Tools").Controls("Macro").Enabled
Application.CommandBars("Tools").controls("Macro").Visible = _
  Not Application.CommandBars("Tools").controls("Macro").Visible

定位命令栏
命令栏的 Position 属性指定命令栏在应用程序中的位置。msoBarLeft、msoBarTop、msoBarRight 和 msoBarBottom 枚举常数指定在应用程序的左边、上边、右边或下边显示命令栏。msoBarFloating 枚举常数指定命令栏不靠接到应用程序的边缘。msoBarPopup 枚举常数指定命令栏是弹出菜单。

以下函数更改所指定的命令栏的位置。

Public Function ChangeCommandBarPosition(ByVal strCommandBarName As String, _
        ByVal msoPosition As MsoBarPosition) As Boolean

    ' 用途:更改命令栏的位置。
    ' 接受:
    '   strCommandBarName:要更改位置的命令栏名称。
    ' 返回:如果命令栏移动成功,则为 Ture。
    
    On Error GoTo ChangeCommandBarPosition_Err
    
    ' 将下一行代码替换为:
    ' Application.ActiveExplorer.CommandBars.Item(strCommandBarName).Position = _
  msoPosition <- 对于 Outlook
    ' Application.VBE.CommandBars.Item(strCommandBarName).Position = _
      msoPosition <- 对于 Visual Basic Editor
    Application.CommandBars.Item(strCommandBarName).Position = msoPosition
    
ChangeCommandBarPosition_End:
    
    ChangeCommandBarPosition = True
    Exit Function
        
ChangeCommandBarPosition_Err:

    ChangeCommandBarPosition = False
    
End Function

可以使用如下所示的代码测试该函数:

Public Sub TestChangeCommandBarPosition()

    ' 用途:测试 ChangeCommandBarPosition 函数。
    
    If ChangeCommandBarPosition("Standard", msoBarFloating) = True Then
    
        MsgBox "命令栏已成功移动。"
        
    Else
    
        MsgBox "未能移动命令栏。某些命令栏无法" & _
            "以某些方式移动。"
    
    End If
    
End Sub

动态添加和删除命令栏
有时需要将命令栏与特定 Office 文档关联在一起。例如,您需要在特定 Office 文档打开时才显示某些自定义命令栏,并在特定 Office 文档关闭时将其隐藏。要以编程方式执行此操作,使用 Excel 就是一个不错的示例。要测试该操作,请创建一个新的空白工作簿,然后将 Sheet1 重命名为 CommandBarInfo。将以下信息键入 CommandBarInfo 工作簿中:

图 4:在 Excel 中动态创建命令栏的信息

在 Visual Basic Editor 中,将以下代码添加到与新空白工作簿关联的新代码模块中:

Public Function CreateCommandBarPopup() As Boolean

    ' 用途:根据 Excel 工作表中提供的信息,
    ' 创建一个包含菜单项的命令栏弹出控件。
    
    ' 返回:如果命令栏弹出控件
    ' 成功添加,则为 True。
    
    Dim objWorksheet As Excel.Worksheet
    Dim objCommandBarControl As Office.CommandBarControl
    Dim objCommandBarPopup As Office.CommandBarPopup
    Dim objCommandBarButton As Office.CommandBarButton
    Dim intRow As Integer
    
    On Error GoTo CreateCommandBarPopup_Err
    
    ' 必须将包含命令栏信息的工作表
    ' 命名为“CommandBarInfo”。
    Set objWorksheet = ThisWorkbook.Sheets("CommandBarInfo")
    
    ' 从以前的版本中删除该控件的
    ' 所有现有实例。
    For Each objCommandBarControl In Application.CommandBars.Item("Standard").Controls
    
        If objCommandBarControl.Caption = objWorksheet.Cells(1, 1) Then
        
            objCommandBarControl.Delete
            
        End If
        
    Next objCommandBarControl
    
    Set objCommandBarPopup = _
      Application.CommandBars.Item("Standard").Controls.Add(msoControlPopup)
        
    objCommandBarPopup.Caption = objWorksheet.Cells(1, 1)
    
    intRow = 3
    
    ' 一直添加按钮,直到标题用尽为止。
    Do Until objWorksheet.Cells(intRow, 1) = ""
            
        With objCommandBarPopup
        
            Set objCommandBarButton = .Controls.Add(msoControlButton)
                    
            With objCommandBarButton
                    
                    .Caption = objWorksheet.Cells(intRow, 1)
                    .OnAction = objWorksheet.Cells(intRow, 2)
                                                            
            End With
            
        End With
        
        intRow = intRow + 1
        
    Loop
    
CreateCommandBarPopup_End:

    CreateCommandBarPopup = True
    Exit Function
    
CreateCommandBarPopup_Err:
    
    CreateCommandBarPopup = False
    
End Function

Public Function DeleteCommandBarPopup() As Boolean

    ' 用途:根据 Excel 工作表中提供的信息,
    ' 删除命令栏弹出控件。
    
    ' 返回:如果命令栏弹出控件被
    ' 成功删除,则为 True。
    
    Dim objWorksheet As Excel.Worksheet
    Dim objCommandBarControl As Office.CommandBarControl
    
    On Error GoTo DeleteCommandBarPopup_Err
    
    ' 必须将包含命令栏信息的工作表
    ' 命名为“CommandBarInfo”。
    Set objWorksheet = ThisWorkbook.Sheets("CommandBarInfo")
    
    ' 删除该控件的所有现有实例。
    For Each objCommandBarControl In Application.CommandBars.Item("Standard").Controls
    
        If objCommandBarControl.Caption = objWorksheet.Cells(1, 1) Then
        
            objCommandBarControl.Delete
            
        End If
        
    Next objCommandBarControl
    
DeleteCommandBarPopup_End:

    DeleteCommandBarPopup = True
    Exit Function
    
DeleteCommandBarPopup_Err:
    
    DeleteCommandBarPopup = False
    
End Function

Public Sub TestMacro()

    ' 用途:提供一个完整性测试宏。
    
    MsgBox "这是测试宏。"
    
End Sub

将以下代码添加到新空白工作簿的 ThisWorkbook 模块中:

Private Sub Workbook_Open()
    
    If CreateCommandBarPopup = False Then
    
        MsgBox "未能正确添加弹出菜单。"
    
    Else
    
        MsgBox "弹出菜单已成功添加。"
        
    End If

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    If DeleteCommandBarPopup = False Then
    
        MsgBox "未能正确删除弹出菜单。"
            
    Else
    
        MsgBox "弹出菜单已成功删除。"
        
    End If
    
End Sub

保存并关闭工作簿,然后重新打开该工作簿。请注意,“家务”弹出菜单已添加到“标准”工具栏中。还应注意,在关闭此工作簿时,“家务”弹出菜单将消失。

有关该技术的更详细版本,请参阅 Excel 资深专家 (MVP) John Walkenbach 提供的解决方案,网址为 http://j-walk.com/ss/excel/tips/tip53.htm(英文)。

时间: 2024-09-13 12:32:36

对 Microsoft Office 命令栏进行更多编程(2)的相关文章

对 Microsoft Office 命令栏进行更多编程(1)

编程 对 Microsoft Office 命令栏进行更多编程 Frank C. RiceMicrosoft Corporation Paul CornellMicrosoft Corporation 2002 年 5 月 2 日 在上个月的专栏(英文)中,我向您介绍了"命令栏",它们是在 Microsoft Office 中使用的用户界面组件,使用户能够在 Office 应用程序中执行操作.根据您对上个月专栏的反馈,我将向您介绍一些用于解决命令栏特定问题的附加信息和代码,具体内容包括

对 Microsoft Office 命令栏进行更多编程(3)

编程 CommandBarDocumenter 和 CommandBarControlDocumenter 子例程在开发命令栏解决方案时,我经常需要获取特定命令栏或命令栏控件的索引.名称或标题.我创建了 CommandBarDocumenter 和 CommandBarControlDocumenter 子例程,以便将所有命令栏和命令栏控件的公共属性记录在给定的 Office 应用程序中. 要运行这些示例,请在 Visual Basic Editor 中将以下代码复制到 Microsoft Of

使用 Microsoft Visual C# 进行 Microsoft Word 2002 和 Excel 2002 编程(一)

excel|visual|word|编程 使用 Microsoft Visual C# 进行 Microsoft Word 2002 和 Excel 2002 编程 Kerry Loynd 和 Siew-Moi KhorMicrosoft Corporation 2002年10月 适用于:    Microsoft Office XP    Microsoft Visual C#摘要:了解 Microsoft C# 和大型复杂的 COM 服务器之间的 COM 互操作性.本文介绍了如何准备 Off

使用 Microsoft Visual C# 进行 Microsoft Word 2002 和 Excel 2002 编程(二)

excel|visual|word|编程 示例 3:打开现有的 Word 文档 同 Documents.SaveAs 方法一样,Documents.Open 方法签名在 Office 2000 和 OfficeXP 之间也存在差别,因此新名称包装在 #if 声明中.Open 方法和 SaveAs 方法一样简单,如下所示:     object fileName = Environment.CurrentDirectory+"\\example3";    object optional

Programming Microsoft Office 2000 Web Components第一

第一章第二节 Office Web Components是什么? Office Web Components是一组的COM控件,设计的目的是为众多的控件容器提供交互的电子表格建模,数据报表和数据可视化功能.OWC库包含四个主要的组件:电子表格组件,图表组件,透视表组件和数据源组件.我们将在这一节中简要论述每个控件,然后在后续各章中讨论更多细节. 注释: COM也被称作ActiveX.当微软发明了术语"ActiveX"来描述COM技术时,我正在Visual Basic小组,这个术语使得我

Programming Microsoft Office 2000 Web Components第一章

web 译者说明:<Programming Microsoft Office 2000 Web Components>是我从网上下载的一本讲述OWC技术的英文电子书,之所以要翻译这本书,是基于以下几个想法:1.阅读英文资料时常常会不求甚解,忽略很多细节和不容易阅读的句子,如果强迫自己逐句的翻译出来,则会对原来的英文资料有更加全面.详细和深刻的了解.2.可以锻炼自己在英语方面的能力.3.能够给其他需要这方面的资料的朋友提供一定的帮助. 这是本人初次进行这方面的工作,本人的技术和英文能力都很一般,

Programming Microsoft Office 2000 Web Components第一章第一节

web 第一章第二节 Office Web Components是什么? Office Web Components是一组的COM控件,设计的目的是为众多的控件容器提供交互的电子表格建模,数据报表和数据可视化功能.OWC库包含四个主要的组件:电子表格组件,图表组件,透视表组件和数据源组件.我们将在这一节中简要论述每个控件,然后在后续各章中讨论更多细节. 注释: COM也被称作ActiveX.当微软发明了术语"ActiveX"来描述COM技术时,我正在Visual Basic小组,这个术

怎么删除ie浏览器命令栏上面的图标

在 Internet Explorer 9 (IE9) 命令栏中,添加了更多的IE快捷操作,让您在 IE 浏览器中进行各类操作的时候更加方便快捷.不过有时候我们安装某些软件以后,这些软件也会将一些相关的快捷操作图标按钮添加到命令栏中,让命令栏变得臃肿起来,如何才能删除 IE9 浏览器命令栏上面不需要的图标呢? 收起这个图片展开这个图片   解决方法: 在命令栏上单击右键,在移动鼠标至"自定义",单击"添加或删除命令". 收起这个图片展开这个图片   在弹出对话框的&

在Microsoft Office System中使用ADO.NET数据集(四)

ado|数据 在Office文档中使用DataSet中的数据 一旦DataSet中填充完毕你所需要的数据,并且断开了数据库连接,你就有多种方法在各种Office文档中使用这些数据.Microsoft Office System本质上不能处理大多数基于.NET的对象,因此,通常你必须使用COM互用性(COM interoperability)来维护这些数据,并将这些数据转换为你希望添入的工作表或其他文档所能识别的数据类型.你可以在Microsoft Office System使用它新集成的XML功