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

80酷酷网    80kuku.com

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

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(英文)。

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: