If you have a Microsoft Visual Basic for Applications macro that takes a long time to finish, you may want to give the user an indication that the macro is progressing correctly. This article describes how to create a progress bar with a user form in Microsoft Excel.
Microsoft provides programming examples for illustration only, without warranty either expressed or implied. This includes, but is not limited to, the implied warranties of merchantability or fitness for a particular purpose. This article assumes that you are familiar with the programming language that is being demonstrated and with the tools that are used to create and to debug procedures. Microsoft support engineers can help explain the functionality of a particular procedure. However, they will not modify these examples to provide added functionality or construct procedures to meet your specific requirements.
Create the User Form
In the following example, a Visual Basic subroutine populates a large range
of cells with a random number. The indicator shows you that the macro is running
correctly.
- Open a new workbook in Excel.
- In Microsoft Office Excel 2003 and in earlier versions of Excel, click Tools, point to Macro, and then click Visual Basic Editor.
In Microsoft Office Excel 2007, click Visual Basic in the Code group on the Developer tab.
Note To display the Developer tab in the Ribbon, follow these steps:- Start Excel 2007, click the Microsoft Office Button, and then click Excel Options.
- In the Excel Options dialog box, click Popular, and then click to select the Show Developer tab in the Ribbon check box.
- On the Insert menu, click UserForm.
- Draw a Label control on the user form.
- Change the following properties of the Label control to the
following values:
Property Value
--------------------------------------------
Caption Now updating. Please wait...
Note If the Properties window is not visible, click Properties Window on the View menu. - Draw a Frame control on the user form.
- Change the following properties of the Frame control to the
following values:
Property Value
-----------------------------
Name FrameProgress
- Draw a Label control on the Frame control.
- Change the following properties of the Label control to the
following values:
Property Value
-------------------------------------
Name LabelProgress
BackColor &H000000FF&
SpecialEffect fmSpecialEffectRaised
Type the Macro Code
- Double-click the user form to open the Code window for the user form.
- In the module, type the following code for the UserForm_Activate event:
Private Sub UserForm_Activate()
' Set the width of the progress bar to 0.
UserForm1.LabelProgress.Width = 0
' Call the main subroutine.
Call Main
End Sub
- On the Insert menu, click Module.
- In the Code window for the module, type the following code:
Sub ShowUserForm()
UserForm1.Show
End Sub
Sub Main()
Dim Counter As Integer
Dim RowMax As Integer, ColMax As Integer
Dim r As Integer, c As Integer
Dim PctDone As Single
Application.ScreenUpdating = False
' Initialize variables.
Counter = 1
RowMax = 100
ColMax = 25
' Loop through cells.
For r = 1 To RowMax
For c = 1 To ColMax
'Put a random number in a cell
Cells(r, c) = Int(Rnd * 1000)
Counter = Counter + 1
Next c
' Update the percentage completed.
PctDone = Counter / (RowMax * ColMax)
' Call subroutine that updates the progress bar.
UpdateProgressBar PctDone
Next r
' The task is finished, so unload the UserForm.
Unload UserForm1
End Sub
Sub UpdateProgressBar(PctDone As Single)
With UserForm1
' Update the Caption property of the Frame control.
.FrameProgress.Caption = Format(PctDone, "0%")
' Widen the Label control.
.LabelProgress.Width = PctDone * _
(.FrameProgress.Width - 10)
End With
' The DoEvents allows the UserForm to update.
DoEvents
End Sub
- Return to Excel.
- In Excel 2003 and in earlier versions of Excel, point to Macro on the Tools menu, and then click Macros.
In Excel 2007, click Macros in the Code group on the Developer tab. - In the Macro dialog box, click to select ShowUserForm, and then click Run.
A dialog box that has a red progress bar appears. The progress bar increases as
the
Main subroutine populates the cells on the worksheet.
The
ShowUserForm subroutine shows the user form. The procedure that is attached to the
Activate event of the user form calls the
Main subroutine. The
Main subroutine populates cells with random numbers. Additionally, the subroutine calls the
UpdateProgressBar subroutine that updates the
Label control on the user form.
Note When you use this technique, your macro takes just a bit longer to finish its intended tasks.