visual basic for excel 97-2000-xp

Upload: lonpm2

Post on 09-Apr-2018

229 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    1/44

    Visual Basic for Excel97/2000/XP

    Practical workbook

    University of Bristol Information Services document exlvba-t1

    Aims and Learning ObjectivesBy the end of these notes, you will know the basics of programming using Visual Basic for Excel. You will also be able to: record macros; write small subroutines and functions to automate some of the processes in your

    spreadsheets; use those functions within workbooks; use Excel workbook functions within Visual Basic; use Procedures; display message boxes and obtain input from the user; begin to apply error trapping to your procedures; create a simple form that can be displayed and used to input information into a macro

    and receive results from a macro.

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    2/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Document Information

    Course documents and files

    N/A

    Related Documentation

    Other related documents are available from the web at:

    www.bristol.ac.uk/is/learning/documentation/docs-by-category.html#ss

    Other books are available:

    Writing Excel Macros, Steven Roman, (Excel 97 and 2000) O'Reilly http://www.oreilly.com/Excel 97 Programming for Windows for Dummies, John Walkenbach

    Excel 2000 Programming for Dummies, John Walkenbach

    Excel 2002 Power Programming with VBA, John Walkenbach (Wiley and sons)

    Keyboard shortcuts

    The following keyboard shortcuts may be of use whilst using these notes: To open the Visual Basic Editor (VBE) or switch between the

    VBE and your workbook. Use within the VBE window to obtain help on VB functions,

    objects and properties. Click within the word you require helpwith (do not select the word) and press .

    Toggle breakpoints position your cursor on a macrostatement within the Visual Basic editor and press to seta breakpoint. When the macro is run, processing issuspended at the breakpoint(s) to allow you to inspectvariable values and see what is going on.

    To clear all breakpoints.

    Use within the VBE window to display the Object Browser window.

    Visual Basic for Excel 97/2000/XP (October 07)www.bristol.ac.uk/is/learning/documentation/exlvba-t1/exlvba-t1.doc

    If you have any comments or queries about this document mail [email protected].

    2007 University of Bristol. All rights reserved.

    http://www.bristol.ac.uk/is/learning/documentation/docs-by-category.html#sshttp://www.oreilly.com/http://www.oreilly.com/http://opt/scribd/conversion/tmp/scratch2363/www.bristol.ac.uk/is/learning/documentation/exlvba-t1/exlvba-t1.dochttp://www.bristol.ac.uk/is/learning/documentation/docs-by-category.html#sshttp://www.oreilly.com/http://opt/scribd/conversion/tmp/scratch2363/www.bristol.ac.uk/is/learning/documentation/exlvba-t1/exlvba-t1.doc
  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    3/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Contents

    Keyboard shortcuts

    Related documentation

    Task 1 Virus protection ........... ............ ........... ............ ............ ......... ..... ..... .... 1

    Task 1 Virus protection ............ ........... ............ ............ ........... ............ .... ..... ..... ..... . 1

    Task 2 Recording a macro ........... ............ ........... ............ ............ ..... ..... .... .... 2

    Task 2 Recording a macro ............ ........... ............ ............ ........... ........ ..... ..... ..... .... 2

    Task 3 Relative reference macros ............ ........... ............ ............ ..... ..... ..... .. 3

    Task 3 Relative reference macros ........... ........... ............ ............ ......... ..... ..... ..... ... 3

    Task 4 Editing a recorded macro ........... ........... ............ ...... ..... ..... ..... ..... ..... 5

    Task 4 Editing a recorded macro ........... ............ ............ ........... ............ ............ ..... 5

    Task 5 Simple loop structures ........... ............ ............ ............ ........... ....... ..... 7

    Task 5 Simple loop structures .......... ............ ............ ............ ........... ........... ..... ..... . 7

    Task 6 Debugging a macro ........... ........... ............ ............ .......... ..... ..... ..... ... 9

    Task 6 Debugging a macro ........... ............ ............ ........... ............ ...... ..... ..... ..... .... 9

    Task 7 Using the Range object .......... ............ ............ ............ ........... ..... ..... 10

    Task 7 Using the Range object ........... ............ ........... ............ ............ ....... ..... ..... . 10Task 8 Creating a function ............ ............ ........... ............ ............ ...... ..... .... 11

    Task 8 Creating a function .......... ............ ............ ............ ........... ........... ..... ..... ..... 11

    Task 9 Rearrange macro ........... ........... ............ ............ ........... ....... ..... .... .... 12

    Task 9 Rearrange macro ............ ........... ............ ............ ........... ......... .... ..... ..... ..... 12

    Task 10 Yes/No inputs ........... ............ ............ ........... ............ ............ ......... .. 14

    Task 10 Yes/No inputs ............ ........... ............ ............ ............ ........... ............ ..... ... 14

    Task 11 Error trapping and GoTo ........... ............ ............ ............ ....... ..... .... 16Task 11 Error trapping and GoTo ............ ............ ........... ............ .......... ..... ..... ..... 16

    Task 12 MsgBox: Text & numerical values ........... ............ ............ ......... .... 17

    Task 12 MsgBox: Text & numerical values ............ ............ ........... ............ ..... ..... 17

    Task 13 Applying formats using macros ........... ............ ............ ..... ..... ..... . 18

    Task 13 Applying formats using macros ............ ........... ............ ....... ..... ..... ..... ... 18

    Task 14 Text functions ............ ............ ........... ............ ............ ........ ..... ..... ... 20

    Task 14 Text functions ........... ............ ........... ............ ............ ........... ..... ..... ..... ..... 20

    Task 15 Worksheet functions in VB ............ ........... ............ ....... ..... ..... ..... .. 22

    Task 15 Worksheet functions in VB ............ ............ ............ .......... ..... ..... ..... ..... .. 22

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    4/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 16 InputBox ........... ............ ........... ............ ............ ........... ......... ..... ..... . 23

    Task 16 InputBox ........... ............ ............ ............ ........... ............ ............ ..... ..... ..... . 23

    Task 17 Creating and using a simple form ........... ............ ......... ..... ..... ..... . 24

    Task 17 Creating and using a simple form ............ ............ ........... ..... ..... ..... ..... .. 24

    Appendix A Programming structure...................................................................27

    Appendix B Visual Basic objects........................................................................33

    Appendix C Declaration and scope of variables................................................37

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    5/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Introduction

    Excel is the University's recommended spreadsheet product for Windows on PCs.This document is intended for the more experienced user of Excel who wishes tomake use of Visual Basic for Applications (VBA).

    This document does not intend to teach VBA or even the concepts of object-orientedprogramming. Instead the examples in this document have been devised to showvarious aspects of Visual Basic for Excel. John Walkenbach's book in the "...for Dummies" series (see Related Information) gives a good explanation of these.

    When attending courses in the training rooms in the Computer Centre the workingfiles and solutions referred to in this document are located in the directoryC:\User\Excel. If you are working on your own system, you need to download the file:http://www.bristol.ac.uk/is/learning/documentation/exlvba-t1/exlvba-t1.exe , copy it toa folder on your hard disk and run it before starting these notes.

    In many cases there is continuation from one example to the next. If you wish to skipa particular exercise you will need to load the solution file to the previous example.When working through the examples you may also like to try modifying them in order to make them applicable to your own uses of Excel.

    Prerequisites

    It is essential that you have grasped the concepts of names and conditionalfunctions, covered in the document Further Excel XP (document excelxp-t3 - see theRelated Documentation section for the location of this document on the web). Someexperience of structured programming will be an advantage.

    Acronyms

    VB Visual Basic

    VBA Visual Basic for Applications

    VBE Visual Basic Editor

    http://www.bristol.ac.uk/is/learning/documentation/exlvba-t1/exlvba-t1.exehttp://www.bristol.ac.uk/is/selfhelp/documentation/excelxp-t3/excelxp-t3.dochttp://www.bristol.ac.uk/is/learning/documentation/exlvba-t1/exlvba-t1.exehttp://www.bristol.ac.uk/is/selfhelp/documentation/excelxp-t3/excelxp-t3.doc
  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    6/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 1 Virus protectionObjectives To enable/disable Excels macro virus protection.

    Comments There are many problems with viruses that attach maliciousexecutable files to applications. These are macros that are designed to causedamage and are built using all the flexibility and power that a Visual BasicApplication offers the genuine programmer. Excel 97 and later versions haveoptions to warn you if a spreadsheet or workbook that you are about to opencontains macros.

    The solution files used for this practical document and the files you will createwhen working through these notes will contain macros that you will wish torun. You will therefore need to enable macros when opening them. However,it is not a habit you should get into - always consider each file on an individualbasis and only enable macros if you believe them to be genuine. Incidentally,a poorly written macro could also cause unintended damage, so alwayscheck your own macros carefully before distributing them amongst

    colleagues/research groups.

    1.1 Excel 97: From the Tools menu select Options .

    Select the General tab and ensure that Macro virus protection is selected.

    Click on OK .

    1.2 Excel 2000/XP: From the Tools menu, select Macro / Security .

    Using the Security Level tab, read the available options and select Medium .

    Click on OK .

    Note With this option enabled you are prompted to take action if a spreadsheetcontains macros. You can choose to open the workbook with the macrosenabled, disabled or to not open the workbook at all. If you disable themacros, you will be unable to run any macros or recalculate custom functions.You can still examine and edit the macros. When you click Save on the Filemenu, the macros are saved. You can then close the workbook and open itagain with macros enabled if you want to run the macros.

    Enabling the Macro virus protection only offers a warning to the existence of amacro . It does not scan the workbook for known prank macros.

    Additional virus protection software is available for this purpose.

    If you wish to know more about viruses and the virus protection availablewithin the University, please see the online information available fromhttp://www.bristol.ac.uk/is/computing/advice/virus/ .

    1

    http://www.bristol.ac.uk/is/computing/advice/virus/http://www.bristol.ac.uk/is/computing/advice/virus/http://www.bristol.ac.uk/is/computing/advice/virus/
  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    7/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 2 Recording a macroObjectives To record a simple macro to perform a repetitive task automatically.

    Comments Although using macros may seem difficult at first, recordingand playing back macros in Excel is really very easy.

    2.1 Using a new (blank) workbook, select cell A1 .

    2.2 From the Tools menu, click on Macro and Record New Macro .

    2.3 In the Macro Name box enter the macro name Company_name.

    Assign a Shortcut key by selecting the Ctrl+ box and pressing .

    Under Store macro in, select This Workbook .

    Edit Description as required and click on OK .

    2.4 Select cell A1 and type The University of Bristol

    Select A1 and format it as Times New Roman, size 24, Bold and Italic.2.5 Stop recording the macro (click on the Stop icon on the Stop Recording

    toolbar).

    Note If the Stop Recording toolbar is not available, you could display it using theView/Toolbars/Stop Recording . However, this would then be inserted intoyour macro and the toolbar displayed every time the macro is run. Use thealternative method instead:

    From the Tools menu, select Macro and Stop Recording .

    If you fail to stop recording the macro at this stage, you will create an infinite

    loop of record and playback.2.6 Select Sheet2 and cell A1 .

    Note If you do not have a Sheet2; from the Insert menu, select Worksheet .

    2.7 From the Tools menu, select Macro and Macros .

    Select Company_name , click on Run and watch the result.

    2.8 Select Sheet3 and click in cell A1 .

    Run the macro again, this time by pressing + .

    2.9 Insert a new Worksheet and click in a cell other than cell A1.

    Run the macro again and observe where the title heading and formatting areinserted.

    2.10 Do not close the current workbook.

    2

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    8/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 3 Relative reference macrosObjectives To record a simple macro to perform a repetitive task automatically, relative to

    the macros starting point.

    3.1 Create a new (blank) workbook.3.2 Select A1 . From the Tools menu, select Macro and Record New Macro .

    3.3 In the Macro Name box enter the macro name Months .

    Assign a shortcut key by selecting the Ctrl+ box and pressing .

    Again, store the macro in This Workbook .

    Choose OK .

    3.4 Click on the Relative reference icon (on the Stop Recording toolbar) torecord your macro relative to its starting position. When this icon has asunken aspect, then Relative address mode is set.

    Note In any session VBE remembers various settings such as these betweenvisits so check the setting is the desired one before starting recording moremacros. It is recommended that you specify the Relative Reference optionso that your macro turns out correctly no matter what cell you start in, relativeto your starting position. If this option is not selected, Excel uses absolute cellreferences. This means that the macro always starts in the same cellreference as in the previous task.

    Note If the Stop Recording toolbar does not appear, first stop your macro fromrecording:- From the Tools menu, select Macro , Stop Recording.Add the Stop Recording toolbar to the list of available options:- From the View menu, select Toolbars , Customize .- Select Stop Recording from the list of available toolbars and click onClose .You will now need to start recording your macro again from task 3.2.

    3.5 Type January then copy (auto-fill) this across the row to cell L1, to getJanuary:December .

    Change the format of the cells; for example, font, size, bold, etc.

    Format these cells so that they are vertically aligned (orientation 90 degrees).

    Select the columns A:L and AutoFit the column selection to make them best-fit.

    3.6 Click in cell A2 and Stop recording the macro (as in task 2.5).

    3.7 Select Sheet2 and click in any cell other than A1 .

    Run the macro ( + ) and watch the result. Do not close theworkbook.

    Note These macros have been saved in the relevant workbooks. When theworkbook is closed, any macros available within it will no longer be availableto open workbooks. If you then want to create macros available for use in allyour workbooks you will need to store them in the Personal Macro Workbook.To do this, select Personal Macro Workbook from the Store macro in thedropdown box of the Record Macro dialog box (in task 3.3).

    3

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    9/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    If you want to make any changes to the macro (as in the next task) you willfirst need to unhide personal.xls. From the Window menu, select Unhide andwith personal.xls highlighted, click on OK .

    When you quit Excel you will be asked if you wish to save the changes madeto the personal macro workbook. If you click on Yes, the file personal.xls isopened as a hidden workbook.

    Personal.xls is stored in the folder (for a default installation of Windows NT):c:\winnt\profiles\username\Application Data\Microsoft\Excel\XLStartOR: (for a default installation of Windows 2000/XP):C:\Documents andSettings\username\ApplicationData\Microsoft\Excel\XLSTART.

    The personal.xls workbook is opened next time you start Excel and is notavailable to other users.

    4

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    10/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 4 Editing a recorded macroObjectives To introduce the Visual Basic Editor (VBE).

    Comments Quite complicated macros can be written simply by recordingtasks as you have done above. However, Excel converts these tasks to aprogramming language called Visual Basic. More advanced macros can bewritten in this language.

    4.1 From the Tools menu, select Macro and Macros .

    Select Months and click on Edit .

    Figure 1 - Visual Basic editor (months macro)

    The Microsoft VBE appears similar to Figure 1 .The left-hand pane shows what projects (i.e. workbooks) are being used andlists the items (Sheets and Modules) in a particular project. In general themacros you create are stored in a module. Double-clicking on this pane

    allows navigation between modules in the same or different workbooks.The right-hand pane contains the contents of the current module you areworking on.

    Your macro is listed in the module window as a subroutine (Sub).

    4.2 Take a look at the programming used for your Months macro.

    4.3 You may also like to look at the Company_name macro created in task 2 tosee how the relative references make a difference. Using the left-hand pane,navigate to VBA Project (Book1)/Modules/Module1 (replacing Book1 withthe name of your workbook).

    4.4 Return to the Months module and, if you wish, make a small change (such asthe font size). Make sure that you modify the last occurrence of .Size= in themacro. In some cases, such as the simple macros recorded so far, it may bequicker to delete and re-record the macro than edit the code.

    5

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    11/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    4.5 From the File menu, select Close and Return to Microsoft Excel . If youmade any changes to the code, run your macro again.

    4.6 Close any open Excel workbooks, discarding changes .

    Note This example shows how some objects are referenced in VBA and illustrates theWITH END WITH programming structure. Appendices A and B define other programmingstructures, common programming terms, and give more information about Visual Basicobjects . Now would be a good time to take a brief look at these notes.

    Lines that are just text comments and not Visual Basic commands arepreceded with a single quotation mark.

    If you forget to assign a shortcut key (such as + ) to a macro at thetime of recording, you can assign one later by returning to the workbook and,from the Tools menu, selecting Macro/Macros and the Options button.

    6

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    12/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 5 Simple loop structuresObjectives To write a macro to enter values into a workbook using a simple loop

    structure.

    Comments This task uses a single, self-contained subroutine and there isno need to explicitly declare any variables used. See the note at the end of this task for a caution on using variables in this manner. It introduces thecells object as a way of referencing a particular cell

    5.1 Create a new (blank) workbook.

    5.2 From the Tools menu, select Macro / Visual Basic Editor (or press + ).

    5.3 From the Insert menu, select Module .

    A new (empty) module appears in the right-hand pane of the VBE (if OptionExplicit is entered at the top of your module, highlight and delete it). This

    module will contain your Visual Basic code.5.4 From the Insert menu, select Procedure .

    5.5 In the name box, type myloop and click on OK .

    5.6 In Excel spreadsheets we refer to cells by their column letters and rownumbers (for example, A1 ). In a Visual Basic procedure we can use the cellsobject, for example cells(1,A) , to refer to cells in the same way see thefollowing example.

    Enter the code (in bold below):

    Public Sub myloop() Rw = 1

    For Numb = 1 To 100Cells(Rw, A) = NumbRw = Rw + 1

    Next NumbEnd Sub

    In this example the column used is fixed ( A). The first number is entered incolumn A, row 1 and increased by 1 until all the numbers (up to 100) havebeen entered.

    Note In macros it is usually more flexible to refer to columns by a number rather then by a letter. The cells object allows this, for example cells(1, 2) refers to

    the same cell as cells(1,B).5.7 From the Run menu, select Run Sub/UserForm (or press ).

    If you had more than one procedure (or form) you would be asked to selectthe one you wished to run.

    5.8 Switch back to the worksheet to see the results ( + ).

    Note Terminology - your recorded macro has been saved as a subroutine within amodule in your workbook.

    Indentation is used in the program loop above. This makes it easier to followthe various structures within procedures. See Appendix A for a definition of common programming terms and examples of other ways of getting code tobe repeated.

    7

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    13/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    This example makes use of variables that we choose to call Rw and Numb .They contain temporary values that are changed as the macro is run. Wehave not specified what kind of values are to be stored in these variables. Asprogramming beginners this is probably the best course of action. VisualBasic treats these variables as of type Variant and is very tolerant of the kindof information that can be stored in them. Sometimes this tolerance can leadto undesirable errors. See Appendix C for information on how you can specifyvariables more precisely.

    8

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    14/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 6 Debugging a macroObjectives To introduce the Visual Basic debugger.

    Comments Some mistakes in coding a program will cause Visual Basic togive an error message. Clicking on will enter the VBE, highlightingthe error.

    6.1 Using the macro created in the previous task, switch to the VBE (press+ ).

    6.2 Alter the line Cells(Rw, "A") = Numb to: Cells(Rww, "A") = Numb

    Figure 2 - run-time error message box

    Re-run the macro; a runtime error message dialog box is displayed, see

    Figure 2.Click on Debug .

    You should now be in the Visual Basic run-time debug mode with the linecausing the problem highlighted.

    6.3 Position the mouse cursor over a variable, for example Number . Note that thecurrent value for the variable is displayed.

    6.4 Position the cursor over the misspelt variable, Rww . The text Rww = Emptyis displayed.

    6.5 Correct the mistake (remove the extra w).

    6.6 From the Visual Basic Run menu, select either:Continue to resume processing the macro, OR:

    Reset and then switch to the worksheet before re-running the macro.

    Note When editing a Visual Basic macro you can position the cursor on a macrostatement and set (or unset) breakpoints (from the Debug menu, selectToggle Breakpoint or press ). When the macro is next run, executionwill stop before the statement and enter into the debug mode. You can theninspect variables and see what is going on. To restart the macro, from theRun menu, select Continue . To clear all breakpoints, from the Debug menu,select Clear All breakpoints (or press + + ).

    9

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    15/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 7 Using the Range objectObjectives To format a particular range of cells in a chosen way.

    Comments This task introduces the Range and Selection objects and the With EndWith language construct.

    7.1 Switch to the VBE.

    7.2 Insert the following lines (in bold) immediately above the End Sub statement:

    Range(A1:A100).SelectWith Selection.Font

    .Name = Arial

    .Size = 14End With

    Note We can refer to ranges of cells as Range("A1:J10") or even Range(A1,J10) . The latter format allows us to specify two arguments which define the

    start and end cells respectively. Using the cells object to specify thesearguments enables us to replace actual numbers with variables For example: Range(cells(1,2),cells(rw,2)) defines a range in column B thatbegins at row 1 and ends at the row rw (i.e. if rw contains 3 the range wouldbe $B$1:$B$3)

    The Select method of the Range object is used to highlight a particular range. The Selection object refers to whatever range is highlighted.

    Cells can have their format attributes set directly. For example,Range(A1:A100).Font.Name = Arial

    Quite often it is convenient to use the With End With language constructso that the attributes of a range of cells can be set without repeating therange specification each time. NB References to objects within the constructthat begin with . are assumed to have the With object as their parentobject.

    7.3 Switch to the spreadsheet, delete the contents and run the myloop macro.Note the effect of the formatting on the cells.

    7.4 Close your workbook. There is no need to save it.

    10

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    16/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 8 Creating a functionObjectives To demonstrate how user-defined functions can be easily created and used.

    Comments Excel has a large number of functions available, but there aretimes when it is necessary to create a user-defined function to perform aparticular calculation. These functions cannot be created using the macrorecord and playback actions within Excel, but must be entered into the VBE.

    8.1 Create a new workbook.

    8.2 Open the VBE (use as a shortcut).

    8.3 From the Insert menu, select Module .

    8.4 From the Insert menu, select Procedure .

    In the Add Procedure dialog box, enter the name times100 and from theType section, select Function (Public should already be selected from theScope section).

    Click on OK .

    Note A user-defined function is used in the same way as an Excel function. It has aname (in this case, times100 ) and a number of arguments (in some cases,zero). We will define a function that takes one numeric argument, multiplies itby 100 and returns the result.

    8.5 Place the cursor between the brackets on the first line.

    8.6 Enter a variable name for the argument; for example, n .

    8.7 Move the cursor to the empty line of the function and enter the commandtimes100 = n * 100 .

    Your function should be similar to the one below:

    Public Function times100(n)times100 = n * 100

    End Function

    8.8 Switch to the worksheet, select cell A1 and enter a value.

    8.9 In cell B1 , enter the function =times100(A1) .

    Note Functions and subroutines created in VBA are not case-sensitive.

    8.10 Try changing the value in cell A1 and note the result.

    8.11 Close and Save this workbook; you will need the function in a later task.

    11

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    17/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 9 Rearrange macroObjectives To create an application to rearrange student marks for processing.

    Comments Try typing the subroutine in lower case and notice how theeditor formats your commands.

    This task assumes a working knowledge of cell and range names (covered indocument exl00-t3).

    It introduces the Set statement that is used to assign a range to a rangeobject variable. This variable can then be used wherever you would normallyuse the range.

    9.1 Open the file Exam1.xls (in Computer Centre training rooms, this is in thefolder C:\User\Excel). The worksheet contains some subject results for fictional students ( Figure 3 ).

    Figure 3 - Exam1.xls (fictional table of results)

    Figure 4 - sample of rotated data

    This task will rotate those results ( Figure 4 ) in order to make use of other features within Excel such as PivotTables .

    9.2 Highlight the range A1:G13 and define a range name, area .

    Click in cell I1 and define a name, areaoutstart .

    9.3 Switch to the VBE and insert a new module .

    Insert a new procedure (subroutine) named rearrange .

    12

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    18/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    9.4 Enter the code below (in bold):

    Note The following text is available in the working folder as task9_4.txt to copy andpaste if you prefer not to type it. Take a few moments reading through thecode to get an idea of the structure and what might be happening.

    Public Sub rearrange()

    Set ar = Range("area")Set arout = Range("areaoutstart")

    ncols = ar.Columns.Countnrows = ar.Rows.Count

    aroutr = 2countblankcells = 0

    arout.Cells(1, 1) = "Name"arout.Cells(1, 2) = "Subject"arout.Cells(1, 3) = "Mark"

    For r = 2 To nrows

    For c = 2 To ncolsIf Not IsEmpty(ar.Cells(r, c)) Then

    arout.Cells(aroutr, 1) = ar.Cells(r, 1)arout.Cells(aroutr, 2) = ar.Cells(1, c)arout.Cells(aroutr, 3) = ar.Cells(r, c)aroutr = aroutr + 1

    Elsecountblankcells = countblankcells + 1

    End If Next c

    Next r

    End SubNote The variable countblankcells is used to calculate the number of blank cells

    encountered when running the macro. The total number will be displayed atthe end of the macro (see task 12).

    For programming flexibility we make use of variables (in this case ar andarout ) to point at the input and output ranges. Such variables must beassigned values using the Set command rather then just using the =assignment statement.

    Without any leading range qualifier, cells references all the cells within thecurrently active worksheet. But with a leading range object it is made toreference the cells relative to that particular range. For example,ar.cells(1,1) , references the first cell in whatever range that ar points at.

    The solution example, vbexam_a.xls, contains comments to explain the useof these variables and functions.

    9.5 Switch back to the worksheet (click on the icon in the Status bar or use ).

    9.6 Save your workbook.

    9.7 From the Tools menu, select Macro/Macros and with the rearrange macroselected, click on Run .

    13

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    19/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 10 Yes/No inputsObjectives To display a message box requesting input from the user of the macro and

    use that input to determine what actions your macro will take.

    Comments If you have not successfully completed the previous task, youwill need to open the solution file vbexam_a.xls before starting.

    10.1 Switch to the VBE.

    10.2 At the top of your macro module (immediately below the linePublic Sub rearrange()), insert a new line and add the linemacroname = rearrange.

    This name will be used for message display in the dialog boxes createdbelow.

    10.3 Insert a new row between nrows = ar.Rows.count and aroutr = 2 .

    Type the following code (shown in bold):

    nrows = ar.Rows.Count

    arout.worksheet.activatearout.Range(Cells(1, 1), Cells(1, 3)).SelectMsg = "This macro may overwrite cells starting at range shown."Reply = MsgBox(Msg & vbCr & _

    "Do you want to continue?", vbYesNo, macroname)If Reply vbYes Then

    MsgBox "Macro abandoned", vbOKOnly, macronameExit Sub ' quit the macro

    End If

    aroutr = 2Note When selecting cells that may be in different worksheets from the Activesheet

    it is necessary to activate the desired worksheet first - the activate statementis used here to do this.

    As you type functions, for example MsgBox, you will notice that the editor displays the parameters required by that function. Appropriate dropdownboxes also provide shortcuts as you type your procedures.

    The ampersand character, &, is used to string together text strings and textvariables whilst the underscore character, _ , allows you to continue a single

    line command on the following line for display purposes. Blank spaces areignored. Indentation in an application is used to make the program easier toread and debug.

    The standard constant vbCr is used to insert a carriage return into your dialogbox.

    The standard constant vbYes is returned if the Yes button is clicked in replyto the message.

    The operator is used to denote not equal to.

    10.4 Switch back to the worksheet and save your workbook.10.5 Highlight and delete the results of the previous task and from the Tools menu,

    select Macro/Macros and with the rearrange macro selected, click on Run .

    14

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    20/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Test your macro using both No and Yes inputs to your dialog box.

    10.6 Take a few moments to read the comments (preceded by a singleapostrophe) in the solution file vbexam_b.xls.

    15

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    21/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 11 Error trapping and GoToObjectives To introduce some error trapping.

    Comments The rearrange macro created in the previous tasks requiresthat two range areas be defined before the macro is run. If these ranges arenot defined, Excel will generate an error and the macro will fail. By checkingfor this error, you can display a sensible message and exit the macro cleanly.

    11.1 Using the macro created in the previous task switch to the VBE.

    If you have not successfully completed the previous task, you will need toopen the solution file, vbexam_b.xls , before starting.

    11.2 Immediately beneath the line macroname = rearrange, insert a new lineand type: On Error GoTo errmsg

    If the ranges area and areaoutstart have not been defined in your spreadsheet, the macro will jump to a point labelled errmsg (defined below in

    task 11.4).11.3 Beneath the lines set ar and set arout add the command

    On Error GoTo 0 . This section of code should now resemble:

    On Error GoTo errmsgSet ar = Range("area")Set arout = Range("areaoutstart")On Error GoTo 0

    Any errors encountered from this point on in your macro will display thenormal system errors rather than the one you specify in the errmsg section.

    11.4 Scroll to the end of the macro and add an errmsg section immediately above

    the last (End Sub) line:errmsg:MsgBox "Bad input/output range.", vbOKOnly

    End Sub

    11.5 Immediately above the errmsg: line, add a new line Exit Sub to ensure thatthis error message is only reached from the GoTo command entered in task11.2.

    11.6 Switch to the spreadsheet and save your workbook.

    11.7 Delete your previous output and check that the macro runs without error.

    Try deleting one or both of the range names (from the Insert menu, selectName / Define ) and test the macro again.

    Note You may also wish to check that the selected input range ar is sufficiently bigand that the output range areaoutstart is not within the input range, area .Your macro should then exit after displaying a dialog box.

    Open and examine the example spreadsheet vbexam_c.xls for a suggestedsolution to this additional checking.

    11.8 Close and reopen your workbook without saving any changes.

    16

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    22/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 12 MsgBox: Text & numerical valuesObjectives To calculate the number of lines output by the rearrange macro and output

    the result in a dialog box together with the total number of blank cellsencountered (if any).

    Comments The variables aroutr and countblankcells introduced in task 9contain the values required for this exercise.

    12.1 If you have not completed the previous tasks, first open vbexam_c.xls.

    12.2 Switch to the VBE and scroll to the foot of your macro.

    12.3 Between the lines Next r and Exit Sub , add the following code:

    If aroutr > 1 Thenarout.Cells(aroutr - 1, 3).SelectMsgBox "This macro has output " & _ Str(aroutr - 2) & " lines." & vbCr & _

    "It found " & Str(countblankcells) & _ " blank cells.", vbOKOnly, macronameElse

    MsgBox "No lines output!", vbYesNo, macronameEnd If

    12.4 From the File menu (still within the VBE), select Close and Return toMicrosoft Excel .

    12.5 Save your workbook and test the macro.

    Note Vbexam_d.xls contains a working solution to this exercise.

    12.6 Close any open workbooks. There is no need to save changes.

    17

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    23/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 13 Applying formats using macrosObjectives To produce a small Visual Basic Application (VBA) that checks the current

    formatting of cells within a worksheet and removes the percentage sign if aparticular format has been used.

    Comments This task assumes that you have successfully completed task8.

    13.1 Open the file created in task 8 (Creating a function) and press + to switch to the VBE.

    Insert a new Procedure , named RemoveSign (type = Sub ,Scope = Public ).

    13.2 We first need to select the last cell in use within the active worksheet. Enter the following code into your procedure:

    ActiveSheet.Cells.SpecialCells(xlLastCell).Select

    ir = ActiveCell.Rowic = ActiveCell.Column

    For rw = 1 To ir For col = 1 To icIf IsNumeric(Cells(rw, col)) And Not _

    IsEmpty(Cells(rw, col)) Then in_no = Cells(rw, col)

    If Cells(rw, col).NumberFormat = "0.00%" ThenCells(rw, col) = times100(in_no)Cells(rw, col).NumberFormat = "General"

    End If

    End If Next colNext rw

    Note Working through this code from top to bottom:

    The last cell in the worksheet is located and the variables ir and ic are set tothe row and column position values of that cell.

    The For Rw and For Col structures ensure that the procedure loopsthrough each row and column used in the worksheet.

    The first If End If structure checks to see if the current cell is not empty andthat its value is numerical. If these conditions are not met, the proceduremoves to the next column/row. If the conditions are met, the variable in_no isset to the value of the current cell and the next IfEnd If statement looks tosee if the current value is formatted as a percentage with 2 decimal places. If it is, the value is multiplied by 100 (using the function created in task 8) and ageneral format applied.

    13.3 Switch to the worksheet view, save your file and enter some values in your worksheet (ensuring you have one or more numeric values formatted aspercentages with 2 decimal places).

    13.4 Test your VBA (vbformat.xls contains a working solution with some samplevalues to test it on).

    18

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    24/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    13.5 The second IfEnd If statement in the above code could be extended to dealwith Percentage formats with different numbers of decimal places (see thecommented out section of vbformat.xls).

    13.6 Close any open workbooks.

    19

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    25/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 14 Text functionsObjectives To create a function to reverse text strings and use this function to extract a

    surname from a text string containing a full name.

    Comments The application assumes that the surname is the last word in astring. You may wish to extend this task to take into consideration surnamessuch as in Daphne du Maurier or van der .

    14.1 Start a new workbook.

    14.2 In cell A1 , enter the text Name .

    Enter the names Mr A B Brown, Pat Smith, Dr White and A B C Evergreenin cells A2 , A3 , A4 , A5 respectively .

    Resize column A to fit the text entered.

    14.3 In cell E1 , enter the text Surname .

    14.4 Open the VBE.14.5 Create the function rev as below:

    Public Function rev(t)rev = ""ct = Len(t)For i = ct To 1 Step 1

    rev = rev & Mid(t, i, 1)Next i

    End FunctionNote StrReverse was introduced as an Excel Visual Basic function with the

    release of Excel 2000. If you are using Excel 2000, try the simpler methodbelow:

    Public Function rev(t)rev = StrReverse(t)

    End Function

    14.6 Return to the worksheet and select B2 .

    Enter the formula =rev(A2) to calculate the reverse of the string in cell A2 .

    Resize column B if necessary.

    14.7 In cell C2 , enter the formula =FIND(" ",B2) to find the location of the firstspace character in the text string in cell B2 .

    As B2 now contains the reverse of the original text string, this locates thelocation of the last space character in the original string.

    14.8 In cell D2 , enter the formula =LEFT(B2,C2-1).

    This takes the left hand side of the reversed string up to, but not including, thespace character. In other words, the surname part of the original text stringreversed.

    Note If there are no spaces in the original name, then the formula in column C willproduce an error. In this case additional steps can be taken to deal with thisscenario.

    14.9 In cell E2 , enter the formula =rev(D2) to reverse the string and return thesurname as required.

    14.10 Copy the formulae in the range B2:E2 into rows 3 to 5.

    20

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    26/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    14.11 Select columns B:D and from the Format menu, select Column/Hide .

    Note See vbreverse_a.xls for a working solution.

    This function could be extended to include the actions performed by columnsB to E. The next task demonstrates this.

    21

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    27/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 15 Worksheet functions in VBObjectives To extract the surname from a text string containing a name.

    Comments This task reuses the text entered in the previous task but notthe function rev nor the formulae.

    15.1 If you completed the previous task, unhide columns B:D and delete theformulae in the range B2:E5 .

    Otherwise enter the text as described in tasks 14.1 to 14.3 above.

    15.2 Switch to the VBE.

    15.3 Create the following VB function:

    Function getSurname(t)backText = rev(t)spaceLoc = Application.WorksheetFunction. _

    Find(" ", backText)backSurname = Left(backText, spaceLoc - 1)getSurname = rev(backSurname)

    End Function

    15.4 Switch to the worksheet and click in cell B2 .

    Enter the formula =getSurname(A2) .

    15.5 Copy (drag & fill) this formula into the range B3:B5 .

    Note The file vbreverse_a.xls contains a working solution.

    Application.WorksheetFunction can be used before many (but not all)

    Excel Worksheet functions. Occasionally there is a VB function that doesapproximately the same job as a worksheet function in which case they willusually share the same name e.g. trim . Note the use of the wordapproximately the operation of VB trim is different from the worksheetfunction trim with respect to the treatment of internal spaces in strings!

    As you type your code, type Application.WorksheetFunction and examinethe list of options displayed in the dropdown box.

    There is a Visual Basic function called InStr that does the same job as theExcel Find function and would be more efficient to use. This task simplydemonstrates the use of an Excel worksheet function within a Visual Basic

    macro.

    22

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    28/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 16 InputBoxObjectives To obtain and use input from the user.

    Comments You must first have successfully completed task 15.

    16.1 With the worksheet created in task 15 open, switch to the VBE.16.2 From the Insert menu, select Procedure .

    16.3 Type the name Surname and click on OK .

    16.4 Complete the procedure as shown in bold:

    Public Sub Surname()

    myString = InputBox("What is the full name?")

    Msg = "The surname is "

    MsgBox Msg & getSurname(myString), vbOKOnly

    End Sub16.5 Run the procedure (press or from the Visual Basic Run menu, select

    Run Sub/UserForm ).

    16.6 When prompted, enter the name Dr P A Brown and click on OK .

    Note See vbreverse_b.xls for a working solution together with additional code for allowing the user to select the Cancel button (or press the key). Thesolution also deals with blank and numeric values entered into the dialog box.Using forms to obtain and display info.

    23

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    29/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Task 17 Creating and using a simple formObjectives To create a simple form (also called a dialog box) to obtain and display info.

    Comments More details about dialog boxes are given in document exlvba-t2.

    17.1 Open a new (blank) worksheet and switch to the VBE.

    17.2 In the Project Explorer window double click the appropriate project for the newbook

    Note This ensures you are going to be working on the new VB project rather thanany other VB projects you may have worked on previously.

    17.3 From the Insert menu, select Module

    Note You will need this module later to insert the macro code that will display theform when it has been created.

    17.4 From the Insert menu, select Userform

    Note Notice that a new kind of item Forms is now displayed in the Project Explorer window. This is where forms get stored. In the windows to the right you shouldsee an empty form design window labelled Userform1 and a Toolbox window

    17.5 Use the mouse to select the following controls on the Toolbox and drag themonto the form labelled UserForm1 (once on the form you can still use themouse to drag them to suitable positions avoid overlapping them) :

    the RefEdit controlthe TextBox controlthe CommandButton control

    Note In the Toolbox you can determine which control is which by resting the mouseon a control it will display the kind of control that it is in a popup window.

    If you ever lose the Toolbox window you can use the View / Toolbox VBEmenu command to show it again.

    17.6 Right click on any of the controls in the form and select Properties from thedrop down list.

    Note A list of all the properties that control the behaviour and look of the selected

    control is shown. Note that there is a (name) property for each control - this isused to identify the control in VB code. It and the other properties can bealtered either via the properties window or in VB code. Do not alter any of theproperties now.

    17.7 Double click on UserForm1 in the Project Explorer window to re-show theform currently being designed.

    17.8 Right click on the CommandButton1 control in the form design window andselect View Code from the drop down list.

    Note A window displaying the code that will be obeyed when the control getsclicked is displayed. Initially this code is:

    Private Sub CommandButton1_Click()

    End Sub

    24

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    30/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    17.9 Insert the following line before the End Sub line:

    If refedit1.value then call doit (refedit1.value)

    Note This line tests the refedit1 value against the null string (two consecutivedouble quotes) and only calls doit if it has a non-null value. The character string means not equal to.

    17.10 In the Project Explorer window double click on Module1 to bring up the emptymodule we inserted previously and type in the following code:

    Public Sub doit(add)Set rngvar = Range(add)UserForm1.TextBox1.Value = rngvar.Value

    End SubPublic Sub showform() UserForm1.ShowEnd Sub

    Note You have now provided a macro called showform that will display userform1and a function called doit that gets called when the command button on theform gets clicked. doit gets the value from a particular address and copies itinto the textbox1 control.

    Please note that by default the Show command displays a form so that theuser cannot to do anything further within Excel until a response is made to theform. To remove a form click the "X" icon at the top right of the form.

    17.11 Display the showform macro. To do this - switch to the Excel Workbook,enter some value into a cell and then run the showform macro.The form should now be displayed.

    17.12 Click on the right hand part of the refedit1 control (this is a grey rectangle witha black underscore in it).

    Note A small popup window labelled UserForm1 with an icon that has a little redarrow on it is displayed.

    17.13 Use the mouse to locate and click on the cell that you previously gave avalue.

    Note Note that the address of that cell has now been entered in the popup window.

    17.14 Click on the icon with the red arrow to return to the form.

    17.15 Now click the CommandButton1 control on the form. You should findwhatever value was in the cell has now been copied into the TextBox control.

    Note There are many types of controls that do fancy things. They are not alwaysavailable by default. The controls are stored in special files. In general thesefiles have to be located or downloaded. The VBE Tools, References menuitem can then be used via its browser to make the object(s) available to theVB language. The Tools, Additional Controls menu item can then be usedto add the control items onto the Toolbox window so they can be selected.

    The RefEdit control may not be available by default in Excel 97. It iscontained in a file called REFEDIT.DLL which is usually stored in theProgram Files/Microsoft Office/Office directory. It can be made available by

    25

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    31/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    using the VBE Tools References and Additional Controls menus as outlinedabove.

    26

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    32/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Appendix A..................Programming structureComments This appendix includes some definitions of programming terms and examples

    of common programming structures (constructs) available to you when writingVBA code. For further information on their use, please see the online helpsystem. Where square brackets [] are used, this indicates that this part of the structure is optional.

    For our purposes you can regard a program (or macro) as a number of statements that areinterpreted by the computer according to a set of syntactic rules.

    Each set of rules correspond to a particular language for instance there are languagescalled FORTRAN and VISUAL C.

    The language that is used in the Excel environment to provide macros is called VISUALBASIC FOR EXCEL.

    This language is used with slight differences for many other Office applications e g there is

    VISUAL BASIC FOR WORD.These are all grouped together as a product called VISUAL BASIC FOR APPLICATIONS (or VBA for short). The facilities available are identical except for the objects that are madeavailable for manipulation. For instance, by default, the ACTIVECELL object would beavailable in Excel but not in Word.

    They share a common editor (VBE for short) and navigation window environment (called thePROJECT EXPLORER).

    (There is also a stand alone product called just VISUAL BASIC which can be used to createstand alone executable programs and does not need an Office product to be running but

    this course is not concerned with this).Before you can start typing new macros or changing old ones you must go to the VisualBasic Editor (VBE) window, use the PROJECT EXPLORER window to select the project (i.e.the workbook your macros are associated with), and then either insert a new module or double click on an existing module - the statements associated with the module will then beshown in a separate window.

    Modules are attached to particular workbooks and used to store macros. There can be morethen one module in a workbook and each module can hold many macros. A Macro willconsist of one or more PROCEDURES.

    A procedure is a named set of programming statements. Statements normally get obeyedone at a time starting at the beginning. However you can use certain language constructs (ie special words) to change what statements get obeyed next and also to instruct thecomputer to repeat certain instructions many times over.

    The statements themselves are case independent (but sometimes when you enter thestatements into the VB editor it itself changes the case to get a consistent appearance).

    In general the amount of spacing between the words used in the language is left up to you(but you are advised to indent lines with leading spaces to improve the visual presentation of the program).

    Visual Basic for Excel 97/2000 (exlvba-t1) 27

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    33/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    The VB Programming Language

    A set of syntactic rules used to create a program. A program is defined by one or moresubroutines and any number of functions. A procedure may be either a subroutine or afunction.

    Each subroutine must have specific start and end instructions.

    Example Sub My_Program()..

    End Sub

    Each function must have specific start and end instructions.

    Example Function My_Function(arg)..

    End Function

    Scope of procedures

    Functions can be called (executed) from other VB subroutines or functions, or by a call viathe contents of an Excel cell. Subroutines can be called from other subroutines or functionsor via the Excel Tools Macro menu or via the VBE Run menu.

    If their scope is Public then the item can be called from any module in the workbook or fromthe Excel Tools Macro menu (if a Subroutine) or Excel cell (if a Function). If their scope isPrivate then the item can only be called from the module in which the item is defined. Bydefault the scope is set to Public. Scope can be specifically set by preceding the Sub or Function definition by the desired scope.

    Example Public Function my_calc()

    Forms

    Besides procedures, VBE can also be used to create forms . These are special windows(known as custom dialog boxes) that contain a mixture of text and special controls (such ascommand buttons, pull down lists etc). These controls can be selected from a special toolbar called a toolbox and positioned in the window. VB code can be associated with the controlssuch that clicking on a control can start off programming activity. Task 17 is a simpleexample of creating such forms and there is also a separate course document availablecalled VB Excel 97/2000: Custom dialog boxes (document exlvba-t2 see the RelatedDocumentation section for the location of this document on the web) that also deals withthis. Before moving on to this subject you are advised to finish the current course document.

    Comments

    It is a good idea to include informative non-executable comments into a program. Any line or part of a line that begins with the character is ignored by VB language interpreter.

    Example Putting comments in a program is good practice

    Visual Basic for Excel 97/2000 (exlvba-t1) 28

    http://www.bristol.ac.uk/is/selfhelp/documentation/exlvba-t2/exlvba-t2.dochttp://www.bristol.ac.uk/is/selfhelp/documentation/exlvba-t2/exlvba-t2.doc
  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    34/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Continuation

    Sometimes it is convenient to split a single statement over more then one line. To do this theunderscore character preceded by at least one space character is used.

    Example Sub _

    My_Program()

    Constants

    Fixed values such as say 12 or TRUE or "THIS IS AN ERROR"

    Variables

    A named item that can contain some information. There are some rules to the names youcan choose. (No spaces are allowed). For clarity avoid the use of special programmingwords such as if and special Excel words such as range or cells.

    Declarations

    Optionally (in VB) you can list the variable (and its type) before its use, using declarationstatements.

    Example dim i as integer

    Types of variable

    Variables can hold various types of information e.g.

    Boolean, Integer, Long (long integer), Single (single-precision floating-point), Double(double-precision floating-point), Currency, Date, String or Variant.If you do not specifically declare the type of a variable it will be given the Variant type. VB isvery flexible when dealing with variant variables.

    Assigning values to variables

    Programming statements such as the following do this:

    Example x=12errmsg="You have made a mistake"torf=TRUE

    Expressions

    A mixture of constants, variables and operators that produce a value as their result.

    Example x+1

    (x+y)/3 +4*z

    Objects

    Variables can also be "objects" such as Excel workbooks, worksheets, cell address ranges,type of fonts, charts etc.

    Visual Basic for Excel 97/2000 (exlvba-t1) 29

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    35/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Objects have a position in a hierarchy. For example, the Range object is below theWorksheet object which is below the Workbook object. The VB help system will show thisrelationship.

    Often when referring to objects they will be defined by listing the parent object first and thenthe object itself e.g.

    Example Worksheets("Sheet1").Range("A1")

    A period is used as the separator between objects.

    Often if a parent object is not specified a default object will be assumed to be the parent. For example, the Activesheet object is assumed if a Range object is not qualified by a parentobject.

    Properties and Methods of Objects

    Objects have Properties that describe certain attributes about them and Methods thatoperate on them to change their state.

    The size of a Font object for instance is referenced using the Size Property of the Fontobject.

    Example Range("A2").Font.Size=12

    To clear the contents of a particular range you can use the Clear method of the Rangeobject.

    Example Range("Z1:Z4").Clear

    A period is used as the separator between the object and the Property or Method.

    Quite often the properties and methods of an object will themselves have parameters thatneed be specified before getting the desired result.

    Example Range("A1").Cells(2,3)This results in a reference to a cell which is 2 rows down and three columns across from CellA1. The Cell property can be given two arguments to qualify it.

    More information about objects is given in Appendix B.

    Testing variables

    You can use the IF .. THEN construct or IF .. THEN ... ELSE constructs to do this.

    Example If x=1 then y=1

    If ans="YES" Then test="TEST ONE" Else test= "TEST TWO"

    You can also use a multi-line IF ... THEN [ELSE ] ENDIF construct to do testing.

    Example If ans="YES" Thentest="TEST ONE"x=1

    Elsetest= "TEST TWO"x=2

    Endif

    Visual Basic for Excel 97/2000 (exlvba-t1) 30

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    36/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Looping

    Various constructs enable you to get a set of instructions performed many times. For example, the FOR... NEXT construct does this. The complete program that followsillustrates this:

    Example Sub SumCol()colnum = 2startrownum = 10endrownum= 20sumct = 0For rownum= startrownum To endrownum

    ' we now use the CELLS property of the RANGE object to get the value of a particular cell, and then add it the current value of sumct and store the new total back into sumct overwriting what was there previously.sumct = sumct + Range("A1").Cells(rownum, colnum)If sumct > 5000000 Then Exit For

    Next

    ' sumct will now have the sum of column 2 for rows 10 to 20.' - Unless of course the sum was greater then 5000000 when' it will contain whatever sum forced the exit statement from the loop.

    MsgBox Str(sumct)' MsgBox is a standard instruction that will output information to the screen.' Str is a standard function that takes an argument of type numeric and converts it to type text , suitable for display purposes.End Sub

    Some Common Programming structures

    For To [Step ] Next

    Example tot=0For counter = startval To endval Step 2tot=tot+counter

    if tot >1000 Then Exit For the Exit For instruction if executed causes a jump to the instruction that follows the Next statement.

    Next [counter]

    Do Loop UntilExample ct=0

    Doct=ct+10

    Loop Until ct>1000

    Visual Basic for Excel 97/2000 (exlvba-t1) 31

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    37/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    If Then [ELSE ]

    Example If x=1 Then y=1 Else y=0

    Alternatively, using the block syntax:

    Example If x=1 Theny=1z=1

    Elsey=0z=0

    End If

    For Each Next

    Example For Each cht in Sheets(Sheet1).ChartObjects cht is set in turn to eachembedded chart object on Sheet1

    cht.Chart.ChartType = XlLine sets the specified chart type to be a Line Chart

    Next cht

    Example For Each cl in Selection The Selection object is the currently highlighted range. cl is set in turn to each cell in that range .cl.Font.Size=10cl.Value=0

    Next cl

    With End WithExample With Selection.Font

    .Size=12

    .Italic=trueEnd With

    Select Case [Case Else ] End Select

    Example Select Case q uantity Note the different kind of CASE constructs there can be.Case 0 To 49

    discount = 0.1Case 50 To 74 : discount = 0.2 to get more then one statement on a line you can use : and follow it

    by a single statement.Case Is >= 75

    discount = 0.25 Case Else

    discount=0 End Select

    Visual Basic for Excel 97/2000 (exlvba-t1) 32

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    38/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Appendix B........................Visual Basic objectsComments Some of the items referred to in the examples are morecomplicated than simple numeric constants and values. Such variables arecalled objects . For instance the variables that refer to Excel ranges,worksheets, charts, and workbooks are objects. This appendix gives a veryrough explanation of how to find out what objects there are and how theyinteract.

    LibrariesObjects are grouped in classes (for example, Excel, Office) and their definitions stored in specific libraries . Visual Basic for Excel starts with adefault set of libraries. Libraries can easily be added to the set (from the VBETools menu, select References ). A reference to an object that is not in thecurrent set of object definitions will cause an error.

    Object hierarchyObjects have a position in a hierarchy. For example the Range object is belowthe Worksheet object which is below the Workbook object. The VB helpsystem will show this relationship.

    Often when referring to objects they will be defined by listing the parent objectfirst and then the object itself e.g

    Example Worksheets("Sheet1").Range("A1")

    A period is used as the separator character in the hierarchy.

    Often if a parent object is not specified a default object will be assumed to be

    the parent. For example the Activesheet object is assumed if a Range objectis not qualified by a parent object.

    Properties and methodsEach object is defined by having a particular set of properties and methods .The period character is used as a separator when referring to the propertiesand methods of objects. For instance the Range object has a property calledCells that can be used to refer to a particular subset of the range.

    Example Range(A2:Z11) .Cells(1,1) refers to cell A2 in the currently activeworksheet.

    The object created by the use of the Cells property is itself a Range object.So the Font property of a Range object can be used to generate a Fontobject. The Size property of the Font object can then be used to set the sizeof the font.

    Example Range(A14:Z14) . Cells(2,1).Font.Size=12 will set the font size of cell A15to 12 points.

    A Range object has a Clear method that will clear all the cells in the range.

    Example Range(A1). Clear will clear the contents and formatting of cell A1. Methods cause acts to be done to the object, while

    Properties return simple values and objects that are associated with theobject

    Visual Basic for Excel 97/2000 (exlvba-t1) 33

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    39/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    As can be seen from these examples, each property and method has its ownset of rules defining what arguments are necessary to construct a validreference to it.

    If present, the arguments are enclosed in parenthesis and separated bycommas. Any text constant argument must be enclosed in double quotes.

    There is an alternative form of specifying arguments using keywords that isuseful when there are many arguments.

    Example Workbooks.Open Filename:="C:\Sales.xls", ReadOnly:=True

    Collection objectsThere are many objects that are used to control collections of objects of thesame type. For instance the Workbooks object can be used to control all theWorkbook objects. It can be used to create a Workbook , provide the namesof all the Workbook objects, a count of the Workbook objects, etc.

    In general the collection objects will share many methods and properties, for example, Count , Add , Item , Close .

    Finding information about objectsIf you already know the name of an object and require further help (or youmerely want to browse), then the Object browser tool can be used:

    Figure 5 - object browser window ()

    From the VBE View menu, select Object Browser (or press ).From the Project/Library dropdown box, select Excel (default < AllLibraries> ).

    Under classes, select a class, ( Range in Figure 5 ).

    Right-click the mouse and select Help .

    A separate help window will be created (if it does not already exist) containing

    information about the chosen item. Quite often there will be Properties andMethods buttons that can be clicked to get information about all theproperties and methods for the chosen object.

    Visual Basic for Excel 97/2000 (exlvba-t1) 34

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    40/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Because it is sometimes difficult to guess whether a particular item is aproperty or a method, it is often necessary to look in both lists to find itsdefinition.

    When it is available on the help window, the Example button can be clicked togive useful information and the displayed example text pasted into your program to be edited for your own use.

    Excel object modelTo display the hierarchy of Excel objects graphically:

    Start the VBE ( + ).

    From the Help menu, select Microsoft Visual Basic Help .

    If the Office Assistant appears you will need to disable it:

    Right-click on the assistant and select Options .

    Remove the tick from Use the Office Assistant and click on OK .

    Select Help / Microsoft Visual Basic Help again.Select the Answer Wizard tab.

    Using the What would you like to do box, type Microsoft Excel Objectsand click on Search .

    Under Select topic to display , click on Microsoft Excel Objects .

    Referring to worksheets and workbooksIn general, all objects that refer to specific Excel items (such as ranges andcharts) are properties and methods of the Application object. There is aspecial subclass of objects called the global subset , which is a set of thoseobjects that can be used without putting the suffix Application. before them.

    ActiveWorkbook and ActiveSheet are such global objects. They refer to thecurrently active workbook and worksheet respectively.

    If a Range object is used, which is not specifically associated with a particular sheet or book, then it is assumed to refer to theActiveWorkbook.ActiveSheet object.

    If only one Excel workbook is open, then this will be defined to be theActiveWorkbook . The sheet selected when the macro is run will be theActiveSheet . If all the objects you want to access are in this sheet then thereis no need to associate them with a parent object.

    If you want to access objects in other sheets or workbooks, then objects suchas Sheets and Workbooks need to be used.

    Example Workbooks(exone.xls).Sheets(Sheet1).Range(A1) refers to cell A1in Sheet1 of the workbook exone.xls.

    Note Workbooks are only differentiated by their filename (including their suffix butnot including their folder name) and names of sheets, folders and files are notcase-dependent.

    If the workbook is not already open, then the macro will have to open it using

    the Workbooks Open method:Example Workbooks.Open ("C:\Ex\Large.xls")

    Visual Basic for Excel 97/2000 (exlvba-t1) 35

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    41/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    A particular workbook may be made the active workbook via:

    Example Workbook(exone.xls) . Activate

    A particular sheet may be made the active sheet via:

    Example Sheets(Sheet2) . Activate

    Warning! Before the ActiveCell object can be used or a particular range selected usingthe Select method, then an ActiveSheet object must have been defined.

    Declaring and assigning values to object variablesWhen making repeated references to the same complex object it is moreefficient to use variables to hold the objects and refer to these instead (seealso Appendix C). It also gives better code readability.

    Object variables can be declared just like simple variables using the Dimstatement.

    Example Dim Rngx As RangeTo assign values to object variables, the Set statement must be used rather than the simple equals assignment statement:

    Example Set Rngx = Range(A1:Z26)Rngx.Font.Size = 16

    Note Object variables point to the object rather than are the object.

    It is good practice to free such variables when they are no longer required. Todo this set them to the special Nothing keyword.

    Example Set Rngx = Nothing

    Many objects have a default property or method that is used when the objecthas not been fully specified. For a Range variable this property is normally theValue property.

    Example The statement Range(A1)=Range(B1) will be treated asRange(A1).Value = Range(B1).Value

    Visual Basic for Excel 97/2000 (exlvba-t1) 36

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    42/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    Appendix C................Declaration and scope of variables

    Comments The examples in these notes introduce variables as they are needed withinthe subroutines. However more experienced programmers can choose todeclare your variables before they are referenced in a procedure (subroutineor function).

    By assigning the data type to each variable the program will run faster anduse memory more efficiently.

    If a variable is not explicitly declared, it is of type variant . In general, VisualBasic is very tolerant of the kind of information that can be stored as typevariant.

    A variable can be declared in 3 places:

    Single procedure only

    If a variable is to be used within a single procedure only, declare it with a Dimor Static statement in the procedure that uses that variable. A static variableis one that retains its value even when the procedure ends.

    Example Sub MySub()Dim i As Integer,j As Integer Dim ar As Excel.RangeDim Surname As StringStatic Count As Integer

    [Write the VB code here]

    End Sub

    Module only

    If a variable is to be used throughout the procedures within a module, use aDim statement before the first Sub or Function statement in that module.

    Example Dim First As StringDim InterestRate As Single

    Sub FirstSub()[Write the VB code here]

    End Sub

    [More functions/subs here]

    All procedures in all modules

    If a variable is required in more than one module, declare it using a Public statement before the first Sub or Function statement in a module.

    Example Public VatRate as Long = 0.175

    Function FirstFunction(i, j)

    [Write the VB code here] Visual Basic for Excel 97/2000 (exlvba-t1)

    37

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    43/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    End Function

    [More functions/subs here]

    Visual Basic for Excel 97/2000 (exlvba-t1)

    38

  • 8/8/2019 Visual Basic for Excel 97-2000-XP

    44/44

    Visual Basic for Excel 97/2000/XP (exlvba-t1)

    In the examples within this document, only a few procedures are used.However, as a large program is developed using multiple procedures acrossseveral modules, it becomes essential to declare all variables used.

    Efficiency aside, spelling mistakes can occur within variable names leading toincorrect calculations.

    Use the statement Option Explicit as the first line within a module to forcethe declaration of variables. The program will stop if a variable name has notbeen declared.

    Note The VBE can be configured to automatically insert the Option Explicit line innew modules. From the Tools menu, select Options . Within the Editor tab,select Require Variable Declaration .

    The declaration Dim i, j As Integer will declare j as an integer and i as avariant.

    See the online help facility for more information on declaring variables andvariable types.