Overriding the Built-In Menus and Commands in Microsoft Word:
Return to List
(1) Overview
A simple way to customize the way Microsoft(r) Word interacts with templates and
add-ins that you develop is to write procedures that override built-in menus and commands.
For example, perhaps you want verify that a user has filled out the Properties dialog box
every time a user saves a document, and display the dialog box if the necessary fields are
blank. Or maybe you want to save documents to a document library on a server every time a
user saves a document. You can do these things and more by creating some fairly simple routines.
(2) Creating Subroutines to Override Menus
Often, you can override menu commands by creating a subroutine named after the menu and
the menu command. For example, if you want to create a subroutine that displays a custom
font dialog box instead of the built-in Font dialog box, you would create a subroutine
called FormatFont and place the call to display your custom dialog box inside the subroutine.
For example, the following subroutine displays a message every time the user clicks the
Font command on the Format menu.
Sub FormatFont()
MsgBox "FormatFont"
End Sub
While you can use the above method to override most menu commands, there are some menu
commands for which this doesn't work. In these cases, you would need to locate a different
command name.
(3) Locating Menu Commands
Some of the menu and toolbar button commands aren't easily discoverable, which means you
might have to work to locate them. In some cases, the name of the menu command is the same
as the name of the subroutine, without prefacing the name of the subroutine with the name
of the top-level menu. For example, to create a subroutine to override the Web Page Preview
option on the File menu, you would need to create a subroutine named WebPagePreview instead
of FileWebPagePreview.
In other cases, the name of the command corresponds to a different top-level menu and not
the menu where it currently exists. Perhaps this is because the option at one time existed
on a different menu. For example, the Templates and Add-ins option is on the Tools menu.
However, to override it, you would need to create a subroutine named FileTemplates rather
than ToolsTemplatesAndAddIns.
There's a little-known trick that you can use to locate command names for menu commands and
toolbar buttons: To determine the command names for most menu commands, hold down
CTRL+ALT
and then press the PLUS key on the numeric keypad. The mouse pointer changes to . Then click
the mouse on any menu item or toolbar button for which you want the command. The Customize
Keyboard dialog box displays with the name of the related command in the Commands list.
(If the Customize Keyboard dialog box doesn't display, you can assume there isn't a
corresponding command that you can use to override the menu option or toolbar button.)
In some rare instances, this trick doesn't return a command name that works. For instance,
when I clicked Diagram on the Insert menu, the Customize Keyboard dialog box offered a
command called DrawInsertDiagram, but when I created a similarly named subroutine, it failed
to override the Diagram command on the Insert menu. After playing around with names like
InsertDrawInsertDiagram and InsertDrawDiagram, I was still unable to locate a viable
command name, so I had to use other means to override this menu option.
(4) When You Can't Locate a Command Name
If you are unable to locate a command name to override a menu command or a toolbar button,
as I was unable to locate the Diagram command on the Insert menu, you can use the Microsoft
Office CommandBar object to override the built-in commands.
To do this, first create a custom subroutine, giving it any name you want. For example,
to override the Diagram command on the Insert menu, I created the following subroutine.
However, by itself, this subroutine doesn't override the option.
Sub OverrideInsertDiagram()
MsgBox "OverrideInsertDiagram"
End Sub
Next, create a subroutine to specify the menu command to override. In this subroutine,
specify the CommandBar and CommandBarControl that you want to override. Then, using the
OnAction property of the CommandBarControl object, specify the name of the subroutine that
you created above. The following example demonstrates this.
Sub OverrideDiagramMenuCommand()
Application.CustomizationContext = ActiveDocument.AttachedTemplate
CommandBars("Insert").Controls("Dia&gram...") _
.OnAction = "OverrideInsertDiagram"
End Sub
You should note that when specifying the CommandBarControl object, you must type the menu
command name exactly as it appears in the menu, even including any ellipses. Without the
ellipses, assigning the menu command to the CommandBarControl object will raise a run-time
error (including the ampersand that specifies the letter in the option name that is
underlined is optional).
The CustomizationContext property above specifies the template or document in which the
customized menu override is applicable. The above code specifies the AttachedTemplate as the
template to which to limit the customization. If this code is in a template on which the
active document is based, this customization is limited to only documents based on that template.
(5) Overriding Toolbar Buttons and Keyboard Shortcuts
In addition to overriding menu commands, you can also override many of the toolbar buttons
and keyboard shortcuts. In fact, when you use a built-in command to override a menu item,
the subroutine also overrides associated toolbar buttons and keyboard shortcuts. However,
there are many toolbar buttons that are not directly associated with a menu command.
Therefore, you can locate the associated toolbar button or keyboard shortcut command from
the list of built-in commands located in the Macros dialog box. Just display the dialog box
(click Tools, point to Macro, and then click Macros) and select Word Commands in the Macros
in dropdown list.
You can also get a list of the built-in commands using the ListCommands method of the
Application object. The ListCommands method creates a new document that contains a table of
all the commands with their associated menu or keyboard shortcut (note that this list is not
necessarily comprehensive). To create this list, run the following subroutine.
Sub GetBuiltInCommands()
Application.ListCommands True
End Sub
After you have the list of commands, you can override most of the commands by removing any
spaces from the command name, and then creating a subroutine named after the command name.
For example, if you create a subroutine called Bold, you will override the Bold button on the
Formatting toolbar and the CTRL+B keyboard shortcut.
(6) What about Other Office Applications?
Although Word is the only application that provides direct support for overriding built-in
menu, toolbar, and keyboard commands, you can use the CommandBar objects to override built-in
menus in other Office applications. Therefore, if you are in Microsoft Excel, Microsoft Access,
Microsoft PowerPoint(r), or Microsoft FrontPage(r) and want to create a subroutine to override
any of the menus, you can you use the CommandBar objects as shown above to override any
(or all) of the menu items.