Excel 2007 Visual Basic For Application - VBA PDF
Excel 2007 Visual Basic For Application - VBA PDF
M I C R O S O F T
E X C E L
2 0 0 3
Introduction
T A B L E O F C O N T E N T S
What is a Macro? .................................................................................................................................8 Recording a Macro................................................................................................................................8 Running a Macro..................................................................................................................................10 Relative References...........................................................................................................................10 Assigning a Macro to a Button on a Sheet ................................................................................... 11 Assigning a Macro to a Drawn Object on a Sheet......................................................................12 Assigning a Macro to a Button on a Toolbar ................................................................................12 Customising a Toolbar .......................................................................................................................12 Creating a Toolbar .............................................................................................................................13 Button Image Editor..........................................................................................................................13 Changing a Buttons ScreenTip........................................................................................................14 Exercise 1.............................................................................................................................................15 Answers to Exercise 1.......................................................................................................................16 Question 1 ............................................................................................................................................16 Question 2 ...........................................................................................................................................16 Visual Basic Editor .............................................................................................................................17 Project Explorer.................................................................................................................................17 Procedures ...........................................................................................................................................19 Sub Procedures...................................................................................................................................19 Inserting Comments ..........................................................................................................................19 Printing a Visual Basic Module ........................................................................................................ 20 Exercise 2 ............................................................................................................................................21 Answers to Exercise 2 ..................................................................................................................... 22 Question 1 ........................................................................................................................................... 22 Introduction ....................................................................................................................................... 23 Cells Method....................................................................................................................................... 23 Range Method..................................................................................................................................... 23 Selecting Range Objects ................................................................................................................. 23 Flexible Ranges .................................................................................................................................. 23 Offset Method .................................................................................................................................. 23 Resize Method ................................................................................................................................... 25 Selection, ActiveCell and Activate Methods .............................................................................. 25 Row and Column Properties ............................................................................................................. 25 Rows and Columns Methods............................................................................................................. 25 Address Method................................................................................................................................ 25 End Method......................................................................................................................................... 25 Combining Methods ........................................................................................................................... 26 Virtual Worksheets .......................................................................................................................... 27 Range Contents .................................................................................................................................. 27 Value Property ................................................................................................................................... 28 Formula Property............................................................................................................................... 29 FormulaR1C1 Property ...................................................................................................................... 29
MTC Training Solutions 21/04/2009
Page 3
E X C E L 2 0 0 3 V B A I N T R O D U C T I O N
Techniques for Inserting Values in the Next Blank Row ......................................................... 29 NumberFormat Property ................................................................................................................. 29 Exercise 3 ........................................................................................................................................... 30 Answers to Exercise 3 ......................................................................................................................31 Question 1 ............................................................................................................................................31 Question 2 ...........................................................................................................................................31 Question 3 ...........................................................................................................................................31 Question 4 ...........................................................................................................................................31 Question 5 ...........................................................................................................................................31 Activating a Workbook .................................................................................................................... 32 Activating a Worksheet................................................................................................................... 32 ThisWorkBook.................................................................................................................................... 32 Controlling Objects with their Properties .................................................................................. 34 Setting a Property Value ................................................................................................................. 34 Returning a Property Value ............................................................................................................. 34 Performing Actions with Methods ................................................................................................ 34 Using Methods ................................................................................................................................... 34 Using Named arguments .................................................................................................................. 36 Performing Multiple actions on an Object................................................................................... 37 Exercise 4 ........................................................................................................................................... 38 Answers to Exercise 4 ..................................................................................................................... 39 Question 1 ........................................................................................................................................... 39 Question 2 .......................................................................................................................................... 39 Variables...............................................................................................................................................41 Declaring Variables ............................................................................................................................41 Local, Module-Level and Public Variables..................................................................................... 42 Naming Variables............................................................................................................................... 42 Data Types.......................................................................................................................................... 42 Variant Data ....................................................................................................................................... 42 Specific Data Types ......................................................................................................................... 42 Numeric Data ..................................................................................................................................... 43 Character Data .................................................................................................................................. 43 Date and Time .................................................................................................................................... 44 Boolean................................................................................................................................................. 44 Arrays .................................................................................................................................................. 44 Objects................................................................................................................................................ 45 Constants............................................................................................................................................. 46 Exercise 5 ........................................................................................................................................... 47 Answers to Exercise 5 ..................................................................................................................... 48 Question 6 .......................................................................................................................................... 48 Conditional Control Structures ...................................................................................................... 49 IF...THEN...ELSE ............................................................................................................................... 49 SELECT CASE .................................................................................................................................... 50
http://www.mousetraining.co.uk
Page 4
M I C R O S O F T
E X C E L
2 0 0 3
Introduction
Looping Control Structures .............................................................................................................51 Do...Loop ...............................................................................................................................................51 Repeating Statements While a Condition is True.......................................................................51 Repeating Statements Until a Condition becomes True........................................................... 52 Exiting a Do...Loop Statement from inside the Loop ................................................................ 52 FOR...NEXT......................................................................................................................................... 53 FOR EACH...NEXT............................................................................................................................. 53 Non-Structured Statements.......................................................................................................... 54 GoTo ..................................................................................................................................................... 54 Sub Procedures.................................................................................................................................. 55 Calling Procedures in Another Workbook .................................................................................... 55 Passing Arguments to Subprocedures .......................................................................................... 56 Exercise 6 ........................................................................................................................................... 57 Answers to Exercise 6 ..................................................................................................................... 58 Question 1 ........................................................................................................................................... 58 Question 2 .......................................................................................................................................... 58 Question 3 .......................................................................................................................................... 59 Question 4 .......................................................................................................................................... 60 Introduction ....................................................................................................................................... 63 Built-In Dialog Boxes........................................................................................................................ 63 Predefined Dialog Boxes.................................................................................................................. 63 InputBox Function............................................................................................................................. 63 MsgBox Function ............................................................................................................................... 64 Number and type of button: ........................................................................................................... 65 Icon style: ........................................................................................................................................... 65 Default button: .................................................................................................................................. 66 User-Defined Forms......................................................................................................................... 67 Controls ............................................................................................................................................... 67 Worksheet Forms.............................................................................................................................. 67 Placing Controls.................................................................................................................................. 67 Setting the Properties of a Control.............................................................................................. 68 Cell Links ............................................................................................................................................. 68 Input Ranges....................................................................................................................................... 68 Group Boxes and Option Buttons................................................................................................... 68 Lists and Drop-Down Lists .............................................................................................................. 68 User-Defined Forms......................................................................................................................... 68 Adding Form Controls....................................................................................................................... 69 Form Control Properties .................................................................................................................. 70 Setting Form Control Properties................................................................................................... 70 Data Properties ................................................................................................................................. 70 Form Control Naming Convention................................................................................................... 70 Initialising Form Control Properties ............................................................................................. 70 Control and Dialog Box Events ....................................................................................................... 70
MTC Training Solutions 21/04/2009 Page 5
E X C E L 2 0 0 3 V B A I N T R O D U C T I O N
Displaying and Dismissing a User Form ........................................................................................ 70 Show ..................................................................................................................................................... 70 Unload ...................................................................................................................................................71 Handling Form Controls.....................................................................................................................71 Text Boxes ..........................................................................................................................................71 Option Buttons....................................................................................................................................71 List Boxes and Combo Boxes ...........................................................................................................71 Check Boxes.........................................................................................................................................71 Command Buttons ...............................................................................................................................71 Exercise 7 ........................................................................................................................................... 73 Answers to Exercise 7 ..................................................................................................................... 74 Question 1 ........................................................................................................................................... 74 The Windows Registry ..................................................................................................................... 75 Settings Files ..................................................................................................................................... 75 Declaring Functions and Subs......................................................................................................... 75 Declaring References to DLLs........................................................................................................ 75 WritePrivateProfileString .............................................................................................................. 76 GetPrivateProfileString................................................................................................................... 77 About Toolbars and Menus.............................................................................................................. 79 Attaching Toolbars to Workbooks................................................................................................ 79 Save More Than One Toolbar Configuration............................................................................... 79 Customised Toolbars ........................................................................................................................ 79 Customising a Toolbar ...................................................................................................................... 80 Display...................................................................................................................................................81 ScreenUpdating ..................................................................................................................................81 DisplayAlerts.......................................................................................................................................81 Exercise 8 ........................................................................................................................................... 82 Errors................................................................................................................................................... 83 Types of Errors ................................................................................................................................. 83 Break Mode......................................................................................................................................... 83 Setting Breakpoints.......................................................................................................................... 83 Instant Watch ................................................................................................................................... 83 Stepping .............................................................................................................................................. 84 Error Handling ................................................................................................................................... 84 On Error Goto Label ......................................................................................................................... 84 Resume and Resume Next ............................................................................................................... 84 On Error Goto 0................................................................................................................................. 84 Err Function........................................................................................................................................ 84 Error() Function................................................................................................................................. 84 Error and Err Statements .............................................................................................................. 84 Error Handling Example ................................................................................................................... 84 Worksheet Object Events .............................................................................................................. 87 Workbook Object Events................................................................................................................ 87
http://www.mousetraining.co.uk
Page 6
M I C R O S O F T
E X C E L
2 0 0 3
Introduction
Introduction ....................................................................................................................................... 89 User-Defined Functions................................................................................................................... 89 Function Wizard ................................................................................................................................ 90 Excel Functions.................................................................................................................................. 90 Exercise 9 ............................................................................................................................................91 Answers to Exercise 9 ..................................................................................................................... 92 Question 2 .......................................................................................................................................... 92 Question 3 .......................................................................................................................................... 92 Creating an Add-In ........................................................................................................................... 93 Exercise 10 ......................................................................................................................................... 93 User Form Controls........................................................................................................................... 95 Memory Variables.............................................................................................................................. 96
Page 7
E X C E L 2 0 0 3 V B A I N T R O D U C T I O N
A macro is a sequence of instructions that can be automatically executed in order to automate frequent or complicated tasks. Macros are written in a programming language called Visual Basic and can be created by recording a task or by writing the Visual Basic program or by a combination of the two. Macros can be added to menus, assigned to keys or buttons or made to run automatically.
Recording a Macro
A macro can be easily created by instructing Excel to record a series of routine actions. This is very useful for repetitive tasks.
http://www.mousetraining.co.uk
Page 8
M I C R O S O F T
E X C E L
2 0 0 3
Introduction
To record a macro:
Mouse 1. Choose Tools from the menu bar, then Macro, Record New Macro.
2. 3. 4. 5. 6.
In the text box, type a name for the macro. The macro name can contain letters, numbers and underscores; it must begin with a letter. The name cannot contain spaces or punctuation marks. Type a brief description of the macro in the default description.
Macro name
box. The To run the macro with a shortcut key type a letter in the shortcut will be assigned to [CTRL]+[letter]. Hold [SHIFT] while typing the letter in the Shortcut key box to assign the shortcut to [CTRL]+[SHIFT]+[letter]. Choose the OK button to start recording the macro.
7. 8. 9.
The Stop Recording toolbar appears on the screen, and the word Recording appears in the status bar. Perform the actions that are to be recorded. Click the Stop Recording button from the Stop Recording toolbar or choose Tools, Macro, Stop Recording, when the macro is finished.
http://www.mousetraining.co.uk
Page 9
E X C E L 2 0 0 3 V B A I N T R O D U C T I O N
Running a Macro
To run a macro:
Keyboard 1. If a shortcut key was assigned to the macro, then press the shortcut key. Or 2. 3. Choose Tools, Macro, Macros or press [ALT]+[F8]. Type the macro name or select it from the list. Choose the Run button.
Relative References
If the relative reference option is not chosen the macro records the actual cell references and will always operate on those fixed cells, regardless of which cell is active when the macro is initiated. The following macro selects the range B3 to C5:
Sub SelectAbsolute() Range("B3:C5").Select End Sub
If a macro is recorded using relative references, cell references are recorded relative to the previously active cell. The macro then operates on cells relative to the cell that is active when the macro is initiated. The following macro selects a single cell, one row beneath the starting cell:
Sub SelectRelative() ActiveCell.Offset(1, 0).Range("A1").Select End Sub
When recording a macro, click the Relative References button on the Stop Recording toolbar. By default, Excel records in absolute mode. Recording can be switched from absolute to relative, and vice versa, during the same recording process. See also The Range Object page 23.
http://www.mousetraining.co.uk
Page 10
M I C R O S O F T
E X C E L
2 0 0 3
A button can be created on a worksheet and a macro assigned to it. The macro will be available whenever the workbook is open.
http://www.mousetraining.co.uk
Page 11
E X C E L 2 0 0 3 V B A A S S I G N I N G M A C R O S
T O
O B J E C T S
) ) ) )
Select the button by holding down [CTRL] and clicking the left mouse button. Alter the button text by typing new text. Change the font or alignment of the button text by choosing Format Control from the shortcut menu. Assigning a Macro to a Drawn Object on a Sheet Macros can be assigned to any worksheet object by choosing Assign Macro from the objects shortcut menu. Assigning a Macro to a Button on a Toolbar
If a macro is assigned to a button on a toolbar, the macro is available at any time and for every sheet in the workbook, provided the toolbar is displayed. The workbook containing the macro is automatically opened, if it is not already open, when the button is clicked from another workbook, provided that files name has not been changed or the file moved to another folder (see page 79). A macro is usually assigned to an unused custom button, but can be assigned to a built in button overriding the buttons normal function.
Customising a Toolbar
Change, or customise, a toolbar so it contains buttons for most often used commands or macros.
http://www.mousetraining.co.uk
Page 12
M I C R O S O F T
E X C E L
2 0 0 3
2. 3. 4. 5.
Categories list box, select Macros. Drag the Custom Button from the Commands list box over the toolbar and then
From the release the mouse. To select a different button image for the new button, right-click the new button and choose Change Button Image. Select a button image. Choose the Close button.
Creating a Toolbar
Buttons can only be added to existing toolbars. It may be necessary to create a new toolbar before adding a button to it.
Toolbars
3.
http://www.mousetraining.co.uk
Page 13
E X C E L 2 0 0 3 V B A A S S I G N I N G M A C R O S
T O
O B J E C T S
3. To edit the existing image, select a colour and fill the pixels of the image. 4. To draw a new button image, choose the Clear button and then follow step 3. Images can also be copied and pasted from other buttons or graphics applications.
http://www.mousetraining.co.uk
Page 14
M I C R O S O F T
E X C E L
2 0 0 3
Assigning Macros to Objects Exercise 1 1. Record the command Edit Clear Formats as a macro named ClearFormat to clear the formatting from a selection of cells. Assign the macro to the shortcut key combination [CTRL]+[SHIFT]+[f]. Assign the macro to a custom button on a customised toolbar. 2. 3. Assign the macro to a button on a worksheet. Record a macro named Address to enter the first three lines of an address in consecutive cells in a column. Record the macro using relative cell references. Save the workbook containing the macros as EXERCISE 1.XLS.
http://www.mousetraining.co.uk
Page 15
E X C E L 2 0 0 3 V B A A S S I G N I N G M A C R O S
T O
O B J E C T S
Question 1
Answers to Exercise 1
Sub Address() ActiveCell.FormulaR1C1 = "XYZ Company" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "Any Street" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "Any Town" End Sub
http://www.mousetraining.co.uk
Page 16
M I C R O S O F T
E X C E L
2 0 0 3
Editing Macros
Project Explorer
The Project Explorer displays a hierarchical list of the projects and all of the items contained in and referenced by each of the projects. VBAPROJECT The name of an open workbook. MICROSOFT EXCEL OBJECTS The worksheets and chartsheets contained in the VBAProject. The event procedures (see page 87) for each sheet and the workbook are stored here. FORMS Any user defined forms. MODULES Recorded and written procedures. CODE WINDOW Use the Code window to write, display and edit Visual Basic code. Open as many Code windows as there are modules; view the code in different forms or modules and copy and paste between them. Open a Code window from the Project window, by double-clicking a form or module. Drag selected text to: A different location in the current Code window. Another Code window.
http://www.mousetraining.co.uk
Page 17
E X C E L 2 0 0 3 V B A E D I T I N G M A C R O S
The Immediate and Watch windows. The Recycle Bin. OBJECT BOX
Displays the name of the selected object. Click the arrow to the right of the list box to display a list of all objects associated with the form. PROCEDURES/EVENTS BOX Lists all the events recognised by Visual Basic for a form or control displayed in the Object box. When an event is selected, the event procedure associated with that event name is displayed in the Code window. If (General) is displayed in the Object box, the Procedure box lists any declarations and all of the general procedures that have been created for the form. If editing module code, the Procedure box lists all of the general procedures in the module. In either case, the procedure selected in the Procedure box is displayed in the Code window. All the procedures in a module appear in a single, scrollable list that is sorted alphabetically by name. Selecting a procedure using the drop down list boxes at the top of the Code window moves the cursor to the first line of code in the procedure selected. SPLITBAR Dragging the Split bar down, splits the Code window into two horizontal panes, each of which scrolls separately. View different parts of code at the same time. The information that appears in the Object box and Procedures/Events box applies to the code in the pane that has the focus. Dragging the bar to the top or the bottom of the window or double-clicking the bar closes a pane. MARGIN INDICATOR BAR A grey area on the left side of the Code window where margin indicators are displayed. Margin indicators provide visual cues during code editing.
http://www.mousetraining.co.uk
Page 18
M I C R O S O F T
E X C E L
2 0 0 3
A procedure is a series of statements of Visual Basic code stored in a module of a Visual Basic project. When a macro is recorded Excel writes a procedure. The code can be modified and special Visual Basic commands can be included to allow user interaction, conditional testing, looping and other options. Each procedure is identified by a name that is written at the top of the procedure. There are two types of procedures, Sub procedures and Function procedures.
Sub Procedures
Sub procedures perform actions. A macro is a recorded Sub procedure. A Sub procedure is enclosed by Sub and End Sub statements, the Sub statement contains the macro name:
Sub Macro1 () Commands End Sub
The macro name is followed by brackets. The brackets may contain variable data called arguments.
Inserting Comments It is very important to put explanatory comments into a macro as it will make the macro easier to read and debug. Comment text can be placed in a line on its own or following a macro statement. Comment text is prefixed by an apostrophe. The apostrophe tells Visual Basic to ignore the text that follows it and to continue execution with the statement on the next line. Comment text normally appears in a green font, but this style can be altered.
http://www.mousetraining.co.uk
Page 19
E X C E L 2 0 0 3 V B A E D I T I N G M A C R O S
4.
http://www.mousetraining.co.uk
Page 20
M I C R O S O F T
E X C E L
2 0 0 3
Editing Macros Exercise 2 1. 2. 3. Edit the Address macro recorded in Exercise 1 so that it makes the first line of the address bold. Insert any comments necessary in any macros already recorded. Resave the workbook as EXERCISE1.XLS.
http://www.mousetraining.co.uk
Page 21
E X C E L 2 0 0 3 V B A E D I T I N G M A C R O S
Question 1
Answers to Exercise 2
Sub Address() ActiveCell.FormulaR1C1 = "XYZ Company" Selection.Font.Bold = True ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "Any Street" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "Any Town" End Sub
http://www.mousetraining.co.uk
Page 22
M I C R O S O F T
E X C E L
2 0 0 3
Range(A1:B2).Select Range(Cells(1,1),Cells(2,2)).Select
MULTIPLE SELECTIONS USING THE CELLS METHOD MUST ALSO USE THE UNION METHOD. Flexible Ranges
Offset Method
The Offset method takes one Range object and calculates a new Range object from it.
http://www.mousetraining.co.uk
Page 23
E X C E L 2 0 0 3 V B A T H E R A N G E O B J E C T
The Offset method has two arguments: the number of rows to move the selection down or up and the number of columns to move the selection right or left.
Range("C3:D4").Offset(-2,-2).Select
Range("C3:D4").Offset(2,2).Select
http://www.mousetraining.co.uk
Page 24
M I C R O S O F T
E X C E L
2 0 0 3
Resize Method
The Resize method also takes one Range object and calculates a new Range object from it. However, instead of moving the range, it changes the ranges size. The Resize method has two arguments: the number of rows for the new selection and the number of columns for the new selection.
Range("A1:B2").Resize(3,4).Select
Selection, ActiveCell and Activate Methods
The Selection method returns the currently selected range. The ActiveCell method returns the active cell within the current selection. If the current selection consists of only one cell, then the Selection method and ActiveCell method return the same object. The Activate method activates a single cell within the current selection.
Returns the number of the first row or column of a range. In the following example, FirstRow would equal 2 and FirstColumn would equal 3 so long as the active cell was in the region C2:E5. CurrentRow would equal 4 and CurrentColumn would equal 4 if the active cell was D4:
Sub FirstRowColumn() FirstRow = ActiveCell.CurrentRegion.Row CurrentRow=ActiveCell.Row FirstColumn = ActiveCell.CurrentRegion.Column CurrentColumn=ActiveCell.Column End Sub
Rows and Columns Methods
Returns a single row or column or a collection of rows and columns.
Rows(3).Delete Deletes the third row of the worksheet. Selection.Columns.Count Returns the number or columns in the current selection.
Address Method
Returns the range reference, as a string. The following examples assume the active cell is A1:
RETURNING TO THE STARTING CELL If a procedure uses a method to offset or resize a selection it is often useful to be able to return to the cell which was active before the procedure was run. To do this use the Address method of the active cell:
http://www.mousetraining.co.uk
Page 25
E X C E L 2 0 0 3 V B A T H E R A N G E O B J E C T
Combining Methods
Statement: Selection.Offset(1,0).Select Selection.Resize(Selection.Rows.Count+1).Select Selection.Offset(0,3).Resize(4,5).Select Selection.Offset(1,0).Activate Range(ActiveCell , _ ActiveCell.End(xlDown).End(xlToRight)).Select Description Moves the current selection down one row. Increases the current selection by one row. Move the current selection 3 columns to the right and resize it to 4 rows by 5 columns. Move the active cell to the next row in the selection. Extends the selection from the active cell to the bottom right corner of the region.
http://www.mousetraining.co.uk
Page 26
M I C R O S O F T
E X C E L
2 0 0 3
Virtual Worksheets
A Range object is a virtual worksheet. Cells can be referred to relative to the Range object, which need not necessarily coincide with the real worksheet.
(B)
(C)
http://www.mousetraining.co.uk
Page 27
E X C E L 2 0 0 3 V B A T H E R A N G E O B J E C T
Value Property
Use the Value property to assign or return text or numbers to or from a range. Statement: Description Range(A1).Value = Ability Assigns the text Ability to the cell A1. Range(A1).Value = 25 Assigns the number 25 to the cell A1. Selection.Value = 10 Assigns the number 10 to each of the cells in the current selection. ActiveCell.Value = Ability Assigns the text Ability to the active cell. AnyVariable = ActiveCell.Value Returns the contents of the active cell to the variable AnyVariable. ActiveCell.Value = Range(A1).Value Returns the contents of cell A1 and assigns it to the active cell.
http://www.mousetraining.co.uk
Page 28
M I C R O S O F T
E X C E L
2 0 0 3
Formula Property
Use the Formula property to return a formula from a range. Use either the Value or Formula property to assign a formula to a range. Statement: Description AnyVariable = ActiveCell.Formula Returns the formula in the active cell to the variable AnyVariable. Selection.Value = =A1*2 Assign the formula =A1*2 to the current selection. N.B. As the cell reference is relative, then only the first cell in the selection will actually contain =A1*2. Selection.Value = =$A$1*2 Assign the formula =$A$1*2 to the current selection. N.B. As the cell reference is absolute, each of the cells in the selection will actually contain =$A$1*2. IF A CELL CONTAINS A FORMULA AND IT IS RETURNED WITH THE VALUE PROPERTY THEN THE VALUE OF THE FORMULA IS RETURNED AND NOT THE FORMULA ITSELF.
FormulaR1C1 Property
Use the FormulaR1C1 property to return a formula from a range. Use either the Value or FormulaR1C1 property to assign a formula to a range. Statement: Description Selection.Value = =r1c1*2 Same result as using Selection.Value ==$A$1*2 Selection.Value = =r[-1]c*2 Assigns a formula that multiplies the contents of the cell above in the selection, by 2. Selection.Value = =sum(rc[-5]:rc[-1])" Assigns a formula that sums the five cells to the right of each cell in the selection.
NextRow = Application.CountA(Sheets(1).Columns("A:A")) Set CurrentRow = Sheets(1).Range("A1").Offset(NextRow) CurrentRow.Offset(0, 0) = "Ability" CurrentRow.Offset(0, 1) = "Bristol" CurrentRow.Offset(0, 2) = "0117 914 9400"
This technique counts the number or rows in the region surrounding A1:
NextRow = Sheets("Data").Range("A1").CurrentRegion.Rows.Count Set CurrentRow = Sheets(1).Range("A1").Offset(NextRow) CurrentRow.Offset(0, 0) = "Ability" CurrentRow.Offset(0, 1) = "Bristol" CurrentRow.Offset(0, 2) = "0117 914 9400"
NumberFormat Property
Use the NumberFormat property to set or return the numeric format of a range.
http://www.mousetraining.co.uk
Page 29
E X C E L 2 0 0 3 V B A T H E R A N G E O B J E C T
Exercise 3 1. 2. 3. 4. 5. Write a procedure to increase the size of the current selection by one row and one column. Write a procedure to activate the last cell in the current selection. Write a procedure to select the current region and then resize the selection so as not to include the first row and first column. Write a procedure to select the current column of the current region. Write a procedure to sum a column of numbers and extend the selection to include the total at the bottom.
http://www.mousetraining.co.uk
Page 30
M I C R O S O F T
E X C E L
2 0 0 3
Question 1
Sub SumCol() ActiveCell.Offset(Selection.Rows.Count).Value = _ "=sum(r[-" & Selection.Rows.Count & "]c:r[-1]c)" Selection.Resize(Selection.Rows.Count + 1).Select End Sub
http://www.mousetraining.co.uk
Page 31
E X C E L 2 0 0 3 V B A W O R K B O O K S A N D
S H E E T S
Workbooks("MyBook.xls").Activate
Activating a Worksheet The following example activates Sheet1 in the workbook MyBook.xls:
Workbooks("MyBook.xls").Worksheets("Sheet1").Activate
The following example selects cells A1:C3 on Sheet1 and then makes cell B2 the active cell:
ThisWorkbook.UserForm1.Show
The following example closes the workbook that contains the example code:
ThisWorkbook.Close
http://www.mousetraining.co.uk
Page 32
M I C R O S O F T
E X C E L
2 0 0 3
For example, a cell can be tested to see if it is empty by returning the value property. If it is not empty the cell can be cleared using the ClearContents method. A new formula can entered into the cell by setting the value property.
Sub TestEmpty() If IsEmpty(ActiveCell.Value) Then ActiveCell.Value = 10 Else ActiveCell.ClearContents End If End Sub
http://www.mousetraining.co.uk
Page 33
E X C E L 2 0 0 3 V B A O B J E C T S , P R O P E R T I E S
A N D
M E T H O D S
An object is changed by changing its property. The current property value can be tested and a new value for the property can be set. A property is usually one of the following: A numeric value A character string A True or False value A property is referred to in a statement as:
Object.Property
To set a new value for the property, use the following statement:
Object.Property = expression
The current property of a value can be returned and is usually assigned to a variable for further testing using the following statement:
variable = Object.Property
For example:
row_height = ActiveCell.RowHeight
A property can be set using the value of another property without assigning to a variable in between. For example, to assign the value in the current active cell into cell C1 on the current worksheet:
Cells(1, 3).Value = ActiveCell.Value
Performing Actions with Methods
A method performs an action on an object. For example, Clear is a method that can be applied to clear the contents of a range of cells. Certain methods can also return values, for example the CheckSpelling method which performs a spell check on a range of cells, also returns the value True or False depending on whether the text is spelt correctly.
Using Methods
As well as possibly returning values a method may require certain arguments, this is referred to as the method taking arguments. The syntax of the statement depends on whether a method takes arguments: A method that doesnt take arguments is written:
Object.Method
M I C R O S O F T
E X C E L
2 0 0 3
For example to name a selection of cells using the labels in the top cell of the selection:
Selection.CreateNames True, False, False, False
For example to save the result of the InputBox method in a variable called SalesData:
SalesData =InputBox ("Enter the sales data")
http://www.mousetraining.co.uk
Page 35
E X C E L 2 0 0 3 V B A O B J E C T S , P R O P E R T I E S
A N D
M E T H O D S
Some methods take several arguments some of which are optional and can be omitted. For example the CreateNames method has four arguments most of which can be omitted in normal use. The method can be written to just include the relevant arguments but this is not always very clear:
Selection.CreateNames True
It may be preferable to write the method statement using named arguments:
Selection.CreateNames Top:=True
Named arguments allow the method to be written with any of the required arguments in any order. The value is assigned to the named argument using the := operator. They make the code much easier to understand and are less prone to error than an argument list where the arguments must be in the correct order and may be accidentally omitted.
http://www.mousetraining.co.uk
Page 36
M I C R O S O F T
E X C E L
2 0 0 3
It may be necessary for a procedure to perform several different actions on the same object. For example, the following may need to be performed to the active cell:
ActiveCell.Formula = "=NOW()" ActiveCell.NumberFormat = "dd/mm/yy" ActiveCell.Font.Name = "Arial" ActiveCell.Font.Bold = True ActiveCell.Font.Size = 14
Because all the statements refer to the same object, it is possible to use the With statement to indicate that a series of statements are all to be performed to one object:
With ActiveCell .Formula = "=NOW()" .NumberFormat = "dd/mm/yy" .Font.Name = "Arial" .Font.Bold = True .Font.Size = 14 End With
The With statement makes the code easier to write, easier to read and is more efficient when running the macro. With statements can be nested and the above example could be written as:
With ActiveCell .Formula = "=NOW()" .NumberFormat = "dd/mm/yy" With .Font .Name = "Arial" .Bold = True .Size = 14 End With End With
http://www.mousetraining.co.uk
Page 37
E X C E L 2 0 0 3 V B A O B J E C T S , P R O P E R T I E S
A N D
M E T H O D S
Exercise 4 1. 2. Record a macro named SystemDate to enter the system date in the active cell, format it to a suitable date format, change the font to Arial 10 and AutoFit the column width. Edit the SystemDate macro to include better use of the With statement.
http://www.mousetraining.co.uk
Page 38
M I C R O S O F T
E X C E L
2 0 0 3
Question 1
Sub SystemDate() ActiveCell.FormulaR1C1 = "=NOW()" With Selection.Font .Name = "Arial" .FontStyle = "Regular" .Size = 10 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlNone .ColorIndex = xlAutomatic End With Selection.NumberFormat = "dd-mmm-yy" Selection.EntireColumn.AutoFit End Sub
Question 2
Sub SystemDate() ActiveCell.Formula = "=NOW()" With Selection With .Font .Name = "Arial" .Size = 10 End With .NumberFormat = "dd-mmm-yy" .EntireColumn.AutoFit End With End Sub
http://www.mousetraining.co.uk
Page 39
M I C R O S O F T
E X C E L
2 0 0 3
A variable is a piece of information that is stored while a procedure is running. Once the information has been stored the variable can be referred to many times within the procedure. Each variable in a procedure is referred to by a unique name.
Declaring Variables
Variables that are to be used in a procedure are usually declared at the start of that procedure in order to identify them and the type of data that they will hold. In Visual Basic it is not necessary to declare variables, but by doing so it is possible to speed up the procedure, conserve memory and prevent errors from occurring. Because variables do not have to be declared Visual Basic assumes any variable that has not yet been used to be a new variable. This means that a misspelt variable name will not be recognised as such by Visual Basic. This problem can be avoided by choosing to explicitly declare every variable. This tells Visual Basic that every variable will be declared in advance and any others used are therefore wrong. When Visual Basic encounters an undeclared variable the following message is displayed:
To do this the following statement must be placed at the top of the Visual Basic module:
Option Explicit
The variable exists until the end of the procedure is met. To save time the Option Explicit setting can be automatically set in all modules.
http://www.mousetraining.co.uk
Page 41
E X C E L 2 0 0 3 V B A V A R I A B L E S A N D C O N S T A N T S
1. In the Visual Basic Editor, choose Tools Options. 2. Select the Editor tab. 3. Select Require Variable Declaration. 4. Choose the OK button. THIS COMMAND DOES NOT ADD OPTION EXPLICIT TO EXISTING MODULES, ONLY TO NEW ONES.
It is possible to declare variables without using Option Explicit. However, Visual Basic does not then notify any undeclared variables.
Local, Module-Level and Public Variables
A local variable is declared within a procedure and is only available within that procedure. A module-level variable is available to all procedures in the module in which it is declared, but not to any other modules. Module-level variables are created by placing their Dim statements at the top of the module before the first procedure. A public variable is available to every procedure in every module. Public variables are created by using the Public statement instead of the Dim statement and placing the declarations at the top of a module before the first procedure. To conserve memory, declare variables at the lowest level possible, e.g. do not declare a variable as public or module-level if local is sufficient.
Naming Variables
See Appendix A for a recommended variable naming convention. Data Types
The data type of a variable determines what type of data the variable can hold. For example a variable could hold an integer, a string or a date. The data type is specified in the Dim statement:
Dim variable As type
If no type is specified the variable will be given the Variant data type.
Variant Data
A Variant variable can hold numeric data, character text or a date. It can hold different types of data at different points in the same procedure. The current data type of the variable depends on the last value assigned to the variable.
Dim Anydata Anydata = "30" Anydata = Anydata - 12 Anydata = Anydata & "XYZ" Assumes Anydata Anydata Anydata Variant variable contains the string "30" becomes numeric and contains 18 is a string containing "18XYZ"
There is no need to convert the data type before performing a calculation on the variable, however it would not be possible to perform an arithmetic operation on the variable if it does not contain data that is easily interpreted as a number, for example 18XYZ
Specific Data Types
If a specific data type is assigned to a variable, the variable will only be able to hold that type of data. This can make a procedure easier to write and decode as it will always be known what the restrictions are for that variable.
http://www.mousetraining.co.uk
Page 42
M I C R O S O F T
E X C E L
2 0 0 3
Numeric Data
There are several different data types that can be specified to hold numeric data: Integer, Long, Single, Double and Currency. Integer and Long variables hold whole numbers. Integer variables can hold values between -32,768 and 32,767. Long variables can hold values between 2,147,483,648 and 2,147,483,647. Integers store less memory than variants and operations can be performed faster. Single, Double and Currency variables can hold whole or part numbers. Single and Double variables are held as floating point and are used for very large or very small numbers. They have much larger ranges than currency but may incur small rounding errors. Single variables can hold values between -3.402823E38 and -1.401298E-45 for negative values and between 1.401298E-45 and 3.402823E38 for positive values. Double variables can hold values between -1.7200369313486232E308 and -4.94065645841247E-324 for negative values and between 4.94065645841247E-324 and 1.7200369313486232E308 for positive values. Currency variables hold the data as fixed point. This provides complete accuracy and is particularly useful for additions and subtractions but may not be so efficient for multiplication and division involving very large or very small numbers. Currency variables can have up to 15 figures to the left of the decimal point, and up to 4 figures to the right. Currency variables can 922,337,203,685,477.5808.
Character Data
hold
values
between
-922,337,203,685,477.5808
and
A variable that is to hold character information is declared as String. String variables can hold up to 65,535 characters. By default a string variable is of variable length and the length of the variable depends on the length of the string of data that is stored in it. Strings can be declared to have a fixed length:
Dim variable As String * size
If the data string that is assigned to the name variable is longer than 50 characters, the data is truncated. If the data string that is assigned to the name variable is shorter than 50 characters, the rest of the variable is filled with blanks.
http://www.mousetraining.co.uk
Page 43
E X C E L 2 0 0 3 V B A V A R I A B L E S A N D C O N S T A N T S
Dates and times are held in variables that are of Date type. They are held as numbers. The number to the left of the decimal point represents the date and the number to the right of the decimal point represents the time. Midnight is 0, and midday is 0.5. Any recognisable literal date or time can be assigned to a date variable, enclosed in # symbols. For example:
Dim AnyDate As Date AnyDate = #25/6/94 13:20# AnyDate = #January 12, 1994 3:15am# AnyDate = #15 March 1994# AnyDate = #16:15#
Date variables can hold dates between January 1 0100 and December 31 9999, and times between 0:00:00 and 23:59:59.
Boolean
Boolean variables hold either True or False. This is useful when something has only two possible values. Instead of testing for the specific values, the Boolean variable can be set to true or false and its value tested at any necessary point in the procedure. True and False values are often implied:
If Male Then If Not Male Then Tests if Male is equal to True Tests if Male is equal to False
Arrays
An array is a special type of variable that can contain many elements of information simultaneously. If an array is declared with a specific data type then every element in the array must be of that type. However it is possible to declare an array of variant variables. An array can have fixed dimensions, in which case the number of elements that the array can contain is included in the declaration or the array can be dynamic and the size reset when required in the procedure To declare an array:
Dim variable (dimension) As Type
The following creates an array called AnArray that has 15 variant variables contained within it:
Dim AnArray (14)
The specified dimension is the upper bound of the array. By default the lower bound of an array is 0 and thus the array has 15 elements. This is called a zero-based array. It is possible to change the default lower bound by using the Option Base command before any declaration in a module. For example the following statement would make the lower bound equal to 1:
Option Base 1
Alternatively, the lower bound can be provided when declaring the array using the To keyword:
http://www.mousetraining.co.uk
Page 44
M I C R O S O F T
E X C E L
2 0 0 3
The array size can then be set at an appropriate point in the procedure using the ReDim statement, perhaps using the value of another variable. The following sets the size of the array to be the value of the variable NumberFound:
ReDim AnArray (1 To NumberFound)
Using the optional keyword Preserve after ReDim preserves the data in an existing array when it is redimensioned. Data is assigned to or returned from an array element by referring to the elements position within the array. The following sets the second element of AnArray to hold the number 56:
AnArray (2) = 56
An array can have up to 60 dimensions.
An Object variable can have objects assigned to it using the Set statement. This can make a procedure easier to read and quicker to write. The following assigns a worksheet object to a variable:
Dim Sales As Object Set Sales = Worksheets("Sales")
http://www.mousetraining.co.uk
Page 45
E X C E L 2 0 0 3 V B A V A R I A B L E S A N D C O N S T A N T S
Constants A constant is a named item that retains a constant value throughout the execution of a program, as opposed to a variable, whose value can change during execution. Constants are defined using the Const statement. Constants can be used anywhere in procedures in place of actual values. A constant may be a string or numeric literal, another constant, or any combination that includes arithmetic or logical operators except Is. For example:
http://www.mousetraining.co.uk
Page 46
M I C R O S O F T
E X C E L
2 0 0 3
Variables and Constants Exercise 5 1. 2. Start a new workbook. Enter the following data on a worksheet:
A 1 2 3 4
3. 4. 5. 6.
B Week1
C Week2
D Week3
E Week4
7. 8.
http://www.mousetraining.co.uk
Page 47
E X C E L 2 0 0 3 V B A V A R I A B L E S A N D C O N S T A N T S
Question 6
Answers to Exercise 5
Option Explicit Sub InputSales() Dim MonthOfSales As String Dim SalesData(1 to 4) MonthOfSales = InputBox(prompt:= "Enter month of title:= "Month") SalesData(1) =InputBox(prompt:= "Enter sales for SalesData(2) =InputBox(prompt:= "Enter sales for SalesData(3) =InputBox(prompt:= "Enter sales for SalesData(4) =InputBox(prompt:= "Enter sales for Range("A1").Value = UCase(MonthOfSales) Range("B2:E2").Cells(1).Value = SalesData(1) Range("B2:E2").Cells(2).Value = SalesData(2) Range("B2:E2").Cells(3).Value = SalesData(3) Range("B2:E2").Cells(4).Value = SalesData(4) Range("B2:E2").NumberFormat = "0.00" Columns("A:E").EntireColumn.AutoFit End Sub
http://www.mousetraining.co.uk
Page 48
M I C R O S O F T
E X C E L
2 0 0 3
Control Structures
Conditional control structures perform a block of statements depending upon the result of a condition.
IF...THEN...ELSE
The syntax of the If...Then...Else control structure is:
If condition Then statements to perform if condition is true Else statements to perform if condition is false End If When Visual Basic meets the If statement it evaluates the condition as true or false. If the condition is evaluated as true, execution of the procedure continues with the statements following the If until the Else statement is met. At this point execution continues from the command after the End If statement. If the condition is evaluated as false Visual Basic looks for the Else statement and continues execution from the command after the Else statement until it meets the End If statement. At this point execution continues from the command after the End If statement. Only one set of statements is performed. The Else part of the structure is optional and may not always be necessary in which case the structure would be: If condition Then Statements to perform if condition is true End If In this instance the statements will only be performed if the condition is true otherwise execution continues with statements after the End If statement.
http://www.mousetraining.co.uk
Page 49
E X C E L 2 0 0 3 V B A C O N T R O L S T R U C T U R E S
If only one statement needs to be executed when the condition is true, the control structure can be written as: If condition Then single statement to perform if condition is true If several conditions are to be tested a series of ElseIf statements can be included: If condition1 Then Statements to be performed if condition1 is true ElseIf condition2 Then Statements to be performed if condition2 is true ElseIf... ... Else Statements to be performed if none of the conditions are true End If Visual Basic evaluates condition1. If condition1 is true Visual Basic executes the statements following the If statement until it meets an ElseIf, Else or End If statement at which point control is passed to the statements below the End If. If condition1 is not true Visual Basic evaluates condition2, repeating the above procedure, and so on until a condition is found to be true. If no conditions are true the statements after the Else statement are executed, if it exists.
SELECT CASE
Select Case can be used as an alternative to If...Then...ElseIf where several conditions are to be tested. For Select Case the same expression has to be evaluated in every instance whereas for If...Then...ElseIf each condition can involve different variables. The syntax of the Select Case control structure is: Select Case expression Case value1 statements Case value2 statements ... Case Else statements End Select A single expression is evaluated at the top of the Case structure. Each case is then checked for this value, and the appropriate statements executed. Control then passes to the statement below the End Select statement. If no Case statement holds the evaluated value then the statements below the Case Else statements are executed. Case Else is optional.
http://www.mousetraining.co.uk
Page 50
M I C R O S O F T
E X C E L
2 0 0 3
Do...Loop
Use Do...Loop statements to run a block of statements an indefinite number of times. The statements are repeated either while a condition is True or until a condition becomes True.
There are two ways to use the While keyword to check a condition in a Do...Loop statement: Check the condition before entering the loop. If the condition is False the contents of the loop will never execute. The syntax for this loop would read:
In the following example the contents of the loop would only execute if the variable intResponse had an initial value of vbYes and will continue to execute while that value remains vbYes:
Do
http://www.mousetraining.co.uk
Page 51
E X C E L 2 0 0 3 V B A C O N T R O L S T R U C T U R E S
In the following example the contents of the loop would execute unless the variable intResponse had an initial value of vbNo and will continue to execute until that value becomes vbNo:
Do
http://www.mousetraining.co.uk
Page 52
M I C R O S O F T
E X C E L
2 0 0 3
Control Structures
FOR...NEXT
The For...Next control structure allows a series of statements to be repeated a given number of times. The syntax of the For...Next structure is: For counter = start To end [Step step] statements Next The structure repeats the statements for a number of times depending on the values of start, end and step. Counter is a variable containing a number. The initial value of counter is set equal to start. Each time the block of statements is executed counter is incremented by the value of step. Step can be positive or negative. If step is positive the statements will be executed provided the value of counter is less than or equal to the value of end, otherwise execution continues with the statements after the Next statement. If step is negative the statements will be executed provided the value of counter is greater than or equal to the value of end, otherwise execution continues with the statements after the Next statement. Step has a default value of 1.
FOR EACH...NEXT
The syntax of the For Each...Next structure is: For Each element In group statements Next The Structure repeats the statements for each element in an array or collection The following example converts every cell in the selection to upper case by using the Excel function UCase:
Sub UpperCase() Dim objCell as Object For Each objCell In Selection objCell.Value = UCase(objCell.Formula) Next End Sub
http://www.mousetraining.co.uk
Page 53
E X C E L 2 0 0 3 V B A C O N T R O L S T R U C T U R E S
The following example names all the worksheets in the active workbook Week 1, Week 2 etc.:
Sub NameSheets() Dim intCount as Integer Dim objSheet as Object intCount = 1 For Each objSheet in Worksheets objSheet.Name = "Week " & intCount intCount = intCount + 1 Next End Sub
The For Each...Next structure is particularly useful for referring to collections of controls in user-defined forms.
The Exit For statement can be used any number of times within a For...Next structure or a For Each...Next structure allowing another way out of the loop. On meeting the Exit For command, execution is continued with the statements after the Next statement.
Non-Structured Statements
Exit For
GoTo
The GoTo statement causes the programme flow to branch unconditionally to a specified line within the same procedure. Lines are indicated by means of a label; a piece of text followed by a [:] (colon).
Sub TestBranch() ... If Number = 1 Then GoTo Finish ... Finish: MsgBox "Macro ended" End Sub
GOTO STATEMENTS ARE DIFFICULT TO READ AND DEBUG. USE STRUCTURED CONTROLS WHENEVER POSSIBLE.
http://www.mousetraining.co.uk
Page 54
M I C R O S O F T
E X C E L
2 0 0 3
It is possible to call one procedure from within another procedure by entering the procedure name as a statement. This is particularly useful for a series of statements that are frequently required. The statements can be written as a separate procedure and the procedure called whenever the statements are required. It also makes a procedure easier to read and decode if it performs just one or two tasks, calling other procedures as required. If one procedure calls a second procedure, Visual Basic first looks for the second procedure in the module containing the first one. If the second procedure can not be found in the same module then Visual Basic looks in the other modules in the same workbook and then in other workbooks to which reference has been established (see below).
Calling Procedures in Another Workbook
Procedures can only be called from another workbook if a reference from Visual Basic to that workbook is established.
http://www.mousetraining.co.uk
Page 55
E X C E L 2 0 0 3 V B A C O N T R O L S T R U C T U R E S
4. 5.
Check the box next to the VBAProject for the reference. Choose the OK button.
Sub InputNumber() Dim varNumber VarNumber = InputBox("Enter a number between 100 and 200") Select Case varNumber Case Is < 100 Alert Text:="too small" Case Is > 200 Alert Text:="too big" Case Else Alert Text:="OK" End Select End Sub Sub Alert(Text) Beep MsgBox "Number is " & Text End Sub
http://www.mousetraining.co.uk
Page 56
M I C R O S O F T
E X C E L
2 0 0 3
Control Structures Exercise 6 1. 2. 3. 4. 5. 6. In the workbook SALES.XLS using the Visual Basic Editor: a) Copy and paste the procedure InputSales, renaming the copy InputSales2. b) In the procedure InputSales2, replace the four InputBox statements prompting for the sales figures with a single statement inside a FOR..NEXT loop. Include the week number in the prompt. c) In the procedure InputSales2, replace the four statements entering the sales figures with a single statement inside the existing FOR..NEXT loop. Choosing the Cancel button in an InputBox dialog box does not cancel the procedure, it only dismisses dialog box. Insert two lines in the InputSales2 procedure so that if a user chooses Cancel in an InputBox dialog box the procedure is exited. Start a new workbook: a) Write a procedure named LowerCase to change the case of each cell in a selection to lower case. b) Write a procedure named ProperCase to change the case of each cell in a selection to proper (title) case. c) Write a procedure named DelRows to give the user the opportunity to delete the active row in response to a MsgBox function prompt. Build a DO...LOOP into the procedure so that it continues until the user chooses Cancel. d) Save the workbook as CONTROLS.XLS (this workbook will be needed again later in the course). In CONTROLS.XLS: a) Record a procedure named Colours to change the interior colour and font colour of a selection of cells. b) Write a procedure named ChangeColours that calls the procedure Colours passing it different arguments for the interior and font colours depending upon whether the selected cell contains a number above or below 10. Modify the Colours procedure accordingly. c) Modify the ChangeColours and Colours procedures with a For Each...Next loop so that they will work on a selection of cells.
7.
http://www.mousetraining.co.uk
Page 57
E X C E L 2 0 0 3 V B A C O N T R O L S T R U C T U R E S
Answers to Exercise 6
Question 1
Sub InputSales2() Dim MonthOfSales As String Dim SalesData(1 to 4) Dim WeekNumber As Integer MonthOfSales = InputBox(prompt:= "Enter month of sales", _ title:= "Month") For WeekNumber = 1 To 4 SalesData(WeekNumber) =InputBox( prompt:= _ "Enter sales for week " _ & WeekNumber) Range("B2:E2").Cells(WeekNumber).Value = _ SalesData(WeekNumber) * Next Range("A1").Value = UCase(MonthOfSales) Columns("A:E").EntireColumn.AutoFit End Sub
Question 2
Sub InputSales2() Dim MonthOfSales As String Dim SalesData(1 to 4) Dim WeekNumber As Integer MonthOfSales = InputBox(prompt:= "Enter month of sales", _ title:= "Month") If MonthOfSales = "" Then Exit Sub For WeekNumber = 1 To 4 SalesData(WeekNumber) =InputBox( prompt:= _ "Enter sales for week " _ & WeekNumber) If SalesData(WeekNumber) = "" Then Exit Sub Range("B2:E2").Cells(WeekNumber).Value = _ SalesData(WeekNumber) * Next Range("A1").Value = UCase(MonthOfSales) Columns("A:E").EntireColumn.AutoFit End Sub
*
The following statement can also be used outside of the For loop:
Range("B2:E2").Value = SalesData
http://www.mousetraining.co.uk
Page 58
M I C R O S O F T
E X C E L
2 0 0 3
Control Structures
Question 3
Sub LowerCase() For Each Cell In Selection Cell.Value = LCase(Cell.Formula) Next End Sub Sub ProperCase() For Each Cell In Selection Cell.Value = Application.Proper(Cell.Formula) Next End Sub Sub DelRows() Do Until Response = vbCancel Response = MsgBox("Delete row " _ & ActiveCell.Row & "?", 35) If Response = vbYes Then ActiveCell.EntireRow.Delete Else ActiveCell.Offset(1, 0).Select EndIf Loop End Sub
http://www.mousetraining.co.uk
Page 59
E X C E L 2 0 0 3 V B A C O N T R O L S T R U C T U R E S
Question 4
Sub Colours() With Selection.Interior .ColorIndex = 5 .Pattern = xlSolid End With Selection.Font.ColorIndex = 3 End Sub Sub ChangeColours() Const Red = 3, Blue = 5 If ActiveCell.Value > 10 Then Colours inside:=Blue, text:=Red Else Colours inside:=Red, text:=Blue End If End Sub Sub Colours(inside, text) With Selection.Interior .ColorIndex = inside .Pattern = xlSolid End With Selection.Font.ColorIndex = text End Sub
http://www.mousetraining.co.uk
Page 60
M I C R O S O F T
E X C E L
2 0 0 3
Control Structures
Dim Cell as Object 'declare as module level variable Sub ChangeColours() Const Red = 3, Blue = 5 For Each Cell In Selection If IsNumeric(Cell.Value) And Not IsEmpty(Cell.Value) Then If Cell.Value > 10 Then Colours inside:=Blue, text:=Red Else Colours inside:=Red, text:=Blue End If End If Next Cell End Sub Sub Colours(inside, text) With Cell.Interior .ColorIndex = inside .Pattern = xlSolid End With Cell.Font.ColorIndex = text End Sub
http://www.mousetraining.co.uk
Page 61
M I C R O S O F T
E X C E L
2 0 0 3
Dialog boxes and forms allow applications to interact with their users. A built-in Word dialog box can be used in a procedure. A predefined dialog box can be used, allowing a quick and easy way to request information from, or display information to, the user. User-defined forms can also be defined incorporating various controls including selection lists and check boxes allowing more extensive interaction. Controls can also be added to worksheets and chart sheets to create custom forms.
Built-In Dialog Boxes Excel contains approximately 200 built-in dialog boxes. Each dialog box has a constant assigned to it; these constants all begin with xlDialog. Use the Object Browser to browse the list of dialog box constants or pick from the list of constants displayed when typing in the Visual Basic Editor. The Show method of the Dialog property displays and executes any action taken in a built-in Excel dialog box. To access a particular built-in Excel dialog box, specify an xlDialog constant with the Dialogs property of the Application object. For example, the following macro displays the Open dialog box (xlDialogOpen):
Application.Dialogs(xlDialogOpen).Show
If a file is selected and the OK button is clicked, the file is opened (the action is executed). Predefined Dialog Boxes
There are two ways to add predefined dialog boxes to an application, the InputBox function and the MsgBox function.
InputBox Function
The InputBox function displays a prompt in a dialog box and returns the text typed by the user in the supplied text box. It has an OK button, a Cancel button and optionally a Help button. The syntax of the InputBox function is:
InputBox(prompt, title, default, xpos, ypos, helpfile, context)
Prompt is a string of characters displayed as the message in the dialog box. The maximum length is approximately 1024 characters. Title is displayed in the title bar of the dialog box. It is optional and without it Microsoft Excel is placed in the title bar. Default is displayed in the text box as the default response if no entry is made. It is optional and without it the text box appears empty. Xpos is the horizontal distance in twips of the left edge of the dialog box from the left edge of the screen. It is optional and without it the dialog box is horizontally centred.
20 TWIPS EQUALS 1 POINT. 72 POINTS EQUALS AN INCH.
http://www.mousetraining.co.uk
Page 63
E X C E L 2 0 0 3 V B A D I A L O G S A N D F O R M S
Ypos is the vertical distance in twips of the upper edge of the dialog box from the top of the screen. It is optional and without it the dialog box is positioned approximately one third of the way down the screen. Helpfile identifies the file used to provide context sensitive help for the dialog box. If helpfile is specified a Help button is automatically added to the dialog box. Context must also be specified. Context is a number indicating which help topic is required from the helpfile. The following statement displays the dialog box pictured below. The default is set to 1998. The users response is stored in a variable called FirstYear. FirstYear = InputBox (Enter the first year, , 1998)
If the user chooses the OK button or presses Enter the InputBox function returns whatever is in the text box. If the user chooses the Cancel button or presses Escape the InputBox function returns a zero length string ().
MsgBox Function
The MsgBox function displays a prompt in a dialog box and waits for the user to choose a button. It returns a value indicating which button was chosen. The syntax of the MsgBox function is:
MsgBox (prompt, buttons, title, helpfile, context) IF THERE IS NO RETURN VALUE, MSGBOX ACTS AS A STATEMENT AND THE ARGUMENTS NEED NOT BE ENCLOSED IN PARENTHESIS. E.G. MSGBOX HELLO WORLD!
Prompt is a string of characters displayed as the message in the dialog box. The maximum length is approximately 1024 characters. Buttons is the sum of the numbers used to identify: the number and type of buttons to display; the icon to use; the identity of the default button. See below for a list of the numbers. Title is displayed in the title bar of the dialog box. It is optional and without it Microsoft Excel is placed in the title bar. Helpfile identifies the file used to provide context sensitive help for the dialog box. If helpfile is specified a Help button is automatically added to the dialog box. Context must also be specified. Context is a number indicating which help topic is required from the helpfile.
http://www.mousetraining.co.uk
Page 64
M I C R O S O F T
E X C E L
2 0 0 3
The buttons argument consists of constants or values from each of the following three groups:
Number and type of button:
Constant vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel Value 0 1 2 3 4 5 Display: OK button only. OK and Cancel buttons. Abort, Retry, and Ignore buttons. Yes, No, and Cancel buttons. Yes and No buttons. Retry and Cancel buttons.
Icon style:
Constant vbCritical Value 16 Display: Critical Message icon Icon
vbQuestion
32
vbExclamation
48
vbInformation
64
http://www.mousetraining.co.uk
Page 65
E X C E L 2 0 0 3 V B A D I A L O G S A N D F O R M S
Default button:
Constant vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 Value 0 256 512 Default First button is default. Second button is default. Third button is default.
The value returned by the function depends upon which button was pressed. The value is returned as a constant, which is equal in value to a number. The constant or the value can be tested by the procedure. The constants are specified by Visual Basic:
Button Selected OK Cancel Abort Retry Ignore Yes No Constant vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo Value 1 2 3 4 5 6 7
The following example performs some statements and then displays the following message box prompting whether the commands should be repeated:
If the Yes button is pressed, the macro is repeated, otherwise the macro stops.
Sub Enter_Sales() Do Until Repeat = vbNo statements Repeat = MsgBox(prompt:="Repeat this procedure", _ buttons:=vbYesNo + vbQuestion) Loop End Sub
http://www.mousetraining.co.uk
Page 66
M I C R O S O F T
E X C E L
2 0 0 3
Dialogs and Forms User-Defined Forms User-defined forms can be created on worksheets, chart sheets or in the Visual Basic Editor.
Controls
User-defined forms are created by adding controls to a worksheet, chart sheet or user defined form. Buttons, text boxes, list boxes and check boxes are all examples of controls. It is even possible to use controls from outside of Excel. These type of controls can be especially written and are known as ActiveX controls. The simplest way to create a form is to place controls directly onto a worksheet so that they are near to relevant cells and those cells recalculate automatically. This is particularly useful if only one control is required. Forms designed in the Visual Basic Editor can be much more sophisticated. Worksheet Forms
Placing Controls
Edit Box
Edit Code
Run Dialog
Label
List Box
http://www.mousetraining.co.uk
Page 67
E X C E L 2 0 0 3 V B A D I A L O G S A N D F O R M S
The following controls are available from the Forms toolbar: Control Label Edit Box Group Box Button Check Box Option Button List Box Drop-Down Combination List-Edit Combination Drop-Down Edit Scroll Bar Spinner Description Text that is displayed to the user, including names, instructions etc. A box in which the user can enter text, numbers or cell references. A border containing a group of buttons or other controls. A command button such as OK or Cancel. A box indicating whether an option is set. A button for selecting one of a group of mutually exclusive options. A group of option buttons should be placed in a group box. A list of options, one or more of which can be selected. A single uneditable text box with an arrow, paired with a drop-down list that appears when the user selects the arrow. A single editable text box combined with a list box. An empty edit box with an arrow, paired with a drop-down list that appears when the user selects the arrow. A horizontal or vertical scroll bar for changing numeric values. A pair of buttons for incrementing or decrementing a displayed value.
The Edit Box and Combination list boxes can not be inserted on a worksheet.
)
Cell Links
To change a property:
1. 2. 3. 4. Select the control. Choose Format Control, or choose the Control Properties button on the Forms toolbar. Change the required property. Choose the OK button.
Check box, option button, list box, drop-down, scroll bar and spinner controls have a Cell Link property. A value is returned to the Cell Link corresponding to the item or option selected or set by the user in the control. The value in the cell link may be directly of use in the worksheet or it may need to be evaluated in a formula containing functions such as IF(), INDEX() or lookup. The cell link need not be on the same worksheet as the control.
Input Ranges
List box and drop-down controls have an Input Range property. This property is used to set the list of values to appear in the list box.
Option buttons are normally arranged in groups. A user can choose one option from a group; the options are mutually exclusive. To create a group of option buttons, first add a group box of sufficient size to hold all of the option buttons it is to contain, then add the required option buttons into the group. Make sure the options do not stretch outside of the group box. When a user select an option button in the group a value is returned to the cell link corresponding to order of the option button in the group. For example, if a user chose the Single option from the following group, the value 2 would be returned to the cell link:
THE ORDER OF THE OPTIONS BUTTONS IS THE ORDER IN WHICH THEY WERE ADDED TO THE GROUP.
http://www.mousetraining.co.uk
Page 68
M I C R O S O F T
E X C E L
2 0 0 3
Dialogs and Forms 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Set control properties Right-click a control in design mode and click Properties to display the Properties window. Initialise the controls Initialise controls in a procedure before the form is shown, or add code to the Initialize event of the form. Write event procedures All controls have a predefined set of events. For example, a command button has a Click event that occurs when the user clicks the command button. Write event procedures that run when the events occur. Show the dialog box Use the Show method to display a UserForm. Use control values while code is running Some properties can be set at run time. Changes made to the dialog box by the user are lost when the dialog box is closed. Act upon the instructions in the form This may include inserting text in a workbook, formatting a workbook and any other number of things.
Adding Form Controls To display the Toolbox, choose View Toolbox or click the Toolbox button on the Standard toolbar.
The Toolbox contains a similar list of controls to the Excel Forms toolbar. Additional controls include: TabStrip, MultiPage, RefEdit and Image. Use the Format commands to align and arrange the controls on the form.
http://www.mousetraining.co.uk
Page 69
E X C E L 2 0 0 3 V B A D I A L O G S A N D F O R M S
Data Properties
Some of the most useful properties can be set in the Data category. The RowSource property specifies the source, providing a list for a ComboBox or ListBox. The RowSource property accepts worksheet ranges from Excel in the form Sheet1!A1:A6. This is equivalent to using an Input Range for a worksheet control. The ColumnSource property identifies the data location used to set or store the Value property of a control. The ControlSource property accepts worksheet ranges from Excel in the form Sheet1!A7. This is equivalent to using a Cell Link for a worksheet control. The default value for ControlSource is an empty string. If ControlSource contains a value other than an empty string, it identifies a linked cell. The contents of that cell is automatically copied to the Value property when the control is loaded.
Private Sub GetUserName() With UserForm1 .lstWeekDays.AddItem .lstWeekDays.AddItem .lstWeekDays.AddItem .lstWeekDays.AddItem .lstWeekDays.AddItem .lstWeekDays.AddItem .lstWeekDays.AddItem .txtSalesPerson.Text End With End Sub
Use code in the Initialize event of a form to set initial values for controls on the form. An advantage to setting initial control values in the Initialize event is that the initialisation code stays with the form. Control and Dialog Box Events UserForms and controls have a predefined set of events. For example, a command button has a Click event that occurs when the user clicks the command button and UserForms have an Initialize event that runs when the form is loaded. To write a control or form event procedure, open a module by double-clicking the form or control and select the event from the Procedure drop-down list box. Event procedures include the name of the control. For example, the name of the Click event procedure for a command button named cmdOK is cmdOK_Click. If code is added to an event procedure and then the name of the control is changed, the code remains in procedures with the previous name. To simplify development, it is a good practice to name controls correctly before writing event code. Displaying and Dismissing a User Form
Show
To test a user form in the Visual Basic Editor, click Run Sub/UserForm button or press [F5]. Page 70
http://www.mousetraining.co.uk
M I C R O S O F T
E X C E L
2 0 0 3
Dialogs and Forms To display a user form from Visual Basic, use the Show method. The following example displays the user form box named UserForm1:
Text Boxes
txtName.Value = "text"
To return the content of a text box use the following syntax, where "strName" is a string variable:
strName = txtName.Value
Option Buttons
Groups of option buttons should be created in Frames. Only one option button in a Frame can be selected. To select an option button on initialisation use the following syntax:
optMale.Value = True
To evaluate which of a group of option buttons in a frame was selected use the following syntax, where "strSex" is a string variable:
Dim strStatus(3) As String strStatus(0) = "Full-time" strStatus(1) = "Part-time" strStatus(2) = "Temporary" strStatus(3) = "Contractor" lstStatus.List = strStatus() lstStatus.ListIndex = 0
To return the item selected in a list box or combo box use the following syntax, where "strName" is a string variable:
strName = lstName.Value
To limit a combobox so that users can only select from the list, set the Style property to fmStyleDropDownList.
Check Boxes
To set a check box on initialisation use the following syntax:
http://www.mousetraining.co.uk
Page 71
E X C E L 2 0 0 3 V B A D I A L O G S A N D F O R M S
See the LOAN FORM.XLS and WIZARD.XLS workbooks for examples of how to use and manage user-defined forms.
http://www.mousetraining.co.uk
Page 72
M I C R O S O F T
E X C E L
2 0 0 3
Dialogs and Forms Exercise 7 1. Open the workbook SALES.XLS. a) In the Visual Basic Editor insert a user form and create the user-defined form shown below by adding label, text box, combobox and command button controls:
2. 3.
Write a procedure to show the form and insert the results onto the Sales worksheet but only if the user chooses the OK button. c) Create a procedure to initialise the form when it is shown. Open the workbook WORKSHEET CONTROLS.XLS and investigate the worksheet controls and linked formulae. Open the workbook LOAN FORM.XLS and investigate the user-defined form and associated procedures.
b)
http://www.mousetraining.co.uk
Page 73
E X C E L 2 0 0 3 V B A D I A L O G S A N D F O R M S
Question 1
Answers to Exercise 7
Sub InputData() Dim intCount As Integer Worksheets("Sales").Unprotect Worksheets("Sales").Range("A1").Value = lstMonth For intCount = 1 To 4 Worksheets("Sales").Range("B2:E2").Cells(intCount).Value = _ frmSales("txtWeek" & intCount).Value Next Worksheets("Sales").Columns("A:E").EntireColumn.AutoFit Worksheets("Sales").Protect End Sub
Open the workbook SALES FORM.XLS for a complete solution.
http://www.mousetraining.co.uk
Page 74
M I C R O S O F T
E X C E L
2 0 0 3
Storing Information
Worksheets(1).Range("A1").Value = UserName
2. 3. 4. The Windows Registry Windows 95 replaces most of the numerous INI files found in previous versions of Windows with entries in a central Registry database. Items may be written and read from the registry using the SaveSetting statement and the GetSetting() function. This example demonstrates these techniques by creating a simple application entry with a number of items in it. 1. Create a form with four unbound text boxes; txtAppName, txtSection, txtItem and txtValue. Label them as shown below. 2. Add two command buttons; cmdRead and cmdWrite. Label them as shown below. 3. Enter the following code into the respective buttons click event: Use the Write # statement to write data to an open sequential file. Data can be read from an open sequential file with Input #. Store and retrieve data from the registry. Store and retrieve information from a setting, or INI, file.
Private Sub cmdRead_Click() txtValue = GetSetting(txtAppName, txtSection, txtItem) End Sub Private Sub cmdWrite_Click() SaveSetting txtAppName, txtSection, txtItem, txtValue End Sub
Test the techniques by creating a dummy application name, section and a few items with values. The entries can be viewed by using the Read button or by opening the registry with the REGEDIT.EXE application: The statement DeleteSetting can be used to delete a Registry setting. Settings Files
Unfortunately, Visual Basic does not contain any commands for accessing settings files. However, functions do exist within special Windows files, known as dynamic-link libraries (DLLs), for accessing settings files these functions can be called from Visual Basic procedures provided they are first declared.
Declare Statement Used at module level to declare references to external procedures in a DLL. [Public | Private ] Declare Sub name Lib libname Alias aliasname [([arglist])] [Public | Private ] Declare Function name Lib libname Alias aliasname [([arglist])][As type] Elements The Declare statement syntax has these parts: Part Description
http://www.mousetraining.co.uk
Page 75
E X C E L 2 0 0 3 V B A S T O R I N G I N F O R M A T I O N
Part Public Private Sub Function name Lib libname arglist type Alias
Description Used to declare procedures that are available to all other procedures in all modules. Used to declare procedures that are available only within the module where the declaration is made. Indicates that the procedure does not return a value. Indicates that the procedure returns a value that can be used in an expression. Any valid procedure name. Indicates that a DLL or code resource contains the procedure being declared. The Lib clause is required for all declarations. Name of the DLL or code resource that contains the declared procedure. List of variables representing arguments that are passed to the procedure when it is called. Data type of the value returned by a Function procedure; may be Boolean, Integer, Long, Currency, Single, Double, Date, String (variable length only), Object, Variant, a user-defined type, or an object type. Indicates that the procedure being called has another name in the DLL. This is useful when the external procedure name is the same as a keyword. Also, use Alias when a DLL procedure has the same name as a Public variable or constant or any other procedure in the same scope. Name of the procedure in the DLL or code resource.
aliasname
For Function procedures, the data type of the procedure determines the data type it returns. Empty parentheses indicate that the Sub or Function procedure has no arguments and that arguments should be checked to ensure that none are passed. If an argument list is included, the number and type of arguments are checked each time the procedure is called. WritePrivateProfileString The WritePrivateProfileString function can be used to write data to a settings file. Before the WritePrivateProfileString function can be used it must first be declared. The following example declares the function for use on any module in the workbook: Declare Function WritePrivateProfileString Lib kernel32 Alias WritePrivateProfileStringA (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Long Argument Section KeyName Setting Filename Explanation The name of the section in the settings file that contains the key to set. In Windows, this is the name that appears between brackets before the associated keys (do not include the brackets with Section). The key to set. In a Windows settings file, the key name is followed by an equal sign (=) and the setting. The new setting. The filename for the settings file. If a path is not specified, the Windows directory (Windows) is assumed. If the file does not already exist, Word creates it.
The following procedure sets the UserName keyword of the Profile section of the file Personal.INI to be the result of the InputBox prompt:
Sub WriteToIni() Dim Result As Integer Dim Section As String, Keyword As String, Setting As String, _ FileName As String Section = Profile Keyword = UserName Setting = InputBox(Enter your name) If Setting = "" Then Exit Sub FileName = Personal.INI Result = WritePrivateProfileString(Section, Keyword, _ Setting, FileName) If Result = 1 Then MsgBox Success Else MsgBox Failure End If End Sub
The WritePrivateProfileString function returns a value indicating whether the action was successful: 1 means the key was set, 0 (zero) means the key was not set. Keys cannot be set if the settings file is read-only. WritePrivateProfileString can also be used as a statement with no value returned.
http://www.mousetraining.co.uk
Page 76
M I C R O S O F T
E X C E L
2 0 0 3
Storing Information
GetPrivateProfileString
The GetPrivateProfileString function can be used to read data from a settings file. Before the GetPrivateProfileString function can be used it must first be declared. The following example declares the function for use on any module in the workbook: Declare Function GetPrivateProfileString Lib kernel32 Alias GetPrivateProfileStringA (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nsize As Long, ByVal lpFileName As String) As Long Argument Section KeyName Default ReturnedString Nsize Filename Explanation The name of the section in the settings file that contains the key to set. In Windows, this is the name that appears between brackets before the associated keys (do not include the brackets with Section). The key to set. In a Windows settings file, the key name is followed by an equal sign (=) and the setting. Value returned if none can be found from the settings file. Value returned from the settings file. Length of returned string. The filename for the settings file. If a path is not specified, the Windows directory (Windows) is assumed. If the file does not already exist, Word creates it.
The following procedure gets the contents of the UserName keyword of the Profile section of the file Personal.INI and stores it in the variable Setting:
Sub ReadFromIni() Dim Result As Integer Dim Section As String, Keyword As String, NotFound As String, _ Setting As String * 128, FileName As String Section = Profile Keyword = UserName NotFound = Could not get anything FileName = Personal.INI Result = GetPrivateProfileString(Section, Keyword, NotFound, _ Setting, Len(Setting), FileName) MsgBox Setting End Sub
The GetPrivateProfileString function returns a value indicating the length of the string returned. GetPrivateProfileString can also be used as a statement with no value returned. See the workbook PROFILE STRINGS.XLS for this example.
http://www.mousetraining.co.uk
Page 77
M I C R O S O F T
E X C E L
2 0 0 3
To make sure that a custom toolbar is always available with a specific workbook, attach the toolbar to the workbook. Be sure to save the workbook after attaching a toolbar.
Toolbars
If a macro is assigned to a toolbar, the macro is available at any time and for every sheet in the workbook, provided the toolbar is displayed. The workbook containing the macro is automatically opened, if it is not already open, when the button or menu item is clicked from another workbook. A macro is usually assigned to a custom button or a custom menu item, but a macro can be assigned to a built-in button or item overriding the buttons or items normal function.
http://www.mousetraining.co.uk
Page 79
Customised Toolbars
E X C E L 2 0 0 3 V B A T O O L B A R S A N D D I S P L A Y
Customising a Toolbar
Change, or customise, a toolbar so it contains buttons or menu items for the most often used commands or macros. A menu bar, such as the Worksheet or Chart menu bar, are just special toolbars
Commands tab of Tools Customize. From the Categories list box, select Macros.
Choose the Drag the Custom Menu Item or Custom Button topic from the Commands list box over the toolbar and then release the mouse. On a menu bar, drag the horizontal line to position on the menu where the item or button is to be inserted. Right-click the added custom button or menu item and choose Assign Macro. Select the macro to assign to the button or menu item. Right-click the added custom button or menu item and edit the Name of the button or item. Include an & for an underlined character. Choose the Close button.
http://www.mousetraining.co.uk
Page 80
M I C R O S O F T
E X C E L
2 0 0 3
ScreenUpdating
Turn screen updating off to speed up macro code. This will not only make procedures run faster but will also prevent distracting screen flickering.
Application.ScreenUpdating = False
Screen updating is automatically turned back on when the macro ends or it can be turned on during the course of a procedure by setting the property to True.
DisplayAlerts
Stop Excels prompts and alert messages while a macro is running. Excel chooses the default response.
Application.DisplayAlerts=False
Excel sets the DispalyAlerts property back to True when the macro stops running.
http://www.mousetraining.co.uk
Page 81
E X C E L 2 0 0 3 V B A T O O L B A R S A N D D I S P L A Y
Exercise 8 1. 2. 3. Open the workbook CHANGE CASE.XLS. Add the menu item Change Case to the Format menu of the Worksheet toolbar. Use h as the accelerator key. Add the submenu items Lower, Proper and Upper to the Change Case menu item. Assign the macro LowerCase to the menu item Lower, the macro ProperCase to the menu item Proper and the macro UpperCase to the menu item Upper. Use L, P and U respectively as the accelerator keys. Resave the workbook CHANGE CASE.XLS.
4.
http://www.mousetraining.co.uk
Page 82
M I C R O S O F T
E X C E L
2 0 0 3
Types of Errors
There are various types of errors that can occur when writing and running a procedure. These can be broadly separated into three areas: language errors, run-time errors and logic errors. Language errors occur when the code is written incorrectly. Visual Basic detects these errors when the insertion point is moved away from the line while writing the procedure or just before the procedure is run. One way to help minimise language errors is by using the Option Explicit statement. With this statement included Visual Basic will only accept variable names that have been declared and will detect any errors in the spelling of variable names. Run-time errors occur and are detected by Visual Basic when a statement tries to perform an operation that cannot be carried out. When this happens Visual Basic halts execution of the macro with a series of available options. For example, the following error may occur when a statement refers to an object that does not exist:
The type of error that has occurred is described using an error number and a description. Various options are available: Choose the End button to end the macro at that point. Choose the Debug button to highlight the offending code in the Visual Basic Editor. Choose the Help button for help about the type of error. Logic errors are errors that occur when the code appears to perform correctly but doesnt produce the correct result. Logic errors can also produce run-time errors. For example a particular case may be missing from a Select Case statement, or a variable may contain a different value to the one expected causing another variable to be set incorrectly at a later point in the procedure. The larger a procedure is the more difficult it is to detect logic errors and it is for the detection of logic errors that the debugging tools are particularly useful. Break Mode Execution of a procedure can be halted at a specific point by placing a breakpoint into the code. When a breakpoint is met Visual Basic enters break mode. The values of variables can then be viewed and execution can be continued in step mode. Alternatively, execution can be normally resumed and the procedure will continue running until the next breakpoint is met, or execution ends normally.
Setting Breakpoints
3.
Instant Watch Instant watch can be used to display the value of any expression while in break mode.
http://www.mousetraining.co.uk
Page 83
E X C E L 2 0 0 3 V B A D E B U G G I N G A N D E R R O R
T R A P P I N G
3.
Choose the Add button to add the expression to the Watch pane of the debug window. The expression can then be watched for the rest of the procedure.
Stepping Stepping can be used to step through each statement of a procedure while in break mode. On selecting one of the step options the current statement is executed and then the procedure is halted again. This enables the values of any expressions to be displayed at any time, the flow of execution to be observed and the exact point at which an error occurs to be spotted. There are three ways to step through a procedure, Step Into, Step Over and Step Out. These are selected by choosing the appropriate button on the Debug toolbar. will step through all statements including any that are in a called procedure. When the end of the called procedure is Step Into reached Step Into returns to the procedure that contained the call. Step Over is identical to Step Into except that it treats any called procedure as one statement to be executed. It executes every statement in the called procedure before halting at the statement following the call. Step Back executes the remaining lines of a procedure in which the current execution point lies. Error Handling If an error occurs whilst a macro is running, a run-time error, it will either cause the macro to fail or make it act unpredictably, unless the error is trapped in some way. The simplest way to deal with errors is to use the On Error statement which can take three forms. The error trap is turned on prior to the likely occurrence of an error and sits in wait until an error occurs or until the trap is turned off. Notice that an error-handling routine is not a Sub or Function procedure. It is a block of code marked by a line label or line number. To prevent the block of code from being executed, when no error has occurred, it must be bypassed, or the procedure or function ended, before it is reached (see below).
If this statement is placed before the instruction that causes the error, control of the macro branches to the line with the label. The number of any error generated is returned by the Err function.
The Resume statement returns control to the line at which the error occurred and attempts to run the statement again. The Resume Next statement passes control in the macro to the line following the line that caused the error. Using a Resume statement anywhere except in an error-handling routine causes an error.
This statement disables a previous On Error Resume Next or On Error Goto Label statement. When the next error occurs an error message will be generated and the macro will fail. When On Error Resume Goto label is used to trap errors the number of any error is returned by the Err function. Err acts like a public variable. The value of Err can be tested and acted upon.
Error() Function
http://www.mousetraining.co.uk
M I C R O S O F T
E X C E L
2 0 0 3
Debugging and Error trapping handling code displays a message to inform the user that the file has not been saved and the procedure resumes at the line after the one that caused the error. When the file is saved successfully and no error occurs, then the error handling code is not executed, or executed again, because the macro is exited before it is reached.
Sub ErrorTest() On Error GoTo ErrHandle ActiveWorkbook.SaveAs Filename: = "A:\DATA.XLS" On Error GoTo 0 Exit Sub ErrHandle: If Error() = "Cannot access A:." Then MsgBox Error() + "Insert floppy disk in drive A." Resume Else MsgBox "File not saved." Resume Next End If End Sub
http://www.mousetraining.co.uk
Page 85
M I C R O S O F T
E X C E L
2 0 0 3
http://www.mousetraining.co.uk
Page 87
M I C R O S O F T
E X C E L
2 0 0 3
Function Procedures
A function procedure can be used as a user-defined function provided it does not perform actions that alter the Excel environment for example inserting, deleting or formatting cells; moving, adding or deleting sheets. Functions can only return values, they can not perform actions with objects. User-defined functions allow the user to type the procedure name directly into a cell on the worksheet, followed by the required data enclosed in brackets and separated by commas in the order expected by the function procedure. In the following example, the function Percentage is expecting two variables to be passed. It uses the variables to calculate the percentage and the result is passed back:
Function Percentage (Amount, Percent) Increase amount by percent Percentage = (Amount*Percent/100)+Amount End Function
To use the function in the worksheet, type the function name followed by the data that is to go into the variables enclosed in parenthesis:
=Percentage (150,17.5) =Percentage (B1,B2)
In the following example, the function Age is expecting one variable to be passed. It uses the variable to calculate the age and the result is passed back:
Function Age(DOB)
http://www.mousetraining.co.uk
Page 89
E X C E L 2 0 0 3 V B A F U N C T I O N P R O C E D U R E S
If Month(DOB) > Month(Now) Then Age = Year(Now) - Year(DOB) - 1 ElseIf Month(DOB) < Month(Now) Then Age = Year(Now) - Year(DOB) ElseIf Day(DOB) <= Day(Now) Then Age = Year(Now) - Year(DOB) Else Age = Year(Now) - Year(DOB) - 1 End If End Function
Function Wizard
Although a user-defined function can be used on the worksheet by typing the function name and variable(s) in brackets it is often better to use the Function Wizard.
Excel automatically adds user-defined functions to a User Defined category of the Function Wizard.
Excel Functions
In the Age user-defined function example above, the Excel functions Month(), Now and Year() were used. Not all worksheet functions are applicable to modules. However, any worksheet function can be used in a module if it is written Application.FunctionName.
http://www.mousetraining.co.uk
Page 90
M I C R O S O F T
E X C E L
2 0 0 3
Function Procedures Exercise 9 1. 2. 3. 4. Open the workbook USER FUNCTIONS.XLS and investigate the Age(), Celsius() and Fahrenheit() functions. Write a function procedure named YdsToMts to convert a length in yards to one in metres, where 1 yard equals 0.914 metres. Write a function procedure named MtsToYds to convert a length in metres to one in yards, where 1 metre equals 1.094 yards. Resave the workbook (this workbook will be needed again later in the course).
http://www.mousetraining.co.uk
Page 91
E X C E L 2 0 0 3 V B A F U N C T I O N P R O C E D U R E S
Question 2
Answers to Exercise 9
http://www.mousetraining.co.uk
Page 92
M I C R O S O F T
E X C E L
2 0 0 3
Add-in Applications
Exercise 10 1. 2. 3. 4. Open the workbook USER FUNCTIONS.XLS. Make USER FUNCTIONS.XLS an Excel add-in saved to a separate folder. Check the Title and Comments of the workbook before saving. Start a new workbook and load the add-in, created in step 3, with Tools Add-Ins. Use the Age(), Fahrenheit(), Celsius() , YdsToMts() and MtsToYds() functions.
http://www.mousetraining.co.uk
Page 93
M I C R O S O F T
E X C E L
2 0 0 3
http://www.mousetraining.co.uk
Page 95
E X C E L 2 0 0 3 A P P E N D I X A
V B A - N A M I N G
C O N V E N T I O N S
Memory Variables Memory variables should be prefixed with three lower case letters to indicate the data type of the variable: Data Type String Long Single Variant Integer Double Date Object Prefix str lng sng var int dbl dat obj
http://www.mousetraining.co.uk
Page 96