Lab 2 Introduction to VBA (II) ► Lab 1 revisited - Sub & Function procedures - Data types and variable declaration ► Recording macros ► Working with Ranges ► Exercise http://blackboard.umbc.edu Lab 1 Revisited • Don’t forget to go to Excel: Tools -> Macro -> Security and change the Security level from High to Medium • When you save the file in Excel or VBE, it saves both the Excel file and the VBA code you write • The string concatenation symbol – the ampersand (&) has to be surrounded by a space on BOTH sides • An ampersand (&) is required when you break strings across lines, e.g. MsgBox "John Doe traveled 100 miles and paid a total of " & _ "6.40 dollars on gas.", vbInformation, "Travel Information" http://blackboard.umbc.edu VBA Procedure Declaration • Sub procedure: a set of instructions that performs some action. • Function procedures. a set of instructions that returns a single value or an array • Sub procedure Syntax [Private | Public | Friend] [Static] Sub name ([arglist]) [statements] [Exit Sub] [statements] End Sub • Private: accessible only to other procedures in the same module Public: accessible to all procedures in ALL other modules in the workbook. (By default, a procedure is Public) procedure’s variables are preserved when procedure ends a list of variables that receive arguments passed to the procedure • Static: • Arglist: • Exit Sub: Immediate exit from a Sub procedure. http://blackboard.umbc.edu Function Procedure Declaration • Function procedure Syntax [Public | Private | Friend] [Static] Function name [(arglist)] [As type] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function • Private: accessible only to other procedures in the same module Public: accessible to all procedures in ALL other modules in the workbook. (By default, a procedure is Public) procedure’s variables are preserved when procedure ends a list of variables that receive arguments passed to the procedure • Static: • Arglist: • Exit Function: Immediate exit from a Function procedure. http://blackboard.umbc.edu Variables • A variable is a named storage location in a computer’s memory • It can accommodate a variety of data types – Such as Boolean, Integer, Long, Single, Double, Date, String, Variant • Make your variable names descriptive, and the first character must be alphabetic • Good names usually have mixed case (InterestRate) or underscore (Interest_Rate) • No spaces and periods are allowed in variable names http://blackboard.umbc.edu Variable Continued • You don’t have to declare the data type of a variable in VBA – VBA uses the default data type – Variant. BUT: slower execution and less efficiently use of memory. • To declare a variable is to tell VBA its name and data type. Two benefits of declaring variables: – Your programs run faster and use memory more efficiently – You avoid problems involving misspelled variable names. • To FORCE yourself to declare all variables in VBE, Go to Tools->Options->Editor, and check the “Require Variable declaration” box – Good habit http://blackboard.umbc.edu Some VBA’s Built-in Data Types • String – texts (a sequence of contiguous characters including letters, numbers, spaces, and punctuation) surrounded by double quotes • Currency - for monetary values • Boolean - for variables that can be True or False • Integer - Range: -32,768 to 32,767 • Long - for large integers beyond the Integer range • Date - Range: Jan. 1, 0100 to Dec. 31, 9999 • Single – for numbers with decimals • Double – for numbers with decimals where you require more accuracy than with singles • Variant – a catchall, where you let VBA decide how to deal with the variable • etc… http://blackboard.umbc.edu Variable Declaration Tips • To declare several variables: – use a separate line for each variable, but can be a very long list; – use one single Dim, followed by a list of declarations separated by commas BUT: you must follow each variable with the keyword As and then the variable type e.g. Dim i As Integer, Name As String, j As Single If: Dim I, J, K As Integer ′ only K is declared as Integer ′ I & J are declared As Variant instead of Integer http://blackboard.umbc.edu Object Variable • Define variable R as a Range object: Dim R as Range Set R = ActiveWorkbook.Worksheets(“Sheet1”).Range(“A1:A10”) Note: the ‘Set’ statement is only used for object variables • Now, instead of writing ActiveWorkbook.Worksheets(“Sheet1”).Range(“A1:A10”).Font.Size = 14 you can simply write: R.Font.Size = 14 http://blackboard.umbc.edu The With Construction • Very useful: saves a lot of typing and performs multiple operations on a single object when working with objects and their properties and methods. Now compare: • Not using the “With…End With” construction – Worksheets(“March”).Range(“A1”).Value = “Sales for March” Worksheets(“March”).Range(“A1”).Font.Name = “Arial” Worksheets(“March”).Range(“A1”).Font.Bold = True Worksheets(“March”).Range(“A1”).Font.Size = 14 • Using the “With…End With” construction – With Worksheets(“March”).Range(“A1”) .Value = “Sales for March” With .Font .Name = “Arial” .Bold = True .Size = 14 End With End With http://blackboard.umbc.edu Recording Macros (TRY THIS) ● Learn VBA by using the Macro recorder – Activate a worksheet in the workbook – Select the Tools->Macro->Record New Macro command Or: Click on Record Macro tool at the Visual Basic Toolbar – Accept the defaults or change them. Then, click OK to begin recording your actions • Macro name: The name of the macro • Shortcut key: You can specify a key combination that executes the macro • Store macro in: The location for the macro • Description: A description of the macro. By default, Excel inserts the date and your name. You can add additional information if you like – Make some changes in the workbook: Click on File->Page Setup ->Orientation ->Landscape – Click the Stop Recording button on the toolbar – Open the module in VBE and see the code that has been generated automatically http://blackboard.umbc.edu Recording Macros – An Example Record a macro that changes the formatting for the current range selection. The macro format the contents in the selected range into Arial 16-point type, boldface, and red. The corresponding steps include: 1. Enter some value or text into a cell – anything is okay. 2. Select the cell(s) that contains the value or text that you entered in the preceding step 3. Select Tools->Macro->Record New Macro. Excel displays the Record Macro dialog box 4. Enter a new Name for the macro, e.g., FormattingMacro 5. Assign this macro to the shortcut key Ctrl+Shift+F 6. Click OK. This closes the dialog box and displays a toolbar called Stop Recording 7. Select Format->Cells and then click the Font tab. Choose Arial font, Bold, 16-point type, and make the color red. Click OK 8. Click the Stop Recording button on the Stop Recording toolbar 9. Test the macro: enter some value in other cells, then select them and press Ctrl+Shift+F 10. View the code in VBE module TRY THIS http://blackboard.umbc.edu Recording Macros – Sort Method Input some data into an Excel sheet 1. Activate Sheet1 of the workbook. 2. Turn on the recorder 3. Accept all the default values of the Record Macro dialog box 4. Use the Sort method in Excel to sort the data and display the data by cost ascending. 5. Click the Stop Recording button on the Stop Recording toolbar 6. View the code in VBE module 7. Unsort the data and run the macro; note the results TRY THIS http://blackboard.umbc.edu Sort Method • Object.Sort(Key1, Order1, Key2, Order2, Key3, Order3, Header, ..) • Example: • Range("A1:G13").Sort Key1:=Range("G3"), _ Order1:=xlAscending, Header:= xlYes – Key1: The first sort field – Order1: The sort order for the field or range specified in Key1 – Header Optional xlYesNoGuess. Specifies whether or not the first row contains headers • To specify a range that is to be sorted, it suffices to specify any cell within this range. To specify the column to sort on (in the key1 argument), it suffices to specify any cell within this column. http://blackboard.umbc.edu More on Recording Macros • Personal.xls – a special workbook. Macros recorded in this workbook are available all the times as you work in Excel, but it is a hidden file. • Limitations – It cannot record everything (e.g., loops and control logic) – The automatically generated code is often far from elegant http://blackboard.umbc.edu Specify Range With VBA (1) • Use an address e.g. Range(″A1:B10″).Value = 2 ‘Value is the default property of Range object, can be omitted Range(″A1″, ″B10″).ClearContents • Use a range name e.g. To create a range name: Range("A1:F1").Name = "NameList" -> Range(″NameList″) • Use a variable for a range name E.g., SalesName = Range(“Sales”).Name Then, this range can be referred to as Range(SalesName) • Use Range(ColumnIndex & RowIndex) e.g. Range(“A” & 5) http://blackboard.umbc.edu Specify Range With VBA (2) • Use a Range object variable E.g., Dim R As Range Set R = Range(“Sales”) R.Font =12 • Use top left and bottom right arguments E.g. Range(Range(“C1”), Range(“D10”)) ‘C1:D10 • • • Use the Cells property Use the Offset property Use the End property • Object Browser in VBE – a helpful tool to learn object properties and methods (can be accessed by pressing F2) http://blackboard.umbc.edu The Cells Property (1) • • Used to refer to a particular cell of a Range object Three syntaxes: 1. Object.Cells(rowIndex, columnIndex) row: 1-65536, column: 1-256 2. Object.Cells(Index) 3. Object. Cells • Example – Syntax 1: e.g. Worksheets("Sheet1").Cells(1,1) = 9 ' - A1 ActiveSheet.Cells(3,4) = 7 ' - D3 Example – Syntax 2: e.g. ActiveSheet.Cells(513) = 2 ' - A3 Example – Syntax 3: - returns all cells on the referenced worksheet e.g.ActiveSheet.Cells.ClearContents • • http://blackboard.umbc.edu The Cells Property (2) • More examples: – – – – – – Range(“B5:B14”).Cells(3), which cell? Answer: B7 Range(“C5:E15”).Cells(4, 2), which cell? Answer: D8 Range(“A1:D10”).Cells(5) = 2000, which cell? Answer: A2 http://blackboard.umbc.edu The Offset Property (1) • Used to return a reference relative to a range, where the range is usually a single cell. • Syntax: Object.Offset(rowOffset, columnOffset) • Two arguments correspond to the relative position from the upper-left cell of the specified Range: – Positive: down or right – Negative: up or left – Zero: same row/column • Examples: – ActiveCell.Offset(1,0).Value = 2 ' right below – ActiveCell.Offset(-1,0).Value = 15 ' Right above http://blackboard.umbc.edu The Offset Property (2) • • • • • • • • Range(“A5”).Offset(2, 3), which cell? Answer: D7 Range(“A5”).Offset(0,3), which cell? Answer: D5 Range("A5").Offset(-3, 0).Font.ColorIndex = 4 Answer: A2 turns green Font.ColorIndex: 1: Black, 3: Red, 4: Green, 5:Blue, 6: Yellow http://blackboard.umbc.edu The End Property • To select large Ranges – same as using Shift + the End-Arrow key combination in Excel • You don’t need to know the size of the range • The End property takes one argument – determines the direction in which the selection is extended – xlUp, xlDown, xlToRight, xlToLeft • Make sure you don’t have empty rows and columns in your data; otherwise, the End, Offset, and Cells properties won’t work. • Anchor cell cannot be merged with any other cells. http://blackboard.umbc.edu The End Property Examples With Sheet1.Range("A1") ′ A1 treated as an anchor Range(.Cells(1, 1), _ .End(xlDown).End(xlToRight)).Select End With With ActiveSheet.Range("A1") Range(.Offset(0, 1), .End(xlToRight)).Name = _ "ScoreNames" Range(.Offset(1, 0), .End(xlDown)).Name = _ "EmployeeNumbers" Range(.Offset(1, 1), _ .End(xlDown).End(xlToRight)).Name = "ScoreData" End With http://blackboard.umbc.edu Exercise Download Lab2_Student.xls from Blackboard. 1) Use the Offset and End properties of Range object to name range from A2 to the end of the column as “NEmployees”, range B1 to the end of the row as “NScores”, and the rest of the range - B2 to F19 as “ScoreData”. 2) Do some formatting using the range names and the With-End With construction: make the font of the NEmployees Range in bold and blue color; change the font of the NScores Range to italic, in red and centralize the text (using the HorizontalAlignment property). http://blackboard.umbc.edu