Creating an Animated CommandButton with VBA.
My very first blog post on this website, published back in September 2006, was about the CommandButton Animation method. I have used this technique in almost all of my projects since then. The animated response of CommandButtons to mouse movements gave the Forms a sense of life, making them feel interactive rather than rigid and boring.
The design consists of a CommandButton control and a Rectangle control configured with the Shadow special effect. The CommandButton is manually positioned over the Rectangle control to create the desired visual appearance. The animation is implemented in the Mouse_Move() event procedures in the Form Module, which invoke a common function to perform the Animation.
If you haven’t read the earlier post yet, I recommend reviewing it first to get a general understanding as how it works before continuing. [Click here to go to the earlier article.]
Now, let’s take this a step further and see how to create animated CommandButtons, with their corresponding animation procedures written into the Form module, all at design time, with just a single click of a button.
Animated Button Creation Code.
With two VBA routines, we can do this very easily.
Open one of your databases.
Display the Standard VBA Module.
Create a new Standard Module (Insert -> Module).
Copy both of the following Functions into the Standard Module and save the code:
CommandButton Animation Code:
Public Function BAnimate(ByVal strForm As String, ByVal mode As Integer, ByVal lblName As String)
'---------------------------------------------------------------------------
'Author : a.p.r. pillai
'Date : July 1998
'Remarks: Animates the Command Button
'Rights : All Rights Reserved by www.msaccesstips.com
'---------------------------------------------------------------------------
Dim Frm As Form, l As Long, t As Long
On Error GoTo BAnimate_Err
Set Frm = Forms(strForm)
l = Frm.Controls(lblName & "Box").Left
t = Frm.Controls(lblName & "Box").Top
If (mode = 1) And (Frm.Controls(lblName & "Box").Visible = False) Then
Frm.Controls(lblName & "Box").Visible = True
Frm.Controls(lblName).Left = l - (0.0208 * 1440)
Frm.Controls(lblName).Top = t - (0.0208 * 1440)
Frm.Controls(lblName).FontWeight = 700
ElseIf (mode = 0) And (Frm.Controls(lblName & "Box").Visible = True) Then
Frm.Controls(lblName & "Box").Visible = False
Frm.Controls(lblName).Left = l
Frm.Controls(lblName).Top = t
Frm.Controls(lblName).FontWeight = 400
End If
BAnimate_Exit:
Exit Function
BAnimate_Err:
Err.Clear
Resume BAnimate_Exit
End FunctionAnimated CommandButton Creation Code:
Public Function CreateButton(ByVal intSection As Integer, strName As String)
'---------------------------------------------------------------------------
'Author : a.p.r. pillai
'Date : Aug. 2000
'Remarks: Creates animated command button controls and Programs on a Form
' : at design time of the form.
'Rights : All Rights Reserved by www.msaccesstips.com
'---------------------------------------------------------------------------
'Program Parameter Values : intSection
' 0 = Form Detail Section
' 1 = Form Header Section
' 2 = Form Footer Section
' : strName
'Command Button Name Property Value
'The Name will be prefixed with the text 'cmd'
'Example: Edit will be modified as cmdEdit
'Sample Run : CreateButton 0,"Edit"
'Remarks : If more than one Form is opened in Design View then the
' : Command Button will be created on the first Form
'---------------------------------------------------------------------------
Dim Frm As Form, Ctrl As Control, txt As String
Dim vLeft As Long, vTop As Long, vWidth As Long, vHeight As Long
Dim i As Long, dif As Double, x As Long, Y As Long, z
Dim frmViewStatus As Integer, frmsCount As Integer, j As Integer
Dim hfd As String
On Error Resume Next
i = 1440
dif = 0.0208 * i
vLeft = 0.25 * i
vTop = 0.0521 * i
vWidth = 1.25 * i
vHeight = 0.2375 * i
frmsCount = Forms.Count - 1
frmViewStatus = False
For j = 0 To frmsCount
If Forms(j).CurrentView = 0 Then
Set Frm = Forms(j)
frmViewStatus = True
Exit For
End If
Next
If frmViewStatus = False Then
MsgBox "Open a Form in Design View then try again." & vbCr & vbCr & "Program CreateButton() Aborted."
Exit Function
End If
Set Ctrl = CreateControl(Frm.Name, acRectangle, intSection, , , vLeft, vTop, (vWidth - dif), (vHeight - dif))
With Ctrl
.Name = "cmd" & strName & "Box"
.SpecialEffect = 4
.BorderWidth = 3
End With
Set Ctrl = CreateControl(Frm.Name, acCommandButton, intSection, , strName, vLeft, vTop, vWidth, vHeight)
With Ctrl
.Name = "cmd" & strName
.Caption = strName
End With
x = Frm.Module.CreateEventProc("MouseMove", Ctrl.Name)
txt = "BAnimate me.name, 1, " & Chr(34) & "cmd" & strName & Chr(34)
Frm.Module.InsertLines x + 1, txt
hfd = Choose(intSection + 1, "Detail", "FormHeader", "FormFooter")
z = Frm.Module.ProcBodyLine(hfd & "_MouseMove", vbext_pk_Proc)
If z = 0 Then
x = Frm.Module.CreateEventProc("MouseMove", hfd)
Else
x = z + 1
End If
txt = "BAnimate me.name, 0, " & Chr(34) & "cmd" & strName & Chr(34)
Frm.Module.InsertLines x + 1, txt
CreateButton_Exit:
Exit Function
CreateButton_Err:
Resume CreateButton_Exit
End FunctionPress Ctrl+S to save the programs. Keep the VBA Window open.
Do the Test Run.
Now that you have the main functions for creating and animating Command Buttons, let us do a quick run to see how easy it is.
Close all open forms, if any.
Open a new Form in Design View.
Display the VBA window, if it was closed or minimized (Alt+F11).
Display the Debug Window (Immediate Window) - Ctrl+G.
Type the following statement in the Debug Window and press the Enter Key:
CreateButton 0, "Edit" The first parameter value (0) represents the section of the form where the CommandButton will be placed.
-
0 = Detail Section
-
1 = Form Header
-
2 = Form Footer
The second parameter ("Edit") serves two purposes: it defines the commandbutton’s Name (which will be modified to cmdEdit and assigned to the Name property) as well as its Caption.
Important: The second parameter must always be a single word. This is essential for correctly creating the MouseMove event procedure in the form’s module. Once the button is created, you can always change its Caption later if needed.
Minimize the VBA window to show the Form in Design View. You can see the CommandButton is created in the Detail Section of the Form with the Caption: Edit.
Change the Form into Form View.
Move the Mouse over the CommandButton. The button moves slightly up and to the left to display a shadow beneath it and to the right of the CommandButton.
Move the mouse out from the button. The CommandButton goes back to its original position, hiding the shadow.
Repeat this action in quick succession. You can see the button movement more clearly.
The VBA Code is Written by the Program.
If you display the Form's VBA Module, you can see that the following VBA Program lines are written into it:
Private Sub cmdEdit_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
BAnimate Me.Name, 1, "cmdEdit"
End Sub
Private Sub Detail_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
BAnimate Me.Name, 0, "cmdEdit"
End Sub
Change the Form mode to Design View.
Click on the CommandButton to select it.
Drag the CommandButton alone to the right and down to show the Rectangle Control with the special effect shadow underneath it.
The Command Button and the Rectangle Control work together to create the animation effect. To move them as a pair, click near the CommandButton and drag the mouse over both controls to select them together. Then, drag the selection to the desired location on the form.
It is important to do this before creating another CommandButton in the same form section. Otherwise, the new button will be placed directly on top of the previous one. By default, all newly created CommandButtons are positioned in the same location within their section.
Right-click on the Detail Section of the Form and select Form Header/Footer to display them on the Form.
Creating a Button on the Header or Footer Section.
You can now try the CreateButton() function, with the first parameter value set to 1 or 2 to create CommandButtons in the Form Header or Form Footer sections, respectively.
The second parameter, which specifies the CommandButton name, must be unique for each button on the same form.
Below are sample statements demonstrating how to create animated CommandButtons on the header and footer sections of the form:
CreateButton 1, "PrintPreview"
CreateButton 2, "Exit"
Note: Make sure the Header and Footer sections are visible before attempting to create CommandButtons on them.
Also, ensure that only one form is open in Design View. If multiple forms are open, the first form found in Design View is selected for creating the button controls.
During form design time, running the CreateButton() function from the Debug Window is the most convenient method.
However, if you prefer a different approach, such as launching the program from a CommandButton click, that can also be implemented easily.
Button Creation from a CommandButton Click.
A CommandButton Click will prompt for the required parameter values and quickly create the Animated CommandButton on the form, currently in Design View. It generates its associated subroutines in the form’s module.
Open a new Form in Design View.
Create a Command Button as you normally do.
Display its Property Sheet when the CommandButton is in selected state (F4).
Change the Name property value to cmdCreate and set the Caption property value to Create Button.
Display the Form's VBA Module (Alt+F11).
Copy and paste the following Code into the Module and press Ctrl+S to save the Form with the name frmCreateButton:
Private Sub cmdCreate_Click()
Dim intSection As Integer, strButtonName As String
Dim msg As String
msg = "Form Section (0,1 or 2)" & vbCr
msg = msg & "0 - Form Details" & vbCr
msg = msg & "1 - Form Header" & vbCr
msg = msg & "2 - Form Footer"
intSection = 3
Do While intSection < 0 Or intSection > 2
intSection = Nz(InputBox(msg, "cmdCreate_Click()"), 0)
Loop
strButtonName = ""
Do While Len(strButtonName) = 0
strButtonName = InputBox("Command Button Name", "cmdCreate_Click()")
Loop
If (intSection >= 0 And intSection < 3) And Len(strButtonName) > 0 Then
CreateButton intSection, strButtonName
End If
End SubPerform a Demo Run.
Open a form in Design View and display the Form’s Header/Footer Sections.
Open the frmCreateButton in Normal View.
Click the Command Button to enter the program parameter values.
Input one of the values (0, 1, or 2) suggested by the Prompt to select a Form Section area and press the Enter Key or click the OK button.
Enter a Name for the CommandButton in the second prompt (it should be a single word, eg. PrintPreview) and press the Enter Key or click OK.
The CommandButton control is created on the selected Form Section in the design view.
If you want to use this method across all your projects, you can transfer the first two functions, BAnimate() and CreateButton(), into a common Library Database. Then, attach this library as a Reference Library File to your projects. (Refer to the blog post CommandButton Animation to learn how to do this.)
- CommandButton Animation
- Double Action CommandButton
- Colorful CommandButtons
- Transparent CommandButton
- CommandButton Animation-2
- Creating an Animated CommandButton with VBA
- CommandButton Color Change on Mouse Move