Sie sind auf Seite 1von 21

TABLE OF CONTENTS

Table of Contents ___________________________________________________________ 0


Introduction _______________________________________________________________ 1
#1 Create a simple framework _________________________________________________ 2
#2 Use this quick and easy method to test your output _____________________________ 4
#3 Reduce errors using this little-known option ___________________________________ 7
#4 Make selecting the correct worksheet a snap __________________________________ 9
#5 Make your code easy to read and user friendly ________________________________ 12
#6 Use the Sandbox method to solve complex tasks _____________________________ 15
#7 Make your macros tough to break __________________________________________ 17
Conclusion ________________________________________________________________ 19
7 Steps to Creating Professional Quality VBA Macros 1

INTRODUCTION

This book contains the 7 steps for building Professional Quality VBA Applications. You can
use these step to build any type of VBA Application. From small and simple to large and
complex. These are the same steps I have used to build all the application in the Excel VBA
Handbook.
If you have any questions about the contents of the 7 steps or VBA in general then please
feel free to email me at Paul@ExcelMacroMastery.com or leave a comment on my blog at
Excel Macro Mastery.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 2

1 CREATE A SIMPLE FRAMEWORK

Creating a simple framework will make your code

More organised

Easier to change

Simple to navigate

In VBA the procedures (functions and subs) are stored in Modules. It is a good idea to group
similar procedures together in a single module.
For example, in a book shop you have different sections. There are fiction, romance, sports
and business sections. Treat your modules like these sections and your procedures like
books.
The following is a simple example

Click_Events Team_Results Test_Print

GenerateReport_Click() CreateReport() PrintArrays()


ClearMatchData_Click() ClearReportArea() PrintCollection()
CreateTextFile_Click() CreateTeamResults()

The Click_Events module hold the subs that run when a button is clicked.
The Team_Results module holds the main subs for this example project.
The Test_Print module holds subs that are useful in any application.

Click events are subs that run when a button is clicked. Having them all together in one
module and ending their name with _Click makes your life much easier.
It is clear from their name what they do. If you need to see how many button click subs you
have you can see at a glance when they are in one module. If you need to update or change
these subs then it is straightforward.
Imagine the opposite case where these subs are in random modules and do not have _Click
in their name. It would make it very tedious trying to locate them.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 3

A second thing to keep in mind for using Click Event subs. Never put any code in them
except calls to other functions

1 Sub CreateReport_Click()
2 CreateReport
3 End Sub
4
5 Sub ClearData_Click()
6 ClearData
7 End Sub

Test_Print Module

The Test_Print module in the diagram above, holds common subs that are useful in many
applications. By having them in one module makes itm easy to add them to any VBA project.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 4

USE THIS QUICK AND EASY METHOD TO


2 TEST YOUR OUTPUT
Debug.Print prints to the Immediate Window. It is simple to use but is a really powerful
feature. As we create our application we can use Debug.Print to write to the Immediate
Window.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 5

The following are some examples of using Debug.Print

1 Sub PrintExamples()
2
3 ' Print 15
4 Debug.Print 5 + 10
5
6 ' Print address of range
7 Debug.Print Sheet1.Range("A1:A12").Address
8
9 ' Print cell contents
10 Debug.Print Sheet1.Range("A1").Value
11
12 End Sub

We can use Debug.Print to test our framework before we add code.

1 Public Sub CreateReport()


2
3 ' 1. Turn off functionality such as auto calculations
4 TurnOffFunctionality
5
6 ' 2. Clear existing data
7 ClearReportArea
8
9 ' 3. Find and copy matches
10 CreateTeamResults
11
12 ' 4. Turn functionality back on
13 TurnOnFunctionality
14
15 End Sub
16
17
18 Public Sub TurnOffFunctionality()
19 Debug.Print "TurnOffFunctionality()"
20 End Sub
21
22 Public Sub TurnOnFunctionality()
23 Debug.Print "TurnOnFunctionality()"
24 End Sub
25
26 Public Sub ClearReportArea()
27 Debug.Print "ClearReportArea()"
28 End Sub
29
30 Public Sub CreateTeamResults()
31 Debug.Print "CreateTeamResults()"
32 End Sub

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 6

The above code will give the following output

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 7

REDUCE ERRORS USING THIS LITTLE-


3 KNOWN OPTION
You may not know this, but there are three types of errors in VBA

1. Syntax errors on a single line


2. Project errors on multiple lines
3. Run time errors these occur when your application is running

The syntax checker ensures that your line of code has the correct syntax. However it can
only check the line you are currently on.

To check the project you can use Compile VBAProject from the Debug menu

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 8

Compile finds syntax errors as well. However it also finds errors where the syntax may be
correct but the code doesnt make sense.

Examples of these errors are

For loop without a corresponding Next

If without End If

With without End With

Calling a Sub that does not exist

Calling a Sub with incorrect parameters

And so on

The following code is missing the Next statement

1 Sub TestFor
2 For i = 1 To 10
3 End Sub

If you use Debug->Compile you will get the following error

Using Compile is simple to use and runs very quickly. You can run after you add any small
piece of code or when you make a change to an existing application.
It is always a good idea to use it before you run your code.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 9

MAKE SELECTING THE CORRECT


4 WORKSHEET A SNAP
The three most important elements of VBA are workbooks, worksheets and ranges. You use
them in every VBA project you undertake.
There are multiple ways to access a worksheet and this leads to confusion all the time.

I have made selecting the correct worksheet as simple as possible. There are two types of
worksheets:

1. A worksheet that is in the current workbook


2. A worksheet that is in another workbook

By current workbook I mean the workbook where your code is.


If your code is in the current workbook then use the code name of the worksheet.

What is the code name?

Take a look in the Project Explorer window. It is normally on the left hand side of the Visual
Basic editor. If it is not visible then select View->Project Explorer.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 10

The code name is the name on the left. The worksheet name is the one on the right in
parenthesis. When you create a new workbook they will both have the same name i.e.
Sheet1.
You can change the code name in the Properties window. It is normally below the Project
Explorer window. If it is not visible select View->Properties Window.

We can use the code name directly in code


1 CodeName.Range("A1") = 99
2 CodeName.Range("A1") = "John Smith"

You will often see code examples that use ThisWorkbook.Worksheets to access worksheet
in the current workbook
1 Dim sh As Workbook
2 Set sh = ThisWorkbook.Worksheets("Sheet1")
3 sh.Range("A1") = 1

Anywhere you see this code you can replace it with code that uses the code name. So the
previous example could be written as
1 Sheet1.Range("A1") = 1

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 11

If the code is in a different workbook, then you need to open the workbook first. You use the
Workbooks.Open function to open the workbook

1 ' Open Workbook


2 Dim wkBook As Workbook
3 Set wkBook = Workbooks.Open(Filename:="C:\Docs\Data.xlsx", ReadOnly:=True)

Then you use worksheets collection of this workbook to access the worksheet you require.
You use the worksheet name here i.e. the name on the tab at the bottom of the worksheet in
Excel.
1 Dim shData As Worksheet
2 Set shData = wkBook.Worksheets("Sheet1")

Once you have the worksheet you then use it the same way you used the code name.
1 shData.Range("A1") = 99
2 shData.Range("A1") = "John Smith"

However, it is better to use the code name here as well. You cant use it directly but you can
get it using the following function
1 ' This function gets the worksheet object from the Code Name
2 Public Function SheetFromCodeName(Name As String, bk As Workbook) As
3 Worksheet
4
5 Dim sh As Worksheet
6 For Each sh In bk.Worksheets
7 If sh.CodeName = Name Then
8 Set SheetFromCodeName = sh
9 Exit For
10 End If
11 Next sh
12
13 End Function

You can use the function like this


1 Dim shData As Worksheet
2 Set shData = SheetFromCodeName("Sheet1", wkBook)

If the user changes the worksheet name, the code will still work fine.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 12

MAKE YOUR CODE EASY TO READ AND


5 USER FRIENDLY
There are lots of ways to make your code user friendly. Here were going to look at the two
major ones in VBA

Use meaningful variable names instead of ranges

Avoid using magic numbers

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 13

Take a look at the following code

1 If cnReport.Cells(i, COL_YEAR) = cnData.Cells(rowRep, COL_DATA_YEAR) Then


2 cnReport.Cells(i, COL_RES) = cnData.Cells(i, COL_DATA_YEAR) + 1
3 ElseIf cnReport.Cells(i, COL_YEAR) = cnData.Cells(rowRep, COL_DATA_YEAR) Then
4 cnReport.Cells(i, COL_RES) = cnData.Cells(i, COL_DATA_YEAR) + cnData.Cells(i,
5 COL_BONUS)
6 Else
7 cnReport.Cells(i, COL_RES) = cnData.Cells(i, COL_DATA_YEAR) * cnData.Cells(i,
8 COL_BONUS)
9 End If

It is very difficult to see what this code is doing without stepping through the code with the
debugger and seeing exactly what is happening.

If we rewrite the code above using variables it is much more obvious what it is doing

1 If sRepYear = sDataYear Then


2 lResult = lResult + 1
3 ElseIf sRepYear > sDataYear Then
4 lResult = lResult + lBonus
5 Else
6 lResult = lResult * lBonus
7 End If
8
9 cnReport.Cells(i, COL_RES) = lResult

All we need to do it place the cell values in variables first

1 sRepYear = cnReport.Cells(i, COL_YEAR)


2 sDataYear = cnReport.Cells(i, COL_DATA_YEAR)
3 lBonus = cnReport.Cells(i, COL_BONUS)
4 lResult = cnReport.Cells(i, COL_RES)

Not only is the code more readable, it is much less likely to have errors. If it does have errors
it is much easier to locate them and fix them.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 14

Magic numbers are numbers other than 0 and 1 that appear in the code.

For example, look at this line of code


1 Range("C7") = Total + 5

When we look at this code we have no idea what the number 5 refers to. It could be a bonus
value, a row etc.

If we rewrite the code to use constants it makes the code much clearer
1 Range(RESULT_CELL) = Total + BONUS

We can create constants like this


1 ' Constants
2 Public Const BONUS As Long = 5
3 Public Const RESULT_CELL As String = "C7"

This makes our code easier to read and understand. It also means that if we want to change
the value of BONUS we only have to change it in one place in the code.
Imagine we were changing the value of the number 5 in the code. We would have to search
everywhere that a 5 is used and check if this is being used as the BONUS.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 15

USE THE SANDBOX METHOD TO


6 SOLVE COMPLEX TASKS
In simple terms the Sandbox method means working with code in isolation where it cannot
affect anything or be affected by anything.
Imagine you have been reading up on VBA and you have decided to try out using a
Collection in your application. If you are not familiar with Collections then putting them
straight into your project can waste you considerable time.
Firstly you have to run your full application each time to test what the collection is doing.
The code in your application may affect how the Collection works and the Collection may
affect how the application works.
It makes more sense to create a new workbook and try out the Collection here. It will be
much quicker to run and you can easily test different inputs and outputs.

For example we could take sample code like the following

1 Sub CheckCollection()
2
3 Dim coll As New Collection
4 coll.Add "Apple"
5 coll.Add "Pear"
6
7 coll.Remove (1)
8
9 End Sub

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 16

We can then step through the code using F8. Add we go through the code we check the
Collection values in the Watch Window (see screen shot below).

To add a Watch, simply right-click on a variable and select Add Watch. Then click Ok on
the dialog that appears.
You can then watch the values of your variables as your applications runs.
When you are happy that you understand how the Collection works you can move to the
next stage.
The next stage is to create a simple version of the code you will use in your application. You
can test and update this code until it is close to what you want.
It is then easy to add it to your project. Approaching the problem this way will save you
considerable time and complexity.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 17

MAKE YOUR MACROS TOUGH TO


7 BREAK
We have looked at Syntax and Compile errors. The third type of error is a Runtime error.
These are errors that only occur when you code is running. They depend on something
external to your code.

Some examples of run time errors are:

A file cannot be found

Cell value is text instead of a number

The worksheet is not the one you expected

No data is available for a particular selection

In the above examples, your code may be fine but due to circumstances beyond your control
you may get an error.
Just because you cannot control these type of scenarios doesnt mean you should ignore
them.
It is good practice to write code to handle these types of events. Lets have a look at some
code examples.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 18

In the following code we check if a file exists


1 ' Check if the file exists
2 If Dir(sFilename) = "" Then
3 MsgBox "Could not find the workbook: [" & sFilename & "]."
4 Exit Sub
5 End If

If the Dir function returns an empty string then we know that the file does not exist. In this
case, we give a message to the user and exit the sub.
If the file is found then you can continue on and open the workbook
1 ' Open Workbook
2 Dim wkBook As Workbook
3 Set wkBook = Workbooks.Open(Filename:="C:\Docs\Data.xlsx",
ReadOnly:=True)

In the following code we are checking if a Collection has entries and informing the user if
there are none
1 ' Check a collection has entries
2 If Coll.Count = 0 Then
3 MsgBox "There are no customers for the current selection."
4 Exit Sub
5 End If

In this case, having no entries is not an error. The issue is this. Imagine the user makes a
selection and there are no entries for their selection choice. If we dont give them a message
it looks like the application is not doing anything. So it is a good idea to point out why no
results were returned.

How do you determine what to check?

Always check files and other obvious items like the connection to a database etc.

Dont overdo it. For example, dont check every cell in a worksheet to see if it is valid.
Pick one or two.

If an error crops up then consider how you would like the application the handle the
situation if it occurs again.

TheExcelVBAHandbook.com @2017 All Rights Reserved.


7 Steps to Creating Professional Quality VBA Macros 19

CONCLUSION
You have seen the 7 Steps that I use when building a VBA application. I use these steps for
every types of application from small to large and complex.
They work! They have been tested time and time again in the most demanding of
environments.
If you use them you will see dramatic improvement in your applications in terms of quality
and speed to create.
I have used these steps to build 10 VBA applications. These applications cover all aspects of
Excel from reports to databases, sending emails, reading data from website and much more.
The applications come with step-by-step guide and fully working application so you can see
exactly how I build them.
I call this package The Excel VBA Handbook. You can find out more about it here

TheExcelVBAHandbook.com @2017 All Rights Reserved.

Das könnte Ihnen auch gefallen