Home Newsletter

Nederlandse pagina niet beschikbaarHome > Article index > Modern Userform

Creating modern-looking userforms in VBA



The Microsoft VBA editor was designed somewhere around 1996. This means that the standard design of the userforms you create with that editor look really old-school if you don't do anything. Here I show how we might create a more modern-looking user-interface by changing some properties of the form and by using some tricks.

The example file

Download the file which contains both the old-school userform and the modern form.

Default userform properties

When you insert a new userform into your VBA project, the form is set to default properties:

Default settings of a userform

The default settings of a userform are used as a template for any new control you add to it, so you can save yourself a lot of time by making the right choices right away.

Here are the settings I use to make my forms look more modern:

Default settings of a userform

The properties I change are:

Modern looking controls

Checkbox alternative

This is the standard look of a userform with a checkbox:

A standard userform with a checkbox


Let's see if we can improve on that:

A redesigned userform with a redesigned checkbox

See? That is better. So how did I create this?

  1. From the Insert tab of Excel, choose Insert Icon:
    The Insert Icon button of Excel
  2. In the subsequent window, type "switch" in the search box, this is what I got:
    The Insert Icon window of Excel after searching for Switch
  3. I selected both icons and clicked Insert, giving me this:
    The Icons inserted in Excel
  4. I don't like the black. Let's change that. Right-click either of the icons and choose "Convert to shape"
    Converting an icon to a shape is easy
  5. This ensures the icon is converted to a grouped set of built-in shapes, which are easy to adjust. I did not change the selection, instead, I clicked the Shape Format contextual tab:
    The Shape Format contextual tab of Excel
  6. I changed both Shape Fill and Shape Outline to green
  7. I repeated steps 4 to 6 for the black (filled) switch
  8. I dragged a checkbox control on my form (used a slightly larger Font size of 14)
    A chekcbox control
  9. Next I added an Image control, set its border to be hidden and the backcolor and BorderColor to Window background, BorderStyle to 0 - BorderStyleNone:
    An Image control
  10. I then copied one of the switches by right-clicking them on the worksheet and choosing Copy, clicked inside the Picture property and pressed control+v:
    An Image control with the icon inside
  11. I changed the name of both Image controls, respectively to SwitchOn and SwitchOff and placed them on top of each other, right on top of where the checkbox is:
    The Image controls on top of the checkboxwith the icon inside
  12. To make things easier (Thanks Andy Pope, for the suggestion in the comments), set the Enabled property of both switches to False. That way, you appear to click the image, but the click will "go" to the checkbox control underneath, which is what we want.
  13. Finally, we need some VBA code to make it look like we're moving the switch when we click on the images and when we click on the text of the check box (I did not change the name of the check box, so that is CheckBox1).

We do not need the Image control events, as everything is handled from teh click on the checkbox. Here is the VBA code we need to make this work:

Option Explicit
' ******Events******
Private Sub CheckBox1_Click()
End Sub

Private Sub UserForm_Initialize()
End Sub

' ******Private routines******
Private Sub SetSwitchInCorrectPosition()
    If CheckBox1.Value Then
        SwitchOn.Visible = True
        SwitchOff.Visible = False
        SwitchOn.Visible = False
        SwitchOff.Visible = True
    End If
End Sub

Of course things become more complicated if you have multiple checkboxes on the form that you want to work this way. I've implemented that in the multiple checkboxes example (in the dowload) using two class modules.

More to follow

I've only discussed how you might create a nice-looking alternative for the check-box. I plan to add more controls in the near future. If you've designed modern-looking alternatives yourself, why not add your examples in the comments below?


All comments about this page:

Comment by: Andy Pope (17-2-2022 10:30:00) deeplink to this comment

Great article, as always.

If you change the Enable property of both switch images you will not need the mouse events. A click over the disabled images will be picked up by the checkbox.

Alternatively you can still make use of the hidden Click method of the image control. You will need to manually add the click event code.

Private Sub SwitchOn_Click()
    CheckBox1.Value = Not CheckBox1.Value
End Sub
Private Sub SwitchOff_Click()
    CheckBox1.Value = Not CheckBox1.Value
End Sub

Comment by: Michael (22-2-2022 22:29:00) deeplink to this comment

Jan — is there a way to make the your form changes into defaults retained by Excel? Thanks for the inspiration.

Comment by: Jan Karel Pieterse (24-2-2022 18:10:00) deeplink to this comment

Hi Michael,

I don't think you can change the defaults, no. I usually just copy a form from another project :-)

Comment by: Thiago (24-5-2022 05:29:00) deeplink to this comment

Great tip, however, it doesn't work correctly if the checkbox is inside a frame, the image is outside the frame, using the second example... how do I solve this?

Comment by: Jan Karel Pieterse (24-5-2022 10:08:00) deeplink to this comment

Hi Thiago,

Not sure what you mean, but doesn't it work if you place all controls inside the frame? If needed duplicate the switches?

Comment by: Thiago (25-5-2022 05:17:00) deeplink to this comment

Sorry, I used Google Translate, it must have been a bit confusing. I'll try to explain it another way. I did like this:

- I downloaded the example file;
- I used the example of the ModernMultiple form;
- In this form, I added a frame;
- Inside this frame, I put the checkbox.
- When clicking on the checkbox, the image is outside the frame.

I send you the recording of my screen, I believe it will be easier to understand:

Comment by: Jan Karel Pieterse (25-5-2022 10:37:00) deeplink to this comment

Hi Thiago,

Aha, I understand. I have updated the example file and it now also works with checkboxes in a frame. I only had to change two lines of code in the class module clsChecks. So if you used the idea in your own project, simply copy the clsChecks code and paste it in your own class module.

Comment by: Thiago (26-5-2022 02:09:00) deeplink to this comment

Hi Jam,

Thanks a lot for the help, it worked perfectly here :)

Have a question, comment or suggestion? Then please use this form.

If your question is not directly related to this web page, but rather a more general "How do I do this" Excel question, then I advise you to ask your question here: www.eileenslounge.com.

To post VBA code in your comment, use [VB] tags, like this: [VB]Code goes here[/VB].