Содержание
- 1 Add a new commandbar
- 2 Add ControlButton to CommandBar
- 3 Adding a control to a command bar
- 4 Add PopupControl to CommandBar
- 5 Adjusting a control»s Visible property
- 6 Attaching a drop-down list to a command bar
- 7 Changing a control»s caption dynamically: Showing the user the current cell»s number format
- 8 CommandBar Object
- 9 CommandBars collection
- 10 Counting custom toolbars
- 11 Create Shortcut
- 12 Creating a command bar: Set some properties when you create a new toolbar
- 13 Creating a Toolbar: AddRemoveButton
- 14 Creating a Toolbar and assign its action
- 15 Creating a Toolbar and display MsgBox in its action
- 16 Custom Toolbars
- 17 deletes a control that has a caption of SortButton.
- 18 Determines if a given command bar name exists
- 19 Display Control Detail
- 20 display shortcut menu with the ShowPopup method
- 21 displays the Caption property for the first Control object contained in the Standard toolbar, whose index is 3.
- 22 Finding Visible Controls with FindControls
- 23 Get the type of CommandBars
- 24 how your VBA code can change the position of a toolbar.
- 25 Inspecting a CommandBar
- 26 Listing all controls on all toolbars
- 27 Listing the controls on a command bar
- 28 Properties of CommandBar controls
- 29 Rather than use an index number to refer to a control, you can use its Caption property setting
- 30 Referring to command bars
- 31 Removes a toolbar specified by the name passed in
- 32 Removing all toolbars and then restoring them
- 33 Replacing Excel»s built-in menu with your own
- 34 Reset CommandBar
- 35 Restores the Worksheet Menu Bar to its native state
- 36 Restore tool bar
- 37 Save list of all predefined commands and their ID numbers in a file
- 38 Set Control style, Action, group, faceid and caption
- 39 sets the FaceId property of the first button on the MyToolbar toolbar image to 45, which is the code number for a mailbox icon.
- 40 Show All Toolbar Controls
- 41 Show CommandBar Names
- 42 show/hide check symbol
- 43 Shows or hides a command bar.
- 44 simply copies the NumberFormat property of the ActiveCell to the Caption property of the button control.
- 45 The custom toolbar is removed with this procedure
- 46 The Protection constants are additive: apply different types of protection with a single command
- 47 The Protection property of a CommandBar object provides you with many options for protecting a CommandBar.
- 48 This toolbar exists only when the cell pointer falls within a given range
- 49 To delete a control from a CommandBar object, use the Delete method of the Controls collection
- 50 Translates a MsoBarPosition enumeration into a text description of the bar position.
- 51 Translates a MsoBarType enumeration into a text description of the bar type.
- 52 Translates a MsoControlType enumeration into a text description of the control type.
- 53 Working with Shortcut Menus
Add a new commandbar
<source lang="vb">
Sub AddNewCB()
Dim myCommandBar As CommandBar, myCommandBarCtl As CommandBarControl On Error GoTo AddNewCB_Err Set myCommandBar = CommandBars.Add(Name:="Sample Toolbar", Position:= msoBarFloating) myCommandBar.Visible = True Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlButton) With myCommandBarCtl .Caption = "Button" .Style = msoButtonCaption .TooltipText = "Display Message Box" .OnAction = "=MsgBox(""You pressed a toolbar button!"")" End With Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlButton) With myCommandBarCtl .FaceId = 1000 .Caption = "Toggle Button" .TooltipText = "Toggle First Button" .OnAction = "=ToggleButton()" End With Set myCommandBarCtl = myCommandBar.Controls.Add(msoControlComboBox) With myCommandBarCtl .Caption = "Drop Down" .Width = 100 .AddItem "Create Button", 1 .AddItem "Remove Button", 2 .DropDownWidth = 100 .OnAction = "=AddRemoveButton()" End With Exit Sub
AddNewCB_Err:
Debug.Print Err.number & vbCr & Err.Description Exit Sub
End Sub
Function ToggleButton()
Dim CBButton As CommandBarControl On Error GoTo ToggleButton_Err Set CBButton = CommandBars("Sample Toolbar").Controls(1) CBButton.Visible = Not CBButton.Visible Exit Function
ToggleButton_Err:
Debug.Print Err.number & vbCr & Err.Description Exit Function
End Function
Function AddRemoveButton()
Dim myCommandBar As CommandBar, CBCombo As CommandBarComboBox Dim CBNewButton As CommandBarButton On Error GoTo AddRemoveButton_Err Set myCommandBar = CommandBars("Sample Toolbar") Set CBCombo = myCommandBar.Controls(3) Select Case CBCombo.ListIndex Case 1 Set CBNewButton = myCommandBar.Controls.Add(Type:=msoControlButton) With CBNewButton .Caption = "New Button" .Style = msoButtonCaption .BeginGroup = True .Tag = "New Button" .OnAction = "=MsgBox(""This is a new button!"")" End With Case 2 Set CBNewButton = myCommandBar.FindControl(Tag:="New Button") CBNewButton.Delete End Select Exit Function
AddRemoveButton_Err:
If Err.number = 91 Then Debug.Print "Cannot remove button that does not exist!" Exit Function Else Debug.Print Err.number & vbCr & Err.Description Exit Function End If
End Function
</source>
Add ControlButton to CommandBar
<source lang="vb">
Sub AddNewMB()
Dim myCommandBar As CommandBar, myCommandBarCtl As CommandBarControl Dim myCommandBarSubCtl As CommandBarControl On Error GoTo AddNewMB_Err Set myCommandBar = CommandBars.Add(Name:="Sample Menu Bar", Position:= _ msoBarTop, MenuBar:=True, Temporary:=False) myCommandBar.Visible = True myCommandBar.Protection = msoBarNoMove Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlPopup) myCommandBarCtl.Caption = "Displa&y" Set myCommandBarSubCtl = myCommandBarCtl.Controls.Add(Type:=msoControlButton) With myCommandBarSubCtl .Style = msoButtonIconAndCaption .Caption = "E&nable ClickMe" .FaceId = 59 .OnAction = "=MsgBox(""You clicked Enable ClickMe"")" .Parameter = 1 .BeginGroup = True End With Set myCommandBarSubCtl = myCommandBarCtl.Controls.Add(Type:=msoControlButton) With myCommandBarSubCtl .Style = msoButtonIconAndCaption .Caption = "Di&sable ClickMe" .FaceId = 276 .OnAction = "=MsgBox(""You Disable ClickMe"")" .Parameter = 2 .BeginGroup = True End With Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlButton) With myCommandBarCtl .BeginGroup = True .Caption = "&ClickMe" .Style = msoButtonCaption .OnAction = "=MsgBox(""You clicked ClickMe"")" End With Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlButton) With myCommandBarCtl .BeginGroup = True .Caption = "&Set Visibility Off" .Style = msoButtonCaption .OnAction = "=MsgBox(""You set visibility off"")" End With Exit Sub
AddNewMB_Err:
msgBox "Error " & Err.number & vbCr & Err.Description Exit Sub
End Sub
</source>
Adding a control to a command bar
<source lang="vb">
Sub AddButton()
Set NewBtn = CommandBars("MyToolbar").Controls.Add _ (Type:=msoControlButton) With NewBtn .FaceId = 300 .OnAction = "MyMacro" .Caption = "Tooltip goes here" End With
End Sub
</source>
Add PopupControl to CommandBar
<source lang="vb">
Sub AddNewMB()
Dim myCommandBar As CommandBar, myCommandBarCtl As CommandBarControl Dim myCommandBarSubCtl As CommandBarControl On Error GoTo AddNewMB_Err Set myCommandBar = CommandBars.Add(Name:="Sample Menu Bar", Position:= _ msoBarTop, MenuBar:=True, Temporary:=False) myCommandBar.Visible = True myCommandBar.Protection = msoBarNoMove Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlPopup) myCommandBarCtl.Caption = "Displa&y" Set myCommandBarSubCtl = myCommandBarCtl.Controls.Add(Type:=msoControlButton) With myCommandBarSubCtl .Style = msoButtonIconAndCaption .Caption = "E&nable ClickMe" .FaceId = 59 .OnAction = "=ToggleClickMe()" .Parameter = 1 .BeginGroup = True End With
AddNewMB_Err:
msgBox "Error " & Err.number & vbCr & Err.Description Exit Sub
End Sub
Function ToggleClickMe()
Dim MyMenu As CommandBar Dim myCommandBarClickMe As CommandBarControl On Error GoTo ToggleClickMe_Err Set MyMenu = CommandBars("Sample Menu Bar") Set myCommandBarClickMe = MyMenu.Controls(2) With CommandBars.ActionControl Select Case .Parameter Case 1 myCommandBarClickMe.Enabled = True Case 2 myCommandBarClickMe.Enabled = False End Select End With Exit Function
ToggleClickMe_Err:
msgBox "Error " & Err.number & vbCr & Err.Description Exit Function
End Function
</source>
Adjusting a control»s Visible property
<source lang="vb">
Sub ToggleAllToolbars()
For Each cb In CommandBars If cb.Type = msoBarTypeNormal Then cb.Visible = Not cb.Visible End If Next cb
End Sub
</source>
Attaching a drop-down list to a command bar
<source lang="vb">
Sub Make()
Dim TBar As commandBar Dim NewDD As CommandBarControl Set TBar = CommandBars.Add Set NewDD = CommandBars("myBar").Controls.Add(Type:=msoControlDropdown) With NewDD .Caption = "Date" .OnAction = "yourAction" .Style = msoButtonAutomatic For i = 1 To 2 .AddItem "Click" Next i .ListIndex = 1 End With
End Sub
Sub yourAction()
With CommandBars("MonthList").Controls("DateDD") ActiveCell.value = .List(.ListIndex) End With
End Sub
</source>
Changing a control»s caption dynamically: Showing the user the current cell»s number format
<source lang="vb">
Sub MakeNumberFormatDisplay()
Dim TBar As CommandBar Dim NewBtn As CommandBarButton Set TBar = CommandBars.Add With TBar .Name = "Number Format" .Visible = True End With Set NewBtn = CommandBars("Number Format").Controls.Add(Type:=msoControlButton) With NewBtn .Caption = "" .OnAction = "ChangeNumFormat" .Style = msoButtonCaption End With
End Sub
</source>
CommandBar Object
<source lang="vb">
Sub CommandBarCount()
MsgBox "There are " & CommandBars.count & " command bars"
End Sub
</source>
CommandBars collection
<source lang="vb">
Sub com()
MsgBox CommandBars(1).Name
End Sub
</source>
Counting custom toolbars
<source lang="vb">
Sub CustomToolbars()
Dim cb As CommandBar For Each cb In CommandBars If cb.Type = msoBarTypeNormal Then If Not cb.BuiltIn Then Debug.Print "Not" End If End If Next cb
End Sub
</source>
Create Shortcut
<source lang="vb">
Sub CreateShortcut()
DeleteShortcut Set myBar = CommandBars.Add (Name:="MyShortcut", Position:=msoBarPopup, Temporary:=True) Set myItem = myBar.Controls.Add(Type:=msoControlButton) With myItem .Caption = "&Number Format..." .OnAction = "ShowFormatNumber" .FaceId = 1554 End With Set myItem = myBar.Controls.Add(Type:=msoControlButton) With myItem .Caption = "&Alignment..." .OnAction = "ShowFormatAlignment" .FaceId = 217 End With Set myItem = myBar.Controls.Add(Type:=msoControlButton) With myItem .Caption = "&Font..." .OnAction = "ShowFormatFont" .FaceId = 291 End With
End Sub
Sub ShowFormatNumber()
Application.Dialogs(xlDialogFormatNumber).Show
End Sub
Sub ShowFormatAlignment()
Application.Dialogs(xlDialogAlignment).Show
End Sub
Sub ShowFormatFont()
Application.Dialogs(xlDialogFormatFont).Show
End Sub
</source>
Creating a command bar: Set some properties when you create a new toolbar
<source lang="vb">
Sub CreateAToolbar()
Dim TBar As CommandBar Set TBar = CommandBars.Add With TBar .name = "MyToolbar" .Top = 0 .Left = 0 .Visible = True End With
End Sub
</source>
Creating a Toolbar: AddRemoveButton
<source lang="vb">
Sub AddNewCB()
Dim myCommandBar As CommandBar, myCommandBarCtl As CommandBarControl On Error GoTo AddNewCB_Err Set myCommandBar = CommandBars.Add(Name:="Sample Toolbar", Position:= _ msoBarFloating) myCommandBar.Visible = True Set myCommandBarCtl = myCommandBar.Controls.Add(msoControlComboBox) With myCommandBarCtl .Caption = "Drop Down" .Width = 100 .AddItem "Create Button", 1 .AddItem "Remove Button", 2 .DropDownWidth = 100 .OnAction = "=AddRemoveButton()" End With Exit Sub
AddNewCB_Err:
msgBox "Error " & Err.number & vbCr & Err.Description Exit Sub
End Sub
Function AddRemoveButton()
Dim myCommandBar As CommandBar, CBCombo As CommandBarComboBox Dim CBNewButton As CommandBarButton On Error GoTo AddRemoveButton_Err Set myCommandBar = CommandBars("Sample Toolbar") Set CBCombo = myCommandBar.Controls(3) Select Case CBCombo.ListIndex Case 1 Set CBNewButton = myCommandBar.Controls.Add(Type:=msoControlButton) With CBNewButton .Caption = "New Button" .Style = msoButtonCaption .BeginGroup = True .Tag = "New Button" .OnAction = "=MsgBox(""This is a new button!"")" End With Case 2 Set CBNewButton = myCommandBar.FindControl(Tag:="New Button") CBNewButton.Delete End Select Exit Function
AddRemoveButton_Err:
If Err.number = 91 Then msgBox "Cannot remove button that does not exist!" Exit Function Else msgBox "Error " & Err.number & vbCr & Err.Description Exit Function End If
End Function
</source>
Creating a Toolbar and assign its action
<source lang="vb">
Function ToggleButton()
Dim CBButton As CommandBarControl On Error GoTo ToggleButton_Err Set CBButton = CommandBars("Sample Toolbar").Controls(1) CBButton.Visible = Not CBButton.Visible Exit Function
ToggleButton_Err:
msgBox "Error " & Err.number & vbCr & Err.Description Exit Function
End Function
Sub AddNewCB()
Dim myCommandBar As CommandBar, myCommandBarCtl As CommandBarControl On Error GoTo AddNewCB_Err Set myCommandBar = CommandBars.Add(Name:="Sample Toolbar", Position:= _ msoBarFloating) myCommandBar.Visible = True Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlButton) With myCommandBarCtl .FaceId = 1000 .Caption = "Toggle Button" .TooltipText = "Toggle First Button" .OnAction = "=ToggleButton()" End With Exit Sub
AddNewCB_Err:
msgBox "Error " & Err.number & vbCr & Err.Description Exit Sub
End Sub
</source>
Creating a Toolbar and display MsgBox in its action
<source lang="vb">
Sub AddNewCB()
Dim myCommandBar As CommandBar, myCommandBarCtl As CommandBarControl On Error GoTo AddNewCB_Err Set myCommandBar = CommandBars.Add(Name:="Sample Toolbar", Position:= _ msoBarFloating) myCommandBar.Visible = True Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlButton) With myCommandBarCtl .Caption = "Button" .Style = msoButtonCaption .TooltipText = "Display Message Box" .OnAction = "=MsgBox(""You pressed a toolbar button!"")" End With Exit Sub
AddNewCB_Err:
msgBox "Error " & Err.number & vbCr & Err.Description Exit Sub
End Sub
</source>
Custom Toolbars
<source lang="vb">
Private tlbMyToolbar As CommandBar
«Add tool bar
Sub AddToolbar()
Dim tlbMyButton As CommandBarButton Set tlbMyToolbar = Application.rumandBars.Add( _ name:=" Example Toolbar", _ Position:=msoBarFloating, _ Temporary:=True) tlbMyToolbar.Visible = True Set tlbMyButton = tlbMyToolbar.Controls.Add( _ Type:=msoControlButton, _ Temporary:=True) tlbMyButton.Style = msoButtonIconAndCaption tlbMyButton.Picture = LoadPicture(ActiveWorkbook.Path & "myImage.bmp") tlbMyButton.Caption = "Test"
End Sub
</source>
deletes a control that has a caption of SortButton.
<source lang="vb">
Sub commandBar()
CommandBars("MyToolbar").Controls("SortButton").Delete
End Sub
</source>
Determines if a given command bar name exists
<source lang="vb">
Sub TestCommandBarUtilities()
Debug.Print CommandBarExists("Worksheet Menu Bar") Debug.Print CommandBarExists("Formatting") Debug.Print CommandBarExists("Not a command bar")
End Sub
Function CommandBarExists(sName As String) As Boolean
Dim s As String On Error GoTo bWorksheetExistsErr s = Application.rumandBars(sName).Name CommandBarExists = True Exit Function
bWorksheetExistsErr:
CommandBarExists = False
End Function
</source>
Display Control Detail
<source lang="vb">
Private Sub DisplayControlDetail()
Dim cb As CommandBar Dim cbc As CommandBarControl On Error Resume Next For Each cb In Application.rumandBars For Each cbc In cb.Controls Debug.Print Replace(cbc.Caption, "&", "") Debug.Print cbc.Caption Debug.Print cbc.Index Debug.Print cbc.BuiltIn Debug.Print cbc.Enabled Debug.Print cbc.Visible Debug.Print cbc.IsPriorityDropped Debug.Print cbc.Priority Debug.Print TranslateControlType(cbc.Type) Debug.Print cbc.Controls.Count Next Next Set cbc = Nothing
End Sub
Function TranslateControlType(vType As MsoControlType) As String
Dim sType As String Select Case vType Case Is = MsoControlType.msoControlActiveX sType = "ActiveX" Case Is = MsoControlType.msoControlAutoCompleteCombo sType = "Auto Complete Combo" Case Is = MsoControlType.msoControlButton sType = "Button" Case Is = MsoControlType.msoControlButtonDropdown sType = "Button Dropdown" Case Is = MsoControlType.msoControlButtonPopup sType = "Button Popup" Case Is = MsoControlType.msoControlComboBox sType = "Combo Box" Case Is = MsoControlType.msoControlCustom sType = "Custom" Case Is = MsoControlType.msoControlDropdown sType = "Dropdown" Case Is = MsoControlType.msoControlEdit sType = "Edit" Case Is = MsoControlType.msoControlExpandingGrid sType = "Expanding Grid" Case Is = MsoControlType.msoControlGauge sType = "Gauge" Case Is = MsoControlType.msoControlGenericDropdown sType = "Generic Dropdown" Case Is = MsoControlType.msoControlGraphicCombo sType = "Graphic Combo" Case Is = MsoControlType.msoControlGraphicDropdown sType = "Graphic Dropdown" Case Is = MsoControlType.msoControlGraphicPopup sType = "Graphic Popup" Case Is = MsoControlType.msoControlGrid sType = "Grid" Case Is = MsoControlType.msoControlLabel sType = "Label" Case Is = MsoControlType.msoControlLabelEx sType = "Label Ex" Case Is = MsoControlType.msoControlOCXDropdown sType = "OCX Dropdown" Case Is = MsoControlType.msoControlPane sType = "Pane" Case Is = MsoControlType.msoControlPopup sType = "Popup" Case Is = MsoControlType.msoControlSpinner sType = "Spinner" Case Is = MsoControlType.msoControlSplitButtonMRUPopup sType = "Split Button MRU Popup" Case Is = MsoControlType.msoControlSplitButtonPopup sType = "Split Button Popup" Case Is = MsoControlType.msoControlSplitDropdown sType = "Split Dropdown" Case Is = MsoControlType.msoControlSplitExpandingGrid sType = "Split Expanding Grid" Case Is = MsoControlType.msoControlWorkPane sType = "Work Pane" Case Else sType = "Unknown control type" End Select TranslateControlType = sType
End Function
</source>
<source lang="vb">
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
CommandBars("MyShortcut").ShowPopup Cancel = True
End Sub
</source>
displays the Caption property for the first Control object contained in the Standard toolbar, whose index is 3.
<source lang="vb">
Sub Test()
MsgBox CommandBars(3).Controls(1).Caption
End Sub
</source>
Finding Visible Controls with FindControls
<source lang="vb">
Sub FindVisibleControls()
Dim ctrls As CommandBarControls Dim ctrl As CommandBarControl Set ctrls = Application.rumandBars.FindControls(, , , True) For Each ctrl In ctrls Debug.Print ctrl.Parent.name Debug.Print ctrl.Caption Debug.Print ctrl.Index Debug.Print ctrl.ID Debug.Print ctrl.Enabled Debug.Print ctrl.Visible Debug.Print ctrl.IsPriorityDropped Debug.Print TranslateControlType(ctrl.Type) Next Set ctrl = Nothing Set ctrls = Nothing
End Sub
Function TranslateControlType(vType As MsoControlType) As String
Dim sType As String Select Case vType Case Is = MsoControlType.msoControlActiveX sType = "ActiveX" Case Is = MsoControlType.msoControlAutoCompleteCombo sType = "Auto Complete Combo" Case Is = MsoControlType.msoControlButton sType = "Button" Case Is = MsoControlType.msoControlButtonDropdown sType = "Button Dropdown" Case Is = MsoControlType.msoControlButtonPopup sType = "Button Popup" Case Is = MsoControlType.msoControlComboBox sType = "Combo Box" Case Is = MsoControlType.msoControlCustom sType = "Custom" Case Is = MsoControlType.msoControlDropdown sType = "Dropdown" Case Is = MsoControlType.msoControlEdit sType = "Edit" Case Is = MsoControlType.msoControlExpandingGrid sType = "Expanding Grid" Case Is = MsoControlType.msoControlGauge sType = "Gauge" Case Is = MsoControlType.msoControlGenericDropdown sType = "Generic Dropdown" Case Is = MsoControlType.msoControlGraphicCombo sType = "Graphic Combo" Case Is = MsoControlType.msoControlGraphicDropdown sType = "Graphic Dropdown" Case Is = MsoControlType.msoControlGraphicPopup sType = "Graphic Popup" Case Is = MsoControlType.msoControlGrid sType = "Grid" Case Is = MsoControlType.msoControlLabel sType = "Label" Case Is = MsoControlType.msoControlLabelEx sType = "Label Ex" Case Is = MsoControlType.msoControlOCXDropdown sType = "OCX Dropdown" Case Is = MsoControlType.msoControlPane sType = "Pane" Case Is = MsoControlType.msoControlPopup sType = "Popup" Case Is = MsoControlType.msoControlSpinner sType = "Spinner" Case Is = MsoControlType.msoControlSplitButtonMRUPopup sType = "Split Button MRU Popup" Case Is = MsoControlType.msoControlSplitButtonPopup sType = "Split Button Popup" Case Is = MsoControlType.msoControlSplitDropdown sType = "Split Dropdown" Case Is = MsoControlType.msoControlSplitExpandingGrid sType = "Split Expanding Grid" Case Is = MsoControlType.msoControlWorkPane sType = "Work Pane" Case Else sType = "Unknown control type" End Select TranslateControlType = sType
End Function
</source>
Get the type of CommandBars
<source lang="vb">
Sub listCommandBars()
Dim comBar As CommandBar Dim comBarType As String For Each comBar In CommandBars Select Case comBar.Type Case msoBarTypeNormal comBarType = "Toolbar" Case msoBarTypeMenuBar comBarType = "Menu Bar" Case msoBarTypePopup comBarType = "Shortcut" End Select Debug.Print comBar.Index, comBar.Name, comBarType, comBar.Visible Next
End Sub
</source>
how your VBA code can change the position of a toolbar.
<source lang="vb">
Sub MoveToolbar()
With CommandBars("MyToolbar") OldLeft = .Left OldTop = .Top For i = 1 To 60 .Left = Int(vidWidth * Rnd) .Top = Int(vidHeight * Rnd) DoEvents Next i .Left = OldLeft .Top = OldTop End With
End Sub
</source>
Inspecting a CommandBar
<source lang="vb">
Sub DisplayGeneralInfo()
Dim cb As CommandBar For Each cb In Application.rumandBars Debug.Print "Name:" & cb.Name Debug.Print "Index:" & cb.Index Debug.Print "Built In:" & cb.BuiltIn Debug.Print "Enabled:" cb.Enabled Debug.Print "Visible:" & cb.Visible Debug.Print "Type:" & TranslateCommandBarType(cb.Type) Debug.Print "Position:" & TranslateCommandBarPosition(cb.Position) Debug.Print "Control Count:" & cb.Controls.Count Next
End Sub
Function TranslateCommandBarPosition(vType As MsoBarPosition) As String
Dim sPosition As String Select Case vType Case Is = MsoBarPosition.msoBarBottom sPosition = "Bottom" Case Is = MsoBarPosition.msoBarFloating sPosition = "Floating" Case Is = MsoBarPosition.msoBarLeft sPosition = "Left" Case Is = MsoBarPosition.msoBarMenuBar sPosition = "Menu Bar" Case Is = MsoBarPosition.msoBarPopup sPosition = "Popup" Case Is = MsoBarPosition.msoBarRight sPosition = "Right" Case Is = MsoBarPosition.msoBarTop sPosition = "Top" Case Else sPosition = "Unknown position" End Select TranslateCommandBarPosition = sPosition
End Function
Function TranslateCommandBarType(vType As MsoBarType) As String
Dim sType As String Select Case vType Case Is = MsoBarType.msoBarTypeMenuBar sType = "Menu Bar" Case Is = MsoBarType.msoBarTypeNormal sType = "Normal" Case Is = MsoBarType.msoBarTypePopup sType = "Popup" Case Else sType = "Unknown type" End Select TranslateCommandBarType = sType
End Function
</source>
Listing all controls on all toolbars
<source lang="vb">
Sub ShowAllToolbarControls()
For Each myCommandBar In CommandBars If myCommandBar.Type = msoBarTypeNormal Then Debug.Print myCommandBar.name For Each ctl In myCommandBar.Controls Debug.Print ctl.Caption Next ctl End If Next myCommandBar
End Sub
</source>
Listing the controls on a command bar
<source lang="vb">
Sub ShowControlCaptions()
Dim myCommandBar As commandBar Set myCommandBar = CommandBars("Standard") For Each ctl In myCommandBar.Controls Debug.Print ctl.Caption Next ctl </source>
Properties of CommandBar controls
<source lang="vb">
Sub ShowShortcutMenuItems()
Dim myCommandBar As CommandBar Dim Ctl As CommandBarControl Application.ScreenUpdating = False For Each myCommandBar In Application.rumandBars If myCommandBar.Type = msoBarTypePopup Then Debug.Print myCommandBar.Index Debug.Print myCommandBar.Name For Each Ctl In myCommandBar.Controls If Ctl.Visible Then Debug.Print Ctl.Caption Else Debug.Print "<" & Ctl.Caption & ">" End If Next Ctl End If Next myCommandBar
End Sub
</source>
Rather than use an index number to refer to a control, you can use its Caption property setting
<source lang="vb">
Sub Test2()
MsgBox CommandBars("Standard").Controls("New").Caption
End Sub
</source>
Referring to command bars
<source lang="vb">
Function CommandBarExists(n) As Boolean
Dim cb As CommandBar For Each cb In CommandBars If UCase(cb.Name) = UCase(n) Then CommandBarExists = True Exit Function End If Next cb CommandBarExists = False
End Function
</source>
Removes a toolbar specified by the name passed in
<source lang="vb">
Sub RemoveToolbar(tlbarName As String)
Dim myCommandBar As CommandBar For Each myCommandBar In Application.rumandBars If myCommandBar.Name = tlbarName Then myCommandBar.Delete Exit For End If Next
End Sub
</source>
Removing all toolbars and then restoring them
<source lang="vb">
Sub HideAllToolbars()
Dim toolBar As commandBar Dim toolBarNum As Integer Dim toolBarSheet As Worksheet Set toolBarSheet = Sheets("Sheet1") Application.ScreenUpdating = False toolBarSheet.Cells.Clear toolBarNum = 0 For Each toolBar In CommandBars If toolBar.Type = msoBarTypeNormal Then If toolBar.Visible Then toolBarNum = toolBarNum + 1 toolBar.Visible = False toolBarSheet.Cells(toolBarNum, 1) = toolBar.name End If End If Next toolBar Application.ScreenUpdating = True
End Sub
</source>
<source lang="vb">
Sub MakeMenuBar()
Dim NewMenuBar As commandBar Set NewMenuBar = CommandBars.Add(MenuBar:=True) With NewMenuBar .name = "MyMenuBar" .Visible = True End With CommandBars("Worksheet Menu Bar") _ .Controls(1).Copy Bar:=CommandBars("MyMenuBar") Set NewMenu = NewMenuBar.Controls.Add _ (Type:=msoControlPopup) NewMenu.Caption = "&Commands" Set NewItem = NewMenu.Controls.Add(Type:=msoControlButton) With NewItem .Caption = "&Restore Normal Menu" .OnAction = "DeleteMenuBar" End With Set NewItem = NewMenu.Controls.Add(Type:=msoControlButton) With NewItem .Caption = "&Help" .OnAction = "DeleteMenuBar" End With
End Sub
Sub DeleteMenuBar()
On Error Resume Next CommandBars("MyMenuBar").Delete On Error GoTo 0
End Sub
</source>
Reset CommandBar
<source lang="vb">
Sub ResetAll()
Dim myCommandBar As CommandBar For Each myCommandBar In Application.rumandBars If myCommandBar.Type = msoBarTypePopup Then myCommandBar.Reset myCommandBar.Enabled = True End If Next myCommandBar
End Sub
</source>
<source lang="vb">
Private Sub ResetCommandBar()
Application.rumandBars("Worksheet Menu Bar").Reset
End Sub
</source>
Restore tool bar
<source lang="vb">
Sub RestoreToolbars()
Dim toolBarSheet As Worksheet Set toolBarSheet = Sheets("toolBarSheet") Application.ScreenUpdating = False On Error Resume Next For Each Cell In toolBarSheet.range("A:A") _ .SpecialCells(xlCellTypeConstants) CommandBars(Cell.value).Visible = True Next Cell Application.ScreenUpdating = True
End Sub
</source>
Save list of all predefined commands and their ID numbers in a file
<source lang="vb">
Sub IdList()
On Error Resume Next If Application.Version >= 10# Then Exit Sub Dim c As CommandBar, i Set c = CommandBars.Add Open ThisWorkbook.Path + "CommandBar.txt" For Output As #1 For i = 0 To 32 c.Controls.Add Id:=i If c.Controls(1).Caption <> "" And _ c.Controls(1).Caption <> "[Command not available]" And _ c.Controls(1).Caption <> "custom" Then Print #1, i, c.Controls(1).Caption End If c.Controls(1).Delete Next i c.Delete Close #1
End Sub
</source>
Set Control style, Action, group, faceid and caption
<source lang="vb">
Sub AddNewMB()
Dim myCommandBar As CommandBar, myCommandBarCtl As CommandBarControl Dim myCommandBarSubCtl As CommandBarControl On Error GoTo AddNewMB_Err Set myCommandBar = CommandBars.Add(Name:="Sample Menu Bar", Position:= _ msoBarTop, MenuBar:=True, Temporary:=False) myCommandBar.Visible = True myCommandBar.Protection = msoBarNoMove Set myCommandBarCtl = myCommandBar.Controls.Add(Type:=msoControlPopup) myCommandBarCtl.Caption = "Displa&y" Set myCommandBarSubCtl = myCommandBarCtl.Controls.Add(Type:=msoControlButton) With myCommandBarSubCtl .Style = msoButtonIconAndCaption .Caption = "S&le Menu Disable" .FaceId = 59 .OnAction = "=SampleMenuDisable()" .Parameter = 1 .BeginGroup = True End With
AddNewMB_Err:
msgBox "Error " & Err.number & vbCr & Err.Description Exit Sub
End Sub
Function SampleMenuDisable()
Application.rumandBars("Sample Menu Bar").Visible = False Application.rumandBars("Menu Bar").Visible = True
End Function
</source>
sets the FaceId property of the first button on the MyToolbar toolbar image to 45, which is the code number for a mailbox icon.
<source lang="vb">
Sub faceID()
CommandBars("MyToolbar").Controls(1).FaceId = 45
End Sub
</source>
Show All Toolbar Controls
<source lang="vb">
Sub ShowAllToolbarControls()
Cells.Clear Row = 1 For Each myCommandBar In CommandBars If myCommandBar.Type = msoBarTypeNormal Then Cells(Row, 1) = myCommandBar.Name For Each ctl In myCommandBar.Controls Cells(Row, 2) = ctl.Caption Row = Row + 1 Next ctl End If Next myCommandBar
End Sub
</source>
Show CommandBar Names
<source lang="vb">
Sub ShowCommandBarNames()
Cells.Clear Row = 1 For Each myCommandBar In CommandBars Cells(Row, 1) = myCommandBar.Index Cells(Row, 2) = myCommandBar.Name Select Case myCommandBar.Type Case msoBarTypeNormal Cells(Row, 3) = "Toolbar" Case msoBarTypeMenuBar Cells(Row, 3) = "Menu Bar" Case msoBarTypePopUp Cells(Row, 3) = "Shortcut" End Select Row = Row + 1 Next myCommandBar
End Sub
</source>
show/hide check symbol
<source lang="vb">
Sub MenuCommand2_OnAction()
With CommandBars.ActionControl If .State = msoButtonDown Then .State = msoButtonUp Else .State = msoButtonDown End If End With
End Sub
</source>
Shows or hides a command bar.
<source lang="vb">
Sub TestCommandBarUtilities()
ShowCommandBar "Borders", True
End Sub
Sub ShowCommandBar(sName As String, bShow As Boolean)
If CommandBarExists(sName) Then Application.rumandBars(sName).Visible = bShow End If
End Sub
</source>
simply copies the NumberFormat property of the ActiveCell to the Caption property of the button control.
<source lang="vb">
Sub UpdateToolbar()
On Error Resume Next CommandBars("Number Format").Controls(1).Caption = ActiveCell.NumberFormat If Err <> 0 Then CommandBars("Number Format").Controls(1).Caption = ""
End Sub
</source>
The custom toolbar is removed with this procedure
<source lang="vb">
Sub RemoveToolBar()
On Error Resume Next Application.rumandBars("ExcelVBADummies").Delete
End Sub
Sub Main()
Debug.Print FirstName()
End Sub
Function FirstName() Dim FullName As String Dim FirstSpace As Integer FullName = Application.userName FirstSpace = InStr(FullName, " ") If FirstSpace = 0 Then FirstName = FullName Else FirstName = Left(FullName, FirstSpace - 1) End If End Function </source>
The Protection constants are additive: apply different types of protection with a single command
<source lang="vb">
Sub commandBar()
Set cb = CommandBars("MyToolbar") cb.Protection = msoBarNoCustomize + msoBarNoMove
End Sub
</source>
The Protection property of a CommandBar object provides you with many options for protecting a CommandBar.
<source lang="vb">
Sub commdBar()
CommandBars("MyToolbar").Protection = msoBarNoCustomize
End Sub
</source>
This toolbar exists only when the cell pointer falls within a given range
<source lang="vb">
Sub CreateToolbar()
Dim myBar As commandBar Dim Button As CommandBarButton Set myBar = CommandBars.Add For i = 1 To 4 Set Button = myBar.Controls.Add(msoControlButton) With Button .OnAction = "Button" & i .FaceId = i + 37 End With Next i myBar.name = "myBar"
End Sub
</source>
To delete a control from a CommandBar object, use the Delete method of the Controls collection
<source lang="vb">
Sub delBar()
CommandBars("MyToolbar").Controls(1).Delete
End Sub
</source>
Translates a MsoBarPosition enumeration into a text description of the bar position.
<source lang="vb">
Sub Inventory()
Dim cb As commandBar For Each cb In Application.rumandBars Debug.Print TranslateCommandBarPosition(cb.Position) Next Set cb = Nothing
End Sub
Function TranslateCommandBarPosition(vType As MsoBarPosition) As String
Dim sPosition As String Select Case vType Case Is = MsoBarPosition.msoBarBottom sPosition = "Bottom" Case Is = MsoBarPosition.msoBarFloating sPosition = "Floating" Case Is = MsoBarPosition.msoBarLeft sPosition = "Left" Case Is = MsoBarPosition.msoBarMenuBar sPosition = "Menu Bar" Case Is = MsoBarPosition.msoBarPopup sPosition = "Popup" Case Is = MsoBarPosition.msoBarRight sPosition = "Right" Case Is = MsoBarPosition.msoBarTop sPosition = "Top" Case Else sPosition = "Unknown position" End Select TranslateCommandBarPosition = sPosition
End Function
</source>
Translates a MsoBarType enumeration into a text description of the bar type.
<source lang="vb">
Sub Inventory()
Dim cb As commandBar For Each cb In Application.rumandBars Debug.Print TranslateCommandBarType(cb.Type) Next Set cb = Nothing
End Sub
Function TranslateCommandBarType(vType As MsoBarType) As String
Dim sType As String Select Case vType Case Is = MsoBarType.msoBarTypeMenuBar sType = "Menu Bar" Case Is = MsoBarType.msoBarTypeNormal sType = "Normal" Case Is = MsoBarType.msoBarTypePopup sType = "Popup" Case Else sType = "Unknown type" End Select TranslateCommandBarType = sType
End Function
</source>
Translates a MsoControlType enumeration into a text description of the control type.
<source lang="vb">
Private Sub DisplayControlDetail()
Dim cb As CommandBar Dim cbc As CommandBarControl On Error Resume Next For Each cb In Application.rumandBars For Each cbc In cb.Controls Debug.Print cbc.Caption Debug.Print TranslateControlType(cbc.Type) Next Next Set cbc = Nothing
End Sub
Function TranslateControlType(vType As MsoControlType) As String
Dim sType As String Select Case vType Case Is = MsoControlType.msoControlActiveX sType = "ActiveX" Case Is = MsoControlType.msoControlAutoCompleteCombo sType = "Auto Complete Combo" Case Is = MsoControlType.msoControlButton sType = "Button" Case Is = MsoControlType.msoControlButtonDropdown sType = "Button Dropdown" Case Is = MsoControlType.msoControlButtonPopup sType = "Button Popup" Case Is = MsoControlType.msoControlComboBox sType = "Combo Box" Case Is = MsoControlType.msoControlCustom sType = "Custom" Case Is = MsoControlType.msoControlDropdown sType = "Dropdown" Case Is = MsoControlType.msoControlEdit sType = "Edit" Case Is = MsoControlType.msoControlExpandingGrid sType = "Expanding Grid" Case Is = MsoControlType.msoControlGauge sType = "Gauge" Case Is = MsoControlType.msoControlGenericDropdown sType = "Generic Dropdown" Case Is = MsoControlType.msoControlGraphicCombo sType = "Graphic Combo" Case Is = MsoControlType.msoControlGraphicDropdown sType = "Graphic Dropdown" Case Is = MsoControlType.msoControlGraphicPopup sType = "Graphic Popup" Case Is = MsoControlType.msoControlGrid sType = "Grid" Case Is = MsoControlType.msoControlLabel sType = "Label" Case Is = MsoControlType.msoControlLabelEx sType = "Label Ex" Case Is = MsoControlType.msoControlOCXDropdown sType = "OCX Dropdown" Case Is = MsoControlType.msoControlPane sType = "Pane" Case Is = MsoControlType.msoControlPopup sType = "Popup" Case Is = MsoControlType.msoControlSpinner sType = "Spinner" Case Is = MsoControlType.msoControlSplitButtonMRUPopup sType = "Split Button MRU Popup" Case Is = MsoControlType.msoControlSplitButtonPopup sType = "Split Button Popup" Case Is = MsoControlType.msoControlSplitDropdown sType = "Split Dropdown" Case Is = MsoControlType.msoControlSplitExpandingGrid sType = "Split Expanding Grid" Case Is = MsoControlType.msoControlWorkPane sType = "Work Pane" Case Else sType = "Unknown control type" End Select TranslateControlType = sType
End Function
</source>
<source lang="vb">
Sub ListShortCutMenus()
For Each myCommandBar In CommandBars If myCommandBar.Type = msoBarTypePopup Then Debug.Print myCommandBar.Index Debug.Print myCommandBar.name For col = 1 To myCommandBar.Controls.Count Debug.Print myCommandBar.Controls(col).Caption Next col End If Next myCommandBar
End Sub
</source>
Программное добавление кнопки в контекстное меню ячейки (строки, столбца) из кода VBA Excel. Свойство CommandBars объекта Application.
Свойство Application.CommandBars
Свойство CommandBars объекта Application возвращает коллекцию командных панелей Microsoft Excel.
Примеры командных панелей, вызываемых кликом правой кнопки мыши (контекстных меню):
- CommandBars(«Cell») – контекстное меню ячейки;
- CommandBars(«Row») – контекстное меню строки;
- CommandBars(«Column») – контекстное меню столбца.
Добавление кнопки из кода VBA Excel в контекстное меню ячейки. Кнопки в контекстные меню строк и столбцов добавляются аналогично.
‘Объявляем объектную переменную cmdBarBut Dim cmdBarBut As CommandBarButton ‘Создаем временную (Temporary:=True) кнопку для контекстного ‘меню ячейки и присваиваем ссылку на нее переменной cmdBarBut Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add(Temporary:=True) With cmdBarBut ‘Присваиваем кнопке название .Caption = «Новая кнопка» ‘Задаем отображение в контекстном меню только названия кнопки .Style = msoButtonCaption ‘Назначаем кнопке процедуру (макрос) .OnAction = «MySub» End With |
Если хотите создать постоянную кнопку для контекстного меню, используйте параметр Temporary
метода Controls.Add
в значении False
, которое применяется по умолчанию:
Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add |
Созданная предыдущим кодом VBA временная кнопка контекстного меню ячейки будет утилизирована только при закрытии приложения Microsoft Excel. Это означает, что если в приложении открыты несколько книг, тогда после закрытия книги с кодом, создавшим кнопку, она продолжит существование и будет доступна из других открытых книг. Если это не желательно, можно удалить кнопку следующей строкой:
Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete |
Эта же строка удалит и постоянную кнопку.
Примеры добавления и удаления кнопок
Пример 1
Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии книги и удаление кнопки при закрытии книги.
Добавление кнопки (код размещается в модуле книги):
Private Sub Workbook_Activate() Dim cmdBarBut As CommandBarButton On Error Resume Next Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add(Temporary:=True) With cmdBarBut .Caption = «Новая кнопка» .Style = msoButtonCaption .OnAction = «MySub» End With On Error GoTo 0 End Sub |
Удаление кнопки (код размещается в модуле книги):
Private Sub Workbook_Deactivate() On Error Resume Next Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete On Error GoTo 0 End Sub |
Вызываемая процедура (код размещается в стандартном модуле):
Sub MySub() MsgBox «Кнопка работает!» End Sub |
Пример 2
Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии контекстного меню и удаление кнопки при завершении вызываемой процедуры.
Добавление кнопки (код размещается в модуле книги):
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Dim cmdBarBut As CommandBarButton On Error Resume Next With Application ‘Удаляем ранее созданную кнопку, если она не была ‘нажата и не была удалена назначенным ей макросом .CommandBars(«Cell»).Controls(«Новая кнопка»).Delete Set cmdBarBut = .CommandBars(«Cell»).Controls.Add(Temporary:=True) End With With cmdBarBut .Caption = «Новая кнопка» .Style = msoButtonCaption .OnAction = «MySub» End With On Error GoTo 0 End Sub |
Удаление кнопки при закрытии книги, если она при вызове контекстного меню не была нажата и не была удалена назначенным ей макросом (код размещается в модуле книги):
Private Sub Workbook_Deactivate() On Error Resume Next Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete On Error GoTo 0 End Sub |
Вызываемая процедура с кодом удаления вызвавшей ее кнопки из контекстного меню (код размещается в стандартном модуле):
Sub MySub() MsgBox «Кнопка работает!» On Error Resume Next Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete On Error GoTo 0 End Sub |
Содержание
- Панели инструментов Работа с панелями инструментов и меню в VBA
- 8. Работа с панелями инструментов и меню
- Объект CommandBar (Office)
- Пример
- См. также
- Поддержка и обратная связь
Панели инструментов Работа с панелями инструментов и меню в VBA
8. Работа с панелями инструментов и меню
Работа с панелями инструментов и меню в VBA, объекты CommandBar, CommandBarControl, CommandBarPopup, контекстные меню
Очень часто в приложении VBA вам потребуются свои наборы меню и панелей инструментов вместо стандартных, предусмотренных приложением. Работу с меню и панелями инструментов обеспечивает коллекция CommandBars, которая находится в объекте Application (об этом важном объекте мы будем говорить в следующих модулях). Коллекция CommandBars содержит, как ясно из названия, набор объектов CommandBar(панели инструментов и меню), каждый из них, в свою очередь — коллекцию CommandBarControls (набор элементов из которых состоит панель/меню), а эта коллекция представляет из себя хранилище элементов, из которых и состоит меню. Таких элементов может быть три:
- CommandBarButton — кнопка или элемент меню, который используется для выполнения программы или подпрограммы;
- CommandBarComboBox — сложный элемент меню/панели управления (поле ввода, раскрывающийся список, поле со списком);
- CommandBarPopup — меню или вложенное меню.
Пример создания собственной панели инструментов может выглядеть очень просто:
Dim CBar1 As CommandBar
Set CBar1 = CommandBars.Add(«Документы», msoBarTop)
У нас появилась новая панель инструментов Документы (см. рис. 8.1), которое можно, к примеру, убрать через меню Настройка -> Панели инструментов, однако пока она совершенно бесполезна: в нем нет ни одной кнопки. Для того, чтобы они появились, необходимо добавить новый элемент типа CommandBarControl (одного из трех типов, перечисленных выше) в коллекцию CommandBarControls для этого меню.
Рис. 8.1 В центре рисунка — пустая панель инструментов Документы
Но вначале — про некоторые важные свойства и методы объекта CommandBar:
- BuiltIn — это свойство определяет, является ли данная панель/меню встроенной для этого приложения (то есть предусмотренной в нем разработчиками приложения Office). Менять значение этого свойства нельзя. Это свойство очень удобно использовать, чтобы убрать все стандартные меню, или, наоборот, убрать все свои меню, оставив только стандартные;
- Context — определяет, где именно находится программный код для вашего меню (в Normal.dot, файле документа и т.п.). Можно использовать для проверок в случае потенциальной возможности вызова разных меню с одинаковыми именами;
- Controls — через это свойство можно получить коллекцию элементов управления CommandBarControls, которая нам, скорее всего, потребуется;
- Enabled — «включение/отключение» панели;
- Height, Left, Top и W idth — очевидные свойства, относящиеся к расположению панели в окне приложения;
- Index, Name и NameLocal — эти свойства позволяют найти нужную нам панель в коллекции CommandBars. Name — это программное имя объекта, NameLocal — имя, которое будет видно пользователю, Index — это просто номер данной панели;
- Protection — позволяет запретить пользователю убирать старые кнопки из этой панели или размещать на ней новые;
- Type — наверное, самое важное свойство. Определяет, чем будет данная панель/меню (панелью инструментов, обычным меню или контекстным меню, доступным по щелчку правой кнопкой мыши). Однако это свойство доступно только для чтения. Тип объекта CommandBar определяется при выполнении метода Add() коллекции CommandBars, при этом определяется очень хитро — через второй параметр этого метода. В нашем случае вызов этого метода выглядит как
Set CBar1 = CommandBars.Add(«Документы», msoBarTop, True, False)
Первый параметр ( «Документы») — это, конечно, имя объекта (название панели). Второй параметр ( msoBarTop) — либо положение пристыкованной панели ( msoBarTop, msoBarBottom, msoBarLeft, msoBarRight), либо знак того, что панель непристыкована ( msoBarFloating), либо вообще указание на то, что это — контекстное меню, которое до щелчка правой кнопкой мыши не видна ( msoBarPopup). Свойство Visible для контекстного меню неприменимо.
Как будет выглядеть в итоге панель — как меню или панель инструментов, зависит от того, какие элементы вы туда поместите.
После того, как создание панели завершено, необходимо разместить в нем элементы. Например, создание панели инструментов может выглядеть так:
Dim But1 As CommandBarControl
Set But1 = CBar1.Controls.Add(msoControlButton)
But1.Caption = «Кнопка 1»
Вроде бы ничего не произошло — перед нами та же пустая панель. Однако, если навести указатель мыши на начало панели, в нем можно увидеть пустую кнопку, которая называется «Кнопка 1» (см. рис. 8.2).
Рис. 8.2 На панели инструментов Документы появлилась почти невидимая Кнопка 1
Как видно из кода, мы использовали для создания элемента управления (кнопки в панели инструментов) метод Add() коллекции Controls объекта CommandBar (у нас он называется CBar1). Свойства и методы у этой коллекции стандартные, как у множества других коллекций:
- свойство Application возвращает ссылку на объект приложения (Word, Excel и т.п.)
- свойство Count позволяет узнать, сколько всего элементов управления помещено в эту коллекцию;
- свойство Item позволяет по индексу (номеру) получить ссылку на объект элемента управления CommandBarControl в этой коллекции;
- метод Add() (которым мы и воспользовались) позволяет добавить элемент управления в эту коллекцию (удаление элемента управления производится уже при помощи метода Delete() самого элемента управления).
Чуть подробнее о методе Add(). Этот метод принимает пять необязательных параметров из которых два первых параметра — очень важны. Первый параметр — Type, он определяет тип передаваемого в коллекцию элемента управления. Таких типов — пять: msoControlButton (кнопка — то есть в итоге получится панель инструментов), msoControlEdit (будет создано поле для ввода текста), msoControlDropdown (ниспадающий список), msoControlComboBox (комбинированный список), or msoControlPopup (пункт меню), например, чтобы наша кнопка превратилась в начальный пункт ниспадающего меню (см. рис. 8.3), в нашем коде можно изменить один этот параметр:
Dim But1 As CommandBarControl
Set But1 = CBar1.Controls.Add(msoControlPopup)
But1.Caption = «Меню 1»
Рис. 8.3 На созданной нами панели инструментов появился пункт меню
Второй важный параметр метода Add() — параметр ID. Этот параметр позволяет привязать элемент управления к уже имеющемуся в системе встроенному элементу управления. Например, чтобы добавить кнопку печати, этот параметр должен быть равен 4, а чтобы добавить кнопку предпросмотра документа, этот параметр должен быть равен 5. Если оставить этот параметр пустым, или указать для него значение 1, то будет создан пользовательский элемент управления, не привязанный ни к каким встроенным.
Остальные параметры этого метода относятся к созданию идентификатора элемента управления, его положению относительно других элементов управления и должен ли он быть постоянным или временным.
Конечно, работа с панелью управления/меню на этом не завершена. Нам потребуется еще донастроить свойства элементов управления. Например, для кнопки из первого примера нам, как минимум, нужно еще определить изображение, которое будет на кнопке, и процедуру, которая при нажатии на нее будет называться. Для объекта CommandBarButton важнейшие свойства, методы и события приводятся ниже:
- Caption — надпись на элементе управления. Для кнопки выводится в виде всплывающей подсказки, а для пункта меню это — название пункта.
- Enabled — включен или отключен данный элемент управления. Обычно используется для предупреждения ошибок пользователя.
- FaceId (только для кнопок) — возможность воспользоваться системной картинкой для кнопки (не назначая ей соответствующую функцию). Например, значение 4 присвоит кнопке изображение принтера. В Word и Excel встроено несколько тысяч иконок, и поэтому вместо создания иконки, всегда есть возможность подобрать готовую.
- Id — идентификатор встроенной функции, назначенной этой кнопке. Если вы назначили этой кнопке пользовательскую процедуру, то значение Id будет всегда равно 1.
- Index — номер элемента управления в коллекции Controls. Используется для выполнения всяких служебных операций с элементами управления.
- Mask — возможность наложить на рисунок объекта маску для показа только части рисунка. Маска выглядит как отдельный рисунок, прозрачные части которого должны быть белыми, а непрозрачные — черными.
- OnAction — самое важное свойство элемента управления. Его значение используется, когда активизируется элемент управления (щелчок по кнопке или пункту меню, завершение ввода текста в текстовом поле, выбор нового значения в списке). Предназначено для указания запускаемой процедуры или внешнего приложения (COM Add In). Пример: But1.OnAction = «MySub».
- Parameter — это свойство можно использовать для передачи параметров вызываемой подпроцедуре или просто для хранения своих данных. Работает с типом данных String.
- Picture — это свойство позволяет назначить рисунок (иконку) кнопке панели инструментов. Чаще используется не оно, а свойство FaceId (выше). Если есть необходимость, то необходимые иконки можно подобрать из большой коллекции, которая есть в Visual Studio, или воспользоваться одним из свободно доступных генераторов иконок.
- ShortcutText — текст с описанием клавиатурного сочетания, назначенного этой кнопке или пункту меню.
- State — вид кнопки — обычная, утопленная или обведенная рамкой.
- Style — еще одно свойство, влияющее на внешний вид. Позволяет определить, как будет выглядеть кнопка: будет показана только иконка, только надпись или и то, и другое вместе в разных вариантах.
- ToolTip — определяет текст всплывающей подсказки. По умолчанию «всплывает» значение свойства Caption.
- Type — возвращает тип элемента управления (использоваться для изменения типа не может!)
- Visible — будет или не будет этот элемент управления видимым.
- метод Delete() — позволяет удалить кнопку из коллекции кнопок;
- метод Execute() — запускает на выполнение то, что определено при помощи свойства OnAction;
- Reset() — вернуться к исходным параметрам кнопки после внесенных изменений;
У этого объекта есть единственное событие — Click. Оно также позволяет определить реакцию на нажатие кнопки, но работать с ним сложнее, чем со свойством OnAction.
В принципе, для работы с панелями инструментов этого вполне достаточно. Однако меню — ниспадающие и контекстные — устроены несколько сложнее. В ниспадающем меню вам потребуется еще определить вложения элементов, а в контекстном меню — еще и привязать это меню к какому-то объекту.
Для работы с вложенными меню используется точно та же коллекция Controls, которой мы уже пользовались. Единственное отличие — эта коллекция Controls принадлежит не объекту CommandBar, а объекту CommandBarPopup — то есть другому меню! В нашем примере вложение будет выглядеть так:
‘Создаем стандартный объект CommandBar
Dim CBar1 As CommandBar
Set CBar1 = CommandBars.Add(«Документы», msoBarTop)
Dim Menu1 As CommandBarPopup
Dim SubMenu1 As CommandBarPopup
Dim SubMenu1Item As CommandBarButton
Set Menu1 = CBar1.Controls.Add(msoControlPopup) ‘ Создаем верхнее меню
Menu1.Caption = » Меню 1″
Set SubMenu1 = Menu1.Controls.Add(msoControlPopup) ‘ Создаем вложенное меню
SubMenu1.Caption = «Подменю 1»
‘Создаем элемент во вложенном подменю и назначаем ему процедуру Proc1
Set SubMenu1Item = SubMenu1.Controls.Add(msoControlButton)
SubMenu1Item.Caption = «Элемент подменю»
То, что получилось, можно посмотреть на рис. 8.4.
Рис. 8.4 Наше меню приобретает законченные очертания
Конечно, можно добавлять элементы не только в свои меню, но и во встроенные. Добавление происходит точно так же, а найти нужное встроенное меню можно при помощи цикла For Each и проверки значения свойства Name.
Контекстные меню (в справке VBA — shortcut menus) — это меню, которые открываются по щелчку правой кнопкой мыши. С ними работа выглядит так:
Set CBar1 = CommandBars.Add («Мое контекстное меню», msoBarPopup , , True )
Set MenuItem1 = CBar1.Controls.Add
MenuItem1.Caption = «Элемент меню 1»
Set MenuItem2 = CBar1.Controls.Add
MenuItem2.Caption = «Элемент меню 2»
Как мы видим, все очень просто и стандартно. Однако если просто выполним этот код, то никакого контекстного меню не появится: необходимо еще добавить вызов метода ShowPopup():
Тогда контекстное меню возникнет в том месте, где сейчас находится указатель мыши (можно передать этому методу координаты места появления).
Конечно, этот метод нужно положить в обработчик события, связанного с правой кнопкой мыши, а его как раз и нет для многих объектов. Например, в Excel для листа есть событие BeforeRightClick, а для документа Word такого события нет. Но и в этом случае у нас останется возможность добавить свои пункты в стандартное контекстное меню.
Источник
Объект CommandBar (Office)
Представляет панель команд в приложении контейнера. Объект CommandBar является членом коллекции CommandBars .
Использование CommandBars в некоторых приложениях Microsoft Office было заменено новым компонентом ленты пользовательского интерфейса Microsoft Office Fluent. Дополнительные сведения см. в статье Обзор ленты Office Fluent.
Пример
Используйте CommandBars (index), где index — это имя или номер индекса панели команд, чтобы вернуть один объект CommandBar . В следующем примере показано, как пройти коллекцию панели команд, чтобы найти панель команд с именем Forms. Если он находит эту панель команд, пример делает ее видимой и защищает состояние закрепления. В этом примере переменная cb представляет объект CommandBar .
Используйте имя или номер индекса, чтобы указать строку меню или панель инструментов в списке доступных строк меню и панелей инструментов в приложении контейнера. Однако необходимо использовать имя, чтобы указать меню, контекстное меню или подменю (все из которых представлены объектами CommandBar ). В этом примере в нижней части меню Сервис добавляется новый элемент меню. При выборе нового пункта меню запускается процедура с именем «qtrReport».
Если два или более пользовательских меню или подменю имеют одинаковые имена, CommandBars(index) возвращает первое. Чтобы убедиться, что вы возвращаете правильное меню или подменю, найдите всплывающее меню, отображающее это меню. Затем примените свойство CommandBar к всплывающему элементу управления, чтобы вернуть панель команд, представляющую это меню. Если третий элемент управления на панели инструментов с именем Пользовательские инструменты является всплывающим элементом управления, в этом примере команда Сохранить добавляется в нижнюю часть этого меню.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
In This Chapter
Using toolbars in Excel
► Customizing toolbars in different ways Creating different images on toolbar buttons
► Manipulating toolbars with VBA
Excel is definitely not a toolbar-challenged product. It comes with dozens of built-in toolbars, and constructing new toolbars is very easy. This chapter shows you how to manipulate toolbars with VBA.
Introducing CommandBars
When programming in Excel, a toolbar is technically known as a CommandBar object. In fact, a toolbar is just one of the three types of CommandBar objects:
Toolbar. A floating bar with one or more clickable controls. This chapter focuses on this type of CommandBar.
Menu bar. The two built-in menu bars are the Worksheet menu bar and the Chart menu bar. See Chapter 20.
Shortcut menu. These menus pop up when you right-click an object. See Chapter 20.
Customizing Toolbars
The following list summarizes the ways you can customize toolbars. (I discuss these topics in detail later in this chapter.)
Remove toolbar controls from built-in toolbars. You can get rid of toolbar controls that you never use, reduce screen clutter, and free up a few pixels of screen space, to boot.
Add toolbar controls to built-in toolbars. You can add as many toolbar controls as you want to any toolbar. The controls can be custom buttons or buttons copied from other toolbars, or they can come from the stock of toolbar controls that Excel provides for you. And, of course, you can attach your VBA macros to these buttons.
Create new toolbars. You can create as many new toolbars as you like, with toolbar buttons (or other types of controls) from any source.
Change the functionality of built-in toolbar controls. You do this by attaching your own macro to a built-in toolbar button.
Change the image that appears on any toolbar button. Excel includes a rudimentary but functional toolbar button editor. You can also change a toolbar’s image by using several other techniques.
Don’t be afraid to experiment with toolbars. If you mess up a built-in toolbar, you can easily reset it to its default state:
1. Choose View Toolbars Customize.
2. Select the toolbar in the list.
3. Click the Reset button.
How Excel handles toolbars
When you start Excel, it displays the same toolbar configuration that was in effect the last time you used the program. Did you ever wonder how Excel keeps track of this information?
When you exit Excel, it updates a file called EXCEL11.XLB. The exact location (and even the name) of this file varies, but you can use Windows’ Find File feature to locate the file. (Search for *.XLB.) This file stores all of your custom toolbars, as well as information about the on-screen location of each toolbar and which toolbars are visible.
If you need to restore the toolbars to their previous configuration, choose FileOOpen and open your XLB file. This restores your toolbar configuration to the way it was when you started the current session of Excel. You also can make a copy of the XLB file and give it a different name. Doing so lets you store multiple toolbar configurations that you can load any time. And if you’ve made lots of toolbar changes and want to return to Excel’s original toolbar state, just delete your XLB file and restart Excel. It creates a new one for you.
Working with Toolbars
As you probably know, you can display as many toolbars as you like. A toolbar can be either docked or floating. A docked toolbar is fixed in place at the top, bottom, left, or right edge of Excel’s workspace. Floating toolbars appear in an always-on-top window, which means that they are never obscured by other windows. You can change the dimensions of a floating toolbar by dragging a border.
As shown in Figure 19-1, right-clicking any toolbar or toolbar button displays a shortcut menu that lets you hide or display a toolbar. This shortcut menu, however, does not display the names of all toolbars. For a complete list of toolbars, use the Customize dialog box. This dialog box lets you hide or display toolbars (among other things).
Figure 19-1:
Right-clicking a toolbar or a toolbar button displays this shortcut menu.
You can access the Customize dialog box in two ways:
Choose View Toolbars Customize.
Right-click a toolbar and choose Customize from the shortcut menu.
The Toolbars tab
The Customize dialog box’s Toolbars tab, shown in Figure 19-2, lists all the available toolbars, including toolbars you have created. This dialog box also lists the two menu bars (Worksheet and Chart), which are similar to toolbars.
Figure 19-2:
The Toolbars tab is in the Customize dialog box.
This section describes how to perform various procedures that involve toolbars.
Hiding or displaying a toolbar: The Toolbars tab displays every toolbar (built-in toolbars and custom toolbars). Add a check mark to display a toolbar; remove the check mark to hide it. The changes take effect immediately.
Creating a new toolbar: Click the New button and enter a name in the New Toolbar dialog box. Excel creates and displays an empty toolbar. You can then add buttons (or menu commands) to the new toolbar. See “Adding and Removing Toolbar Controls” later in this chapter.
Figure 19-3 shows a custom toolbar that I created. This toolbar, called Custom Formatting, contains the formatting tools that I use most frequently. Notice that this toolbar includes drop-down menus as well as standard toolbar buttons.
Renaming a custom toolbar: Select the custom toolbar from the list and click the Rename button. In the Rename Toolbar dialog box, enter a new name. You can’t rename a built-in toolbar.
Deleting a custom toolbar: Select the custom toolbar from the list and click the Delete button. You can’t delete a built-in toolbar.
Deleting a toolbar is one of the few actions in Excel that cannot be undone.
Figure 19-3:
A custom toolbar.
Resetting a built-in toolbar: Select a built-in toolbar from the list and click the Reset button. The toolbar is restored to its default state. Any added custom tools are removed. Any removed default tools are restored. The Reset button is not available when a custom toolbar is selected.
Attaching a toolbar to a workbook: You can share a custom toolbar by attaching it to a workbook. Click the Attach button and you get a new dialog box that lets you select toolbars to attach to a workbook. You can attach any number of toolbars to a workbook — but remember, attaching toolbars increases the size of your workbook. For more about this, see “Distributing Toolbars,” later in this chapter.
Toolbar autosensing
Normally, Excel displays a particular toolbar automatically when you change contexts. This is called autosensing. For example, when you activate a chart, the Chart toolbar appears. When you activate a sheet that contains a pivot table, the PivotTable toolbar appears.
You can easily defeat autosensing by hiding the toolbar: Click its Close button. After you do so, Excel no longer displays that toolbar when you
switch to its former context. You can restore this automatic behavior by displaying the appropriate toolbar when you’re in the appropriate context. Thereafter, Excel reverts to its normal automatic toolbar display when you switch to that context.
You can simulate this type of behavior by writing VBA code. Refer to “Displaying a toolbar when a worksheet is activated,” later in this chapter.
The Commands tab
The Commands tab of the Customize dialog box contains a list of every available tool. Use this tab when you customize a toolbar. This feature is described later in this chapter in “Adding and Removing Toolbar Controls.”
The Options tab
Figure 19-4 shows the Options tab of the Customize dialog box. The options on this tab control how both menus and toolbars behave. The options that affect toolbars are as follows:
Figure 19-4:
The Options tab of the Customize dialog box.
Using one row for two toolbars: You can save a little bit of valuable screen space by removing the checkmark from the Show Standard and Formatting Toolbars on Two Rows check box to force Excel to stuff both toolbars on a single row. Go ahead with this if you’re running your system at a high screen resolution; you can get more on the screen horizontally. However, you may not want to choose this option if you’re running in a lower screen resolution.
Showing full menus: Perhaps one of Microsoft’s dumbest ideas is adaptive menus. In other words, the software hides menu items that are not used frequently. I’ve never met anyone who likes this. If you find that your menus seem to be missing some commands, select the Always Show Full Menus check box.
Changing the icon size: To change the size of the icons used in toolbars, select or deselect the Large Icons check box. This option affects only the images in buttons. Buttons that contain only text (such as buttons in a menu) are not changed.
Display fancy font names: Some people like the feature for which the drop-down Font list on the Formatting toolbar shows names using the actual font; others despise it. The List Font Names In Their Font check box controls whether Excel does this. Personally, I think using the fonts slows down Excel if you’re working with a lot of fonts.
Toggling the ScreenTips display: ScreenTips are the pop-up messages that display the button names when you pause the mouse pointer over a button. If you find the ScreenTips distracting, deselect the Show ScreenTips on Toolbars check box.
Changing the menu animations: When you select a menu, Excel animates its menu display. Choose whichever animation style you prefer.
Adding and Removing Toolbar Controls
When the Customize dialog box is displayed, Excel is in a special customization mode. You have access to all the commands and options in the Customize dialog box. In addition, you can perform the following actions:
Reposition a control on a toolbar
Move a control to a different toolbar
Copy a control from one toolbar to another
Add new controls to a toolbar using the Commands tab of the Customize dialog box
Change lots of toolbar control attributes
Moving and copying controls
When the Customize dialog box is displayed, you can copy and move toolbar controls freely among any visible toolbars. To move a control, drag it to its new location. The new location can be within the current toolbar or on a different toolbar.
To copy a control, press Ctrl while dragging the control to another toolbar. You can copy a toolbar control within the same toolbar, but you’ve no reason to have multiple copies of a button on the same toolbar.
Inserting a new control
To add a new control to a toolbar, use the Customize dialog box’s Commands tab shown in Figure 19-5.
Figure 19-5:
The Commands tab contains a list of every available control.
The controls are arranged in 17 categories. When you select a category, the controls in that category appear to the right. Previous versions of Excel had a Description button that, when clicked, described the selected control’s function. For reasons known only to Microsoft, that Description button was removed in Excel 2003.
To add a control to a toolbar, locate it in the Commands tab, click it, and drag it to the toolbar.
Using other toolbar button operations
When Excel is in customization mode (that is, when the Customize dialog box is displayed), you can right-click a toolbar control to display a shortcut menu of additional actions. Figure 19-6 shows the shortcut menu that appears when you right-click a button in customization mode.
These commands are described in the following list. (Note that some of these commands are unavailable for certain toolbar controls.)
Reset: Resets the control to its original state.
Delete: Deletes the control.
Name: Lets you change the control’s name.
Copy Button Image: Copies the control’s image and places it on the Clipboard.
Paste Button Image: Pastes the image from the Clipboard to the control.
Reset Button Image: Restores the control’s original image.
Edit Button Image: Lets you edit the control’s image using the Excel button editor.
Change Button Image: Lets you change the image by selecting from a list of different button images.
Default Style: Displays the control using its default style. (For buttons, the default is image only. For menu items, the default is both image and text.)
Text Only (Always): Always displays text (no image) for the control.
Text Only (In Menus): Displays text (no image) if the control is in a menu bar.
Image and Text: Displays the control’s image and text.
Begin a Group: Inserts a divider in the toolbar. In a drop-down menu, a separator bar appears as a horizontal line between commands. In a toolbar, a separator bar appears as a vertical line.
Assign a Hyperlink: Lets you assign a hyperlink that activates when the control is clicked.
Assign a Macro: Lets you assign a macro that executes when the control is clicked.
Figure 19-6:
In customization mode, right-clicking a toolbar control displays this shortcut menu.
Distributing Toolbars
If you want to distribute a custom toolbar to other users, store it in a workbook. To store a toolbar in a workbook file, follow these steps:
1. Create the custom toolbar and test it to make sure it works correctly.
2. Activate the workbook that will store the new toolbar.
3. Choose View Toolbars Customize.
4. In the Customize dialog box, click the Toolbars tab.
5. Click the Attach button.
Excel displays the Attach Toolbars dialog box shown in Figure 19-7. This dialog box lists all custom toolbars stored on your system.
6. To attach a toolbar, select it and click the Copy button.
When a toolbar in the Toolbars in Workbook list (right side of the dialog box) is selected, the Copy button changes to a Delete button. You can click the Delete button to remove the selected toolbar from the workbook.
Figure 19-7:
The Attach Toolbars dialog box lets you attach one or more toolbars to a workbook.
A toolbar that’s attached to a workbook appears automatically when the workbook is opened, and that toolbar is then saved in the user’s XLB file when Excel closes down. If the user’s workspace already has a toolbar by the same name, however, the toolbar attached to the workbook does not replace the existing one.
The toolbar that’s stored in the workbook is an exact copy of the toolbar at the time you attach it. If you modify the toolbar after attaching it, the changed version is not stored in the workbook automatically. You must manually remove the old toolbar and then attach the new one.
Using VBA to Manipulate Toolbars
As you may expect, you can write VBA code to do things with toolbars. In this section, I provide some background information that you simply must know before you start mucking around with toolbars.
Commanding the CommandBars collection
You manipulate Excel toolbars (and menus, for that matter) by using objects located in the CommandBars collection. The CommandBars collection consists of
All Excel built-in toolbars
Any other custom toolbars that you create
A built-in menu bar named Worksheet menu bar, which appears when a worksheet is active
A built-in menu bar named Chart menu bar, which appears when a chart sheet is active
Any other custom menu bars that you create All built-in shortcut menus
As I mention at the beginning of this chapter, the three types of CommandBar are differentiated by their Type properties. The Type property can be any of these three values:
msoBarTypeNormal: A toolbar (Type = 0) msoBarTypeMenuBar: A menu bar (Type = 1) msoBarTypePopUp: A shortcut menu (Type = 2)
Listing all CommandBar objects
If you’re curious about the objects in the CommandBars collection, enter and execute the following macro. The result is a list of all CommandBar objects in the CommandBars collection, plus any custom menu bars or toolbars. For each CommandBar, the procedure lists its Index, Name, and Type. (The Type can be 0, 1, or 2).
Figure 19-8 shows a portion of the result of running this procedure, which is available at this topic’s Web site. As you can see, Excel has a lot of CommandBars.
Figure 19-8:
A VBA macro produced this list of all CommandBar objects.
Referring to CommandBars
You can refer to a particular CommandBar by its Index or by its Name. For example, the Standard toolbar has an Index of 3, so you can refer to the toolbar one of two ways:
or
For some reason, Microsoft isn’t consistent with CommandBar index numbers across versions of Excel. Therefore, it’s better to refer to a CommandBar by its Name, rather than by its Index.
Referring to controls in a CommandBar
A CommandBar object contains Control objects, which are buttons, menus, or menu items. The following procedure displays the Caption property for the first Control in the Standard toolbar:
When you execute this procedure, you see the message box shown in Figure 19-9.
Figure 19-9:
Displaying the Caption property for a control.
In some cases, these Control objects can contain other Control objects. For example, the first control on the Drawing toolbar contains other controls. (This also demonstrates that you can include menu items on a toolbar.) The concept of Controls within Controls becomes clearer in Chapter 20, when I discuss menus.
Properties of CommandBar controls
CommandBar controls have a number of properties that determine how the controls look and work. This list contains some of the more useful properties for CommandBar controls:
Caption: The text displayed for the control. If the control shows only an image, the Caption appears when you move the mouse over the control.
FaceID: A number that represents a graphics image displayed next to the control’s text.
BeginGroup: True if a separator bar appears before the control.
OnAction: The name of a VBA macro that executes when the user clicks the control.
BuiltIn: True if the control is an Excel built-in control. Enabled: True if the control can be clicked.
ToolTipText: Text that appears when the user moves the mouse pointer over the control.
When you work with toolbars, you can turn on the macro recorder to see what’s happening in terms of VBA code. Unless you’re editing button images, the steps you take while customizing toolbars generate VBA code. By examining this code, you can discover how Excel arranges the object model for toolbars. The model is pretty simple.
VBA Examples
This section contains a few examples of using VBA to manipulate the Excel toolbars. These examples give you an idea of the types of things you can do, and they can all be modified to suit your needs.
Resetting all built-in toolbars
The following procedure resets all built-in toolbars to their original state:
Using the Reset method on a custom toolbar has no effect (and does not generate an error).
Be careful with the preceding routine. Executing it erases all of your customizations to all built-in toolbars. The toolbars will be just as they were when you first installed Excel.
Displaying a toolbar when a worksheet is activated
Assume that you have a workbook (named Budget) that holds your budget information. In addition, assume that you’ve developed a custom toolbar (named Budget Tools) that you use with this workbook. The toolbar should be visible when you work on the Budget sheet; otherwise, it should remain hidden and out of the way.
The following procedures, which are stored in the code window for the This Workbook object, display the Budget Tools toolbar when the Budget workbook is active and hide the toolbar when the Budget workbook is deactivated:
For this example go to this topic’s Web site. For more information about using automatic procedures, go to Chapter 11.
Ensuring that an attached toolbar is displayed
As I explained earlier in this chapter, you can attach any number of toolbars to a workbook. But I also noted that the attached toolbar won’t replace an existing toolbar that has the same name.
In some cases, the failure to display a toolbar can present a problem. For example, assume that you distribute a workbook to your coworkers, and this workbook has an attached toolbar that executes your macros. Later, you update the workbook and add some new controls to your attached toolbar. When you distribute this new workbook, the updated toolbar doesn’t display because the old toolbar already exists!
One solution is to simply use a new toolbar name for the updated application. Perhaps a better solution is to write VBA code to delete the toolbar when the workbook closes. That way, the toolbar isn’t stored on the user’s system and you’re assured that the latest copy of your toolbar is always displayed when the workbook opens.
The following procedure, which is stored in the code window for the This Workbook object, displays the toolbar named Budget Tools when the workbook is opened. The Budget Tools toolbar is attached to the workbook.
The next procedure, which is also stored in the code window for the This Workbook object, deletes the toolbar named Budget Tools when the workbook is closed:
Notice that I use an On Error Resume Next statement to avoid the error message that appears if the toolbar has already been deleted.
Hiding and restoring toolbars
In some cases, you may want to remove all the toolbars when a workbook is opened. It’s only polite, however, to restore the toolbars when your application closes. In this section I present two procedures, both stored in the code window of the This Workbook object.
The Workbook_Open procedure, available at this topic’s Web site, is executed when the workbook is opened. This procedure saves the names of all visible toolbars in column A of Sheet1 and then hides all the toolbars:
The following procedure is executed before the workbook is closed. This routine loops through the toolbar names stored on Sheet1 and changes their Visible property to True:
Notice that the Workbook_Open routine saves the toolbar names in a worksheet range rather than in an array, ensuring that the toolbar names are still available when the Workbook_BeforeClose routine is executed. Values stored in an array may be lost between the time the Workbook_Open procedure is executed and the Workbook_BeforeClose procedure is executed.