How to use VBA to set a custom graphic on a toolbar button

Article contributed by Astrid Zeelenberg

You might find that you are happy to use one of the 1,707 button images that are built into Word. You can get a complete list of the images and their FaceIDs from the download file in following article: Assigning custom button images to your toolbar and menu buttons. Once you've chosen a FaceID you want to use, you can assign it to a button at runtime using:

CommandBars("MyTemplateToolbar").Controls(1).FaceID = 'the number you chose

But if you want to create your own button images, read on. 

Method 1: Pasting the image using an external graphic

Sub AddPictureToButton()

Dim oShape As Shape

    'Place the graphic in the document
    Set oShape = ActiveDocument.Shapes.AddPicture(FileName:= _
             "PathAndNameOfPicture.gif")

    oShape.Select

    'Copy graphic
    Selection.CopyAsPicture

    'Delete from document
    Selection.Delete

    'Copy the graphic to the first button on your toolbar
    'Replace the name of the commandbar with your own
 
  CommandBars("TemplateCommandbar").Controls(1).PasteFace

    Set oShape = Nothing

End Sub

Your image canvas size must be 16 x 16 pixels, and the background colour must be RGB 191, 191, 191. The Gif format seems to work most reliably for this, in most cases, and it helps if you make the background colour transparent.

See also Assigning custom button images to your toolbar and menu buttons.
  

Method 2: Using a dummy disabled toolbar

There are several reasons why some people may not want to use the above method:
  

You may not want to have to distribute the Gif file with the template.

You may not want to have to rely on a document being open when you run the code.

If you want to be able to disable the button in question (for instance, when there are no documents open); and if you want the disabled button image to look as it should, then you may find that you have to modify the button manually after pasting it. (This is particularly an issue if you or any of your users are using Word 97). See also Assigning custom button images to your toolbar and menu buttons for a more detailed discussion of this issue.

To get round this:
  

1.

Create a "dummy" toolbar in your template at design time. Using VBA, add as many buttons to it as are needed to store all the button images that you want to be able to assign programmatically, but without giving the buttons any OnAction property, as it's simply going to be an image container. Give each button a caption, so that they are easy to identify later, e.g.:

With CommandBars("Dummy").Controls.Add
    .Caption = "Button1"
End With
  

2.

Then add your button images manually to the dummy controls, and if appropriate, select Tools + Customize, right-click the button and select Edit Button Image”, click where it says Erase, and erase all of the background grey, so that it will display correctly if you ever need to disable the button.
  

3.

Disable the dummy toolbar using:

CommandBars("Dummy").Enabled = False 1
  

4.

At runtime you can then use code like the following:

CommandBars("Dummy").Controls("Button1").CopyFace
CommandBars("TemplateCommandbar").Controls(1).PasteFace
ThisDocument.Saved = True

(You need to set the template's Saved property to True, so that the user won't subsequently be asked if they want to save changes to it.)

__________________

1.

Note that the Enabled property of a toolbar is not stored in the template that the toolbar is stored in, even though it's a property of that toolbar! Instead, it is stored in the Data Key; so it's also a good idea to disable it in the template's AutoOpen macro (if it's a document template) or its AutoExec macro (if it's a Global template), just in case the user's Data Key becomes corrupted.

By contrast, the Enabled property of a toolbar button (CommandBarControl) is stored in the template that the toolbar is stored in; so if you disable a button, you need to immediately mark the template as Saved”:, using:

ThisDocument.Saved = True