Visual Basic for Applications (VBA) • An object-oriented programming language – Instructions for the manipulation of objects – A structured way to provide instructions to Excel • Excel has an Object Library that defines its set of objects (e.g. workbooks, charts, ranges of cells) Logic of Language • First part of a command identifies the object • Second part of command: – Sets a property of the object (e.g. color or font) – Takes an action on the object (e.g.copy or move) – Sets an attribute to the object (e.g. assigns a value to it using := ) Example of an Instruction • Application.Workbooks(“Book1.xls”).Work sheets(“Sheet1”).Range(“A1”).Font.Name= “Arial” • Application.Workbooks(“Book1.xls”).Work sheets(“Sheet1”).Range(“A1”) is the object • Font.Name=“Arial” is the property being set Control of VBA • A Procedure is a set of instructions that operate on a set of objects • A Function is a procedure that returns a value as a result • A Subroutine is a procedure that can be run or used by another macro VBA Toolbar (Excel 2003) Developer Tab (Excel 2007) BlueCell Macro Sub bluecell() ' ' bluecell Macro ' With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 16777062 .TintAndShade = 0 .PatternTintAndShade = 0 End With End Sub Running Macros • • • • Run Macro option Shortcut Keys: [Ctrl][Shift] letter Command Buttons Custom Toolbar Running Solver through a Macro • Solver dialog box must have been opened at least once in current Excel session (i.e. Solver must be currently activated in Excel) • SolverSolve UserFinish:=True • Tools Reference option in VBA must have Solver selected • Other VBA commands for controlling Solver in class handout Debugging VBA Code • When VBA encounters a problem, it will highlight line in yellow. • Use [f8] key to step through code • Use the Reset icon button (square) at top of VBA to exit step-through mode and troubleshoot code or Excel/VBA settings. Cannot retry macro until yellow highlight is gone. Plotting the Efficient Frontier – Version 1A Command Button Private Sub EfficientFrontier_Click() Range("C53") = Range("B59") SolverSolve UserFinish:=True Range("D59") = Range("C51") End Sub Plotting the Efficient Frontier – Version 1B Command Button Private Sub EfficientFrontier_Click() For unit = 1 To 11 Range("C53") = Range("B" & 58 + unit) SolverSolve UserFinish:=True Range("D" & 58 + unit) = Range("C51") Next unit End Sub