Adding toolbar controls through VBA

  • Thread starter Thread starter Roderick O'Regan
  • Start date Start date
R

Roderick O'Regan

I'm grateful to the helpful MVPs who earlier told me about Add-ins. That's
now sorted. Thanks.

I now want to create toolbars which are built at run-time. I can do this
with ordinary buttons and attaching a macro action to it. However, I've got
about ten items that I want to group under one list (I actually want to end
up with 4 lists) such as one sees on a menu bar. I have tried using the
'msoControlPopup' as well as 'msoControlDropDown' commands in toolbars but I
get errors. I only seem to be able to add single buttons (msoControlButton).

Can one have a second menu bar showing in addition to the main one? If this
is the case then I could use the Popup commands on the new menu bar.

Regards

Roderick O'Regan
 
Roderick,

This sample creates a custom toolbar with menu items (with sub menu's
within) amd a dropdown box with choices, code sample also includes the event
handling for the items.

Run CreateToolbarExample - this will create the toolbar with menu items
MenuEvents - is the event handling macro which handles all events
RemoveMenu - Deletes the custom toolbar

' ----- Beginning Of Code -----
Option Explicit
Sub CreatePopupToolbarExample()
Dim CustomToolBar As CommandBar
Dim MainCustomBar As CommandBarPopup
Dim SubMenuItem As CommandBarButton
Dim SubMenuPopUp As CommandBarPopup
Dim SubMenuPopUpItem As CommandBarButton
Dim DropDownList As CommandBarControl

Dim strToolBar As String
Dim iCount As Integer

' Replace "My Toolbar" with a name
' you want to use for your toolbar.
strToolBar = "My Toolbar"

' Create and display the Toolbar.
Set CustomToolBar = CommandBars.Add(Name:=strToolBar, _
Position:=msoBarFloating)
CustomToolBar.Visible = True

' Create Main PopUp Menu on Toolbar.
Set MainCustomBar = CustomToolBar.Controls.Add(Type:=msoControlPopup)
MainCustomBar.Caption = "Main Menu"
' Create Dropdown list on toolbar
Set DropDownList = CustomToolBar.Controls.Add(Type:=msoControlDropdown)


' Add a Menu Button and a Popup
With MainCustomBar.Controls
Set SubMenuItem = .Add(Type:=msoControlButton)
Set SubMenuPopUp = .Add(Type:=msoControlPopup)
End With

' Set properties for the sub button and popup menus.
With SubMenuItem
.Caption = "Sub Menu Item"
.Style = msoButtonCaption
.OnAction = "MenuEvents" ' <- Macro to run when clicked.
End With

With SubMenuPopUp
.Caption = "Sub Menu Popup"
' This optional can be used to invoke macro which toggles
' the state of child controls.
.OnAction = "MenuEvents"
End With

' Add item to Sub Menu
With SubMenuPopUp.Controls
Set SubMenuPopUpItem = .Add(Type:=msoControlButton)
End With

With SubMenuPopUpItem
.Caption = "Sub Menu Popup Item"
.OnAction = "MenuEvents" ' <- Macro to run when clicked.
End With

' Create a combo box which lists the options.

With DropDownList
.AddItem "Choice A"
.AddItem "Choice B"
.Caption = "Choices"
.TooltipText = "Select choice from the list"
.Width = 120
' default value to show
.ListIndex = 1
.OnAction = "MenuEvents"
End With

End Sub

Sub MenuEvents()
'Handler for the event when user clicks on the toolbar options
Dim cmdBCtl As CommandBarControl
Set cmdBCtl = Application.CommandBars.ActionControl
' Determine the caption of the control that was clicked.
Select Case cmdBCtl.Caption

Case "Choices"
With cmdBCtl
Select Case .ListIndex
Case 1
MsgBox "You selected 1st item in dropdown list", _
vbInformation, "Menu Choice"
Case 2
MsgBox "You selected 2nd item in dropdown list", _
vbInformation, "Menu Choice"
End Select
End With
Case "Sub Menu Item"
MsgBox "You selected item:" & "Sub Menu Item", _
vbInformation, "Menu Choice"

Case "Sub Menu Popup"
' Do preprocessing, adding/deleting/
' enabling/disabling child items in the popup.
Debug.Print "Sub Menu Popup"
Case "Sub Menu Popup Item"
MsgBox "You selected item in the popup", _
vbInformation, "Menu Choice"
End Select
End Sub

Sub RemoveMenu()
On Error Resume Next
Application.CommandBars("My Toolbar").Delete
End Sub
' ----- End Of Code -----
 
Shyam,

Thanks for your help. It works beautifully. I soon saw where my "ball of
string" coding was going astray.

Regards

Roderick
 
Back
Top