VB Tutorial
VB Tutorial
VB Tutorial
http://www.functionx.com/vbaexcel/Lesson01.htm
While the default features of Microsoft Excel should be enough in most scenarios, in some cases you will want more complex functionality to perform advanced operations. To make this possible, Microsoft Excel is accompanied by Microsoft Visual Basic, a programming environment that allows you to use the Visual Basic language to enhance the usefulness and functionality of a spreadsheet.
displays the title bar which starts on the left side with the Office Button mouse on it, a tool tip would appear:
1 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
As you can see, the menu of the Office Button allows you to perform the routine Windows operations of a regular application, including creating a new document, opening an existing file, or saving a document, etc. If you right-click the office button, you would get a short menu:
To hide the Quick Access toolbar, you can right-click it and click Remove Quick Access Toolbar. If you position the mouse on a button, a tool tip would appear.
2 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
In the beginning, the Quick Access toolbar displays only three buttons: Save, Undo, and Redo. If you want more buttons than that, you can right-click the Quick Access toolbar and click Customize Quick Access Toolbar... This would display the Excel Options dialog box:
To add a button to the Quick Access toolbar, on the left list of Add, click an option and click Add. After making the selections, click OK. To remove a button from the Quick Access toolbar, right-click it on the Quick Access toolbar and click Remove From Quick Access Toolbar.
The role of this button is to manage some aspects of the top section of the Microsoft Excel interface, including deciding what buttons to display on the Quick Access toolbar. For example, instead of using the Customize Quick Access Toolbar menu item as we saw previously, you can click an option from that menu and its corresponding button would be added to the Quick Access toolbar. If the options on the menu are nor enough, you can click either Customize Quick Access Toolbar or More Commands... This would open the Excel Options dialog box. The main or middle area of the top section displays the name of the application: Microsoft Excel. You can right-click the title bar to display a menu that is managed by the operating system. On the right side of the title bar, there are three system buttons that allow you to minimize, maximize, restore, or close Microsoft Access. Under the title bar, there is another bar with a Help button on the right side.
The Ribbon
Introduction
3 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
By default, the Ribbon displays completely in the top section of Microsoft Excel under the title bar. One option is to show it the way the main menu appeared in previous versions of Microsoft Excel. To do this: Right-click the Office Button, the Quick Access toolbar, or the Ribbon itself, and click Minimize the Ribbon Click or right-click the button on the right side of the Quick Access toolbar:
To show the whole Ribbon again: Right-click the Office Button, the Quick Access toolbar, or one of the Ribbon menu items, and click Minimize the Ribbon to remove the check mark on it Click or right-click the button on the right side of the Quick Access toolbar and click Minimize the Ribbon to remove the check mark on it Double-click one of the menu items of the Ribbon
To put them back to the default locations, right-click the Office Button, the Quick Access toolbar, or the Ribbon, and click Show Quick Access Toolbar Above the Ribbon.
4 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
The ribbon is a type of property sheet made of various property pages. Each page is represented with a tab. To access a tab: You can click its label or button, such as Home or Create You can press Alt or F10. This would display the access key of each tab:
To access a tab, you can press its corresponding letter on the keyboard. For example, when the access keys display, if you press Home, the Home tab would display If your mouse has a wheel, you can position the mouse anywhere on the ribbon, and role the wheel (on the mouse). If you role the wheel down, the next tab on the right side would be selected. If you role the wheel up, the previous tab on the left side would be selected. You can keep rolling the wheel until the desired tab is selected To identify each tab of the Ribbon, we will refer to them by their names.
You can also use context sensitive help in some cases to get information about an item. You can add a button from a section of the Ribbon to the Quick Access toolbar. To do that, right-click the button on the Ribbon and click Add to Quick Access Toolbar:
Remember that, to remove a button from the Quick Access toolbar, you can right-click it on the Quick Access toolbar and click Remove From Quick Access Toolbar.
5 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
That button is used to display an intermediary dialog box for some actions.
In this case, when you need to access an object, you can still click it or click its arrow. If the item is supposed to have many objects, a new window may appear and display those objects: From this:
To this:
6 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
You can hide or show the Formula Bar anytime. To do this, on the Ribbon, click View. In the Show/Hide section: To hide the Formula Bar, remove the check mark on the Formula Bar check box To show the Formula Bar, check the Formula Bar check box
7 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
The Cells
The main area of Microsoft Excel is made of cells. A cell is the intersection of a column and a row:
A cell is identified by its name and every cell has a name. By default, Microsoft Excel appends the name of a row to the name of a column to identify a cell. Therefore, the top-left cell is named A1. You can check the name of the cell in the Name Box.
In the lower right section of the main window, there is a horizontal scroll bar that allows you to scroll left and right if your worksheet has more items than can be displayed all at once:
Sometimes the horizontal scroll bar will appear too long or too narrow for you. If you want, you can narrow or enlarge it. To do this, click and drag the button on the left side of the horizontal scroll bar:
8 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
By default, Microsoft Excel provides three worksheets to start with. You can work with any of them and switch to another at any time by clicking its tab.
If you happen to use a lot of worksheets or the worksheet names are using too much space, which would result in some worksheets being hidden under the horizontal scroll bar, you can use the navigation buttons to move from one worksheet to another.
9 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
On the Quick Access Toolbar, you can click the Save button . Then, in the Save As dialog box, click the arrow of the Save As Type combo box and select a format of your choice There are other things you can do in the Save As dialog box:
Opening a File
The files you use could be created by you or someone else. They could be residing on your computer, on another medium, or on a network. Once one of them is accessible, you can open it in your application. You can open a document either by double-clicking its icon in Windows Explorer, in My Computer, from the Find Files Or Folders window, in My Network Places, or by locating it in the Open dialog box. To access the open dialog box, on the main menu, click File -> Open... You can also click the Open button on the Standard toolbar. A shortcut to call the Open dialog box is Ctrl + O.
Files Properties
Every file has some characteristics, attributes, and features that make it unique; these are its properties. You can access a file's properties from three main areas on the computer: If the file is saved on the desktop and/or it has a shortcut on the desktop, if you open My Computer, Windows Explorer, or the folder (as a window) where the file is stored, right-click the file and click Properties. If the file were saved on the desktop, you would see only some of its properties, the most you can do there is to assign a Read-Only attribute. In My Computer and Windows Explorer, you will be able to change the file's properties. Before opening a file or while in the Open dialog box, you can view some of the file's properties although you won't be able to change them. When the file is opened in Microsoft Excel, you can click the Office Button, position the mouse on Prepare, and click Properties. This would display some of the most common attributes of the file:
10 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson01.htm
To change an item, you can click its text box and edit or replace the content. To get more options, you can click the Document Properties button and click Advanced Properties... A file's properties are used for various reasons. For example, you can find out how much size the file is using, where it is located (the hosting drive and/or folder), who created the file, or who was the last person to access or modify it. The Properties dialog box is also a good place to leave messages to other users of the same file, about anything, whether you work as a team or you simply want to make yourself and other people aware of a particular issue regarding the file.
11 of 11
9/20/2012 2:42 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
Introduction to VBA
Microsoft Visual Basic Fundamentals
Introduction
Microsoft Excel is a spreadsheet application that provides simple to advanced means of creating and managing any type of list. To enhance it beyond its default function, it ships with a language called Microsoft Visual Basic or simply Visual Basic. Microsoft Visual Basic for Applications (VBA) is a computer language based on Microsoft Visual Basic. It allows you to write code that can automatically perform actions on a document and/or its content. When using that language, you write pieces of code, using an external environment.
Microsoft Visual Basic is a programming environment that gets automatically installed when you setup Microsoft Excel. It stays apart because most people would not need or use it. This means that, if you want to use the Microsoft Visual Basic programming environment that ships with Microsoft Excel, you must ask for it, which can be easily done.
From the Developer tab of the Ribbon, to launch Microsoft Visual Basic, you can click the Visual Basic button.
1 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
4. Click OK 5. In the Code section of the Developer tab of the Ribbon, to launch Microsoft Visual Basic, click Visual Basic:
2 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
To put the window back where it was previously, you can double-click its title bar.
The Properties Window shows the characteristics of an object that is selected. Like any other window, to move the Properties window from its position, drag its title bar:
The main area of Microsoft Visual Basic uses a gray background. This area is gray because, in reality, Microsoft Visual Basic is a multiple document interface (MDI) that can be used to display
3 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
various windows at the same time. At times, this gray area will be occupied with other windows.
Modules
A module is a blank window that resembles a piece of paper on which you write code. When you use Microsoft Excel and work on a document, a default module is automatically allocated for it, whether you use it or not. You can also create a module that is independent of any worksheet. To create a module, on the main menu of Visual Basic, you can click Insert -> Module.
3. To return to Microsoft Excel, on the Standard toolbar of Visual Basic, click the View Microsoft
4 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
Excel button 4. To close Microsoft Visual Basic, on the main menu, click File -> Close and Return to Microsoft Excel
Using VBA
In our lessons, we will use the word VBA sometimes but most of the time, we use the expression "Visual Basic Language". When we use "Visual Basic language", we refer to a concept that is recognized by all child languages of Visual Basic, including VBScript and VBA. When we will use the word VBA, we refer to a concept that either is proper to VBA as a language and is not necessarily applied to some other flavors of Visual Basic, or to the way the Visual Basic language is used in Microsoft Excel. For example, the word String is used in all Visual Basic languages but the word Variant is not used in the 2008 version of the Visual Basic language.
Macros
Creating a Macro
To launch Microsoft Visual Basic using the default installation of Microsoft Excel and launching from a macro: On the Ribbon, you can click View. In the Macros section, click the arrow under the Macros button and click Record a Macro:
Click Developer. In the Code section, click the Record Macro button In each case, the Record Macro dialog box would come up:
On the Record Macro dialog box, accept or enter a name for the macro. As an option, you can type
5 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
a description of the macro in the bottom text box. Once you are ready, click OK. This would bring you to the document in Microsoft Excel where you can do what you want. After doing what is necessary, to end the creation of the macro, on the Ribbon: Click View. In the Macros section, click the the arrow of the Macros button and click Stop Recording:
Click Developer. In the Code section, click the Stop Recording button
4. Click OK 5. In the document, whatever box is selected (don't click any), type =2 6. On the Formula Bar, click the Enter button 7. In the Code section of the Ribbon, click Stop Recording
Click View. In the Macros section, click Macros button and click View Macros
6 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
Click Developer. In the Code section, click the Macros button Any of these actions would open the Macros dialog box that would display the list of macros in the current document:
To see the code of a macro, click its name and click Edit.
VBA in a Macro
We will try to reduce as much as possible the code that will be written for you. Still, there are some lines and words we will keep or use but will ignore them for now. As we move on in our lessons, you will understand what everyone of those words means. The code generated in the above Practical Learning section was: Sub Exercise() ActiveCell.FormulaR1C1 = "=2" End Sub The first line of code has the word Sub. We will introduce it later on. Exercise1 is the name of the macro we created. We will come back to names in a few sections in this lesson. We will also come back to the role of parentheses. The section of code ends with the End Sub line. We will come back to it when we study the procedures. For now, consider the Sub Exercise1() and End Sub lines as the minimum requirements we need as this time, that we don't need to be concerned with, but whose roles we can simply ignore at this time. The most important line of our code, and the only line we are concerned with, is: ActiveCell.FormulaR1C1 = "=2" This line has three main sections: ActiveCell.FormulaR1C1, =, and "=2". For now, understand that the ActiveCell.FormulaR1C1 expression means "whatever box is selected in the document". The = sign is called the assignment operator. As its name indicates, the assignment operator is used to assign something to another, to give a value to something, or more precisely to store something somewhere. The thing on the right side of = is called a value. Therefore, "=2" is a value. Based on this, the expression ActiveCell.FormulaR1C1 = "=2" means "Assign the thing on the right side of = to the thing on the left side of =." Another way to put it is, "Store the value on the right side of the assignment operator to the selected box on the left side of the assignment operator." For now, until indicated otherwise, consider that that's what that line of code means.
Using a Macro
After creating a macro, you can use it to see its result. This is also referred to as executing a macro or running a macro. To execute a macro, on the Ribbon:
7 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
Click View. In the Macros section, click Macros button and click View Macros
Click Developer. In the Code section, click the Macros button In the Macro dialog box, click the name of the macro and click Run.
Writing Code
Code Indentation
Indentation is a technique that allows you to write easily readable code. It consists of visually showing the beginning and end of a section of code. Indentation consists of moving code to the right side. The easiest and most common way to apply indentation consists of pressing Tab before typing your code. By default, one indentation, done when pressing Tab, corresponds to 4 characters. This can be automatically set using the Tab Width text box of the Editor property page in the Options dialog box. To change it, on the main menu of Microsoft Visual Basic, you can click Tools -> Options and click the Editor tab:
If you don't want the pressing of Tab to be equivalent to 4 characters, change the value of the Tab Width text box to a reasonable value and click OK. Otherwise, it is (strongly) suggested that you keep to its default of 4 characters.
Comments
A comment is a piece of text in code that would not be considered when reading your code. As such, a comment can be written any way you want. In the Visual Basic language, the line that contains a comment can start with a single quote. Here is an example: This line will not be considered as part of the code Alternatively, you can start a comment with the Rem keyword. Anything on the right side of rem, Rem, or REM would not be read. Here is an example: ' This line will not be considered as part of the code Rem I can write anything I want on this line Comments are very useful and you are strongly suggested to use them regularly. The code that was generated in our Practical Learning section contains a few lines of comment: Sub Exercise1() ' ' Exercise1 Macro ' ' ActiveCell.FormulaR1C1 = "=2" End Sub
8 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson02.htm
Previous
Next
9 of 9
9/20/2012 2:43 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
In the world of computer programming, a variable is a value you ask the computer to temporarily store in its memory while the program is running.
4. Click OK 5. In the document, whatever box is selected (don't click any), type =2 6. On the Formula Bar, click the Enter button 7. In the Code section of the Ribbon, click Stop Recording 8. To open Microsoft Visual Basic, in the Code section of the Ribbon, click Macros 9. In the Macros dialog box, make sure Variables is selected and click Edit
Declaring a Variable
When writing your code, you can use any variable just by specifying its name. When you provide this name, the computer directly reserves an area in memory for it. Microsoft Visual Basic allows you to directly use any name for a variable as you see fit. Fortunately, to eliminate the possibility of confusion, you can first let Visual Basic know that you will be using a variable. In order to reserve that storage area, you have to let the computer know. Letting the computer know is referred to as declaring the variable. To declare a variable, you start with the Dim word, like this: Dim A variable must have a name. The name is written on the right side of the Dim word. There are rules you should follow when naming your variables: The name of a variable must begin with a letter or an underscore After starting with a letter or an underscore, the name can be made of letters, underscores, and digits in any order The name of a variable cannot have a period The name of a variable can have up to 255 characters. The name of a variable must be unique in the area where it is used There are some words you should (must) not use to name your variables. Those words are reserved for the VBA internal use. Therefore, those words are called keywords. Some of them are:
1 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
reserved for the VBA internal use. Therefore, those words are called keywords. Some of them are: And (Bitwise) And (Condition) ByVal CDbl Date ElseIf Function Lib New Or (Condition) Select Sub vbTab Call CInt Dim End Get Long Next Private Set Then With As Case CLng Do EndIf GoTo Loop Not Public Single To While Boolean CBool Const Double Error If Me Nothing ReDim Static True Xor ByRef CByte CSng Each False Integer Mid Option REM Step Until Byte CDate CStr Else For Let Mod Or (Bitwise) Resume String vbCrLf
As mentioned already, to declare a variable, type Dim followed by a name. Here is an example: Sub Exercise() Dim Something End Sub Declaring a variable simply communicates to Visual Basic the name of that variable. You can still use a mix of declared and not-declared variable. If you declare one variable and then start using another variable with a similar but somewhat different name, Visual Basic would still consider that you are using two variables. This can create a great deal of confusion because you may be trying to use the same variable referred to twice. The solution to this possible confusion is to tell Visual Basic that a variable cannot be used if it has not been primarily declared. To communicate this, on top of each file you use in the Code Editor, type: Option Explicit This can also be done automatically for each file by checking the Require Variable Declaration in the Options dialog box.
3. Click OK and return to Microsoft Excel 4. To close Microsoft Excel, click the Office button and click Exit Excel 5. When asked whether you want to save, click No 6. Re-start Microsoft Excel
2 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
Sub Exercise() Dim Something Dim Whatever End Sub In the same way, you can declare as many variables as you want. Instead of declaring each variable on its own line, you can declare more than one variable on the same line. To do this, use one Dim keyword and separate the names of variables with commas. Here are examples: Sub Exercise() Dim Father, Mother Dim Son, Daughter, Nephew, Niece Dim GrandMa End Sub Notice that each line uses its own Dim keyword and every new line of declaration(s) must have a Dim keyword.
Value Assignment
We saw that when you declare a variable, the computer reserves a memory space for it but the space is kept empty. After declaring the value, you can store a value you want in the memory that was reserved for it. To store a value in the memory reserved for a variable, you can assign a value to the variable. To do this, type the name of the variable, followed by the assignment operator which is =, followed by the value you want to store. Here is an example: Sub Exercise() Dim Value Value = 9374 End Sub As we will learn in the next few lessons, there are different types of values you will use in your document. Also as we will see, the value you (decide to) store must be in accordance with the type of memory that the computer had reserved for the variable. After assigning a value to a variable, you can use that variable knowing the value it is currently holding. At any time and when necessary, you can change the value held by a variable. That's why it is called a variable (because its value can vary or change). To change the value held by a variable, access the variable again and assign it the new desired value.
3 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
End Sub You can also declare variables of different data types on the same line. To do this, use one Dim keyword and separate the declarations with commas. Here are.examples: Sub Exercise() Dim FullName As DataType1, DateHired As DataType2 Dim EmploymentStatus As DataType3 End Sub
Type Characters
To make variable declaration a little faster and even convenient, you can replace the As DataType expression with a special character that represents the intended data type. Such a character is called a type character and it depends on the data type you intend to apply to a variable. When used, the type character must be the last character of the name of the variable. We will see what characters are available and when it can be applied.
Value Conversion
Every time the user enters a value in an application. That value is primarily considered as text. This means that, if you want to use such a value in an expression or a calculation that expects a specific value other than text, you must convert it from that text. Fortunately, Microsoft Visual Basic provides an effective mechanism to convert a text value to one of the other values we will see next. To convert text to another value, there is a keyword adapted for the purpose and that depends on the type of value you want to convert it to. We will mention each when necessary.
Byte
To declare a variable that would hold natural numbers that range from 0 to 255, use the Byte data type. Here is an example: Sub Exercise() Dim StudentAge As Byte End Sub There is no type character for the Byte data type. After declaring the variable, you can assign it a small positive number. Here is an example: Sub Exercise() Dim Value As Byte Value = 246 End Sub You can also use the number in hexadecimal format as long as the number is less than 255. If you give either a negative value or a value higher to 255, when you attempt to access it, you would receive an error:
To convert a value to a small number, you can use CByte(). The formula to use would be:
4 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
To convert a value to a small number, you can use CByte(). The formula to use would be: Number = CByte(Value to Convert to Byte) When using CByte(), enter the value to convert in the parentheses.
3. To return to Microsoft Excel, on the Standard toolbar, click the View Microsoft Excel button 4. In Microsoft Excel, click any box
5. In the Code section of the Ribbon, click the Macros button 6. In the Macros dialog box, make sure Exercise1 is selected and click Run
7. To return to Microsoft Visual Basic, in the Code section of the Ribbon, click Visual Basic
Integer
To declare a variable that would hold a number that ranges from -32768 to 32767, use the Integer data type. Here is an example of declaring an integer variable: Sub Exercise() Dim Tracks As Integer End Sub Instead of using As Integer, you can use the % type character. Therefore, the above declaration could be done as follows: Sub Exercise() Dim Tracks% End Sub After declaring the variable, you can assign the desired value to it. If you assign a value lower than -32768 or higher than 32767, when you decide to use it, you would receive an error. If you have a value that needs to be converted into a natural number, you can use CInt() using the following formula: Number = CInt(Value to Convert) Between the parentheses of CInt(), enter the value, text, or expression that needs to be converted.
Long
A long integer is a number that can be used for a variable involving greater numbers than integers. To declare a variable that would hold such a large number, use the Long data type. Here is an example: Sub Exercise() Dim Population As Long End Sub The type character for the Long data type is @. The above variable could be declared as: Sub Exercise() Dim Population@ End Sub A Long variable can store a value between 2,147,483,648 and 2,147,483,647 (remember that the commas are used to make the numbers easy to read; do not be used them in your code).
5 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
that the commas are used to make the numbers easy to read; do not be used them in your code). Therefore, after declaring a Long variable, you can assign it a number in that range. To convert a value to a long integer, call CLng() using the following formula: Number = CLng(Value to Convert) To convert a value to long, enter it in the parentheses of CLng().
Decimal Variables
Single Precision
In computer programming, a decimal number is one that represents a fraction. Examples are 1.85 or 426.88. If you plan to use a variable that would that type of number but precision is not your main concern, declare it using the Single data type. Here is an example: Sub Exercise() Dim Distance As Single End Sub The type character for the Single data type is !. Based on this, the above declaration could be done as: Sub Exercise() Dim Distance! End Sub A Single variable can hold a number between 1.401298e45 and 3.402823e38. for negative values or between 1.401298e45 and 3.402823e38 for positive values. If you have a value that needs to be converted, use CSng() with the following formula: Number = CSng(Value to Convert) In the parentheses of CSng(), enter the value to be converted.
Double Precision
If you want to use a decimal number that requires a good deal of precision, declare a variable using the Double data type. Here is an example of declaring a Double variable: Sub Exercise() Dim Distance As Double End Sub Instead of As Double, the type character you can use is #: Sub Exercise() Dim Distance# End Sub A Double variable can hold a number between 1.79769313486231e308 and 4.94065645841247e324 for negative values or between 4.94065645841247e324 and 1.79769313486231e308 for positive values. To convert a value to double-precision, use CDbl() with the following formula: Number = CDbl(Value to Convert) In the parentheses of CDbl(), enter the value that needs to be converted.
2. To return to Microsoft Excel, on the Standard toolbar, click the View Microsoft Excel button 3. In Microsoft Excel, click any box
6 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
5. In the Macros dialog box, make sure Exercise1 is selected and click Run
6. To return to Microsoft Visual Basic, in the Code section of the Ribbon, click Visual Basic
A String
A string is a character or a combination of characters that constitute text of any kind and almost any length. To declare a string variable, use the String data type. Here is an example: Sub Exercise() Dim CountryName As String End Sub The type character for the String data type is $. Therefore, the above declaration could be written as: Sub Exercise() Dim CountryName$ End Sub As mentioned already, after declaring a variable, you can assign a value to it. The value of a string variable must be included inside of double-quotes. Here is an example: Sub Exercise() Dim CountryName As String CountryName = "Brsil" End Sub If you have a value that is not primarily text and you want to convert it to a string, use CStr() with the following formula: CStr(Value To Convert to String) In the parentheses of the CStr(), enter the value that you want to convert to string.
2. To return to Microsoft Excel, on the Standard toolbar, click the View Microsoft Excel button 3. In Microsoft Excel, click any box
4. In the Code section of the Ribbon, click the Macros button 5. In the Macros dialog box, make sure Exercise1 is selected and click Run
6. To return to Microsoft Visual Basic, in the Code section of the Ribbon, click Visual Basic
Currency Values
The Currency data type is used to deal with monetary values. Here is an example of declaring it: Sub Exercise() Dim StartingSalary As Currency End Sub Instead of using the As Currency expression, you can use @ as the type character to declare a currency variable. Here is an example of declaring it: Sub Exercise() Dim StartingSalary@ End Sub A variable declared with the Currency keyword can store a value between 922,337,203,685,477.5808 and 922,337,203,685,477.5807. Once again, keep in mind that the commas here are used only to make the number easy to read. Don't use the commas in a number in your code. Also, when assigning a value to a currency-based variable, do not use the currency
7 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
symbol. Here is an example of assigning a currency number to a variable: Sub Exercise() Dim StartingSalary As Currency StartingSalary = 66500 End Sub If you want to convert a value to currency, use CCur() with the following formula: Number = CCur(Value to Convert) To perform this conversion, enter the value in the parentheses of CCur().
2. To return to Microsoft Excel, on the Standard toolbar, click the View Microsoft Excel button 3. In Microsoft Excel, click any box
4. In the Code section of the Ribbon, click the Macros button 5. In the Macros dialog box, make sure Exercise1 is selected and click Run
6. To return to Microsoft Visual Basic, in the Code section of the Ribbon, click Visual Basic
A Date
In Visual Basic, a Date data type can be used to store a date value. Therefore, to declare either a date or a time variables, use the Date data type. Here is an example: Sub Exercise() Dim DateOfBirth As Date End Sub After declaring the variable, you can assign it a value. A date value must be included between two # signs. Here is an example: Sub Exercise() Dim DateOfBirth As Date DateOfBirth = #10/8/1988# End Sub There are various formats you can use for a date. We will deal with them in another lesson. If you have a string or an expression that you want to convert to a date value, use CDate() based on the following formula: Result = CDate(Value to Convert) In the parentheses of CDate(), enter the value that needs to be converted.
8 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
2. To return to Microsoft Excel, on the Standard toolbar, click the View Microsoft Excel button 3. In Microsoft Excel, click any box
4. In the Code section of the Ribbon, click the Macros button 5. In the Macros dialog box, make sure Exercise1 is selected and click Run
6. To return to Microsoft Visual Basic, in the Code section of the Ribbon, click Visual Basic
A Time
In Visual Basic, the Date data type can also be used to store a time value. Here is an example of declaring a variable that can hold a time value: Sub Exercise() Dim ShiftTimeIn As Date End Sub After declaring the variable, to assign a value to it, include the value between two # signs. The value follows different rules from a date. To convert a value or an expression to time, use CDate().
Any-Type Variables
A Variant
So far, we declared variables knowing the types of values we wanted them to hold. VBA provides a universal (or vague) data type you can use for any type of value. The Variant data type is used to declare a variable whose type is not explicitly specified. This means that a Variant data type can hold any type of value you want. Here are examples of Variant-declared variables that hold different types of values: Sub Exercise() Dim FullName As Variant Dim EmploymentStatus As Variant Dim HourlySalary As Variant Dim DateHired As Variant FullName = "Patricia Katts" EmploymentStatus = 2 HourlySalary = 35.65 DateHired = #6/22/2004# End Sub
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
Introduction
So far, we were declaring our variables between the Sub Name and the End Sub lines. Such a variable is referred to as a local variable. A local variable is confined to the area where it is declared. Here is an example: Option Explicit Sub Exercise() Dim FirstName As String FirstName = "Patricia" End Sub You cannot use such a variable outside of its Sub Name and the End Sub lines.
Global Variables
A global variable is a variable declared outside of the Sub Name and the End Sub lines. Such a variable is usually declared in the top section of the file. Here is an example: Option Explicit Dim LastName As String Sub Exercise() End Sub After declaring a global variable, you can access it in the other areas of the file. Here is an example: Option Explicit Dim LastName As String Sub Exercise() Dim FirstName As String FirstName = "Patricia" LastName = "Katts" End Sub Although we declared our global variable inside of the file where it was used, you can also declare a global variable in a separate module to be able to use it in another module.
Private Variables
A variable is referred to as private if it can be accessed only by code from within the same file (the same module) where it is used. To declare such a variable, instead of Dim, you use the Private keyword. Here is an example: Option Explicit Private LastName As String Sub Exercise() Dim FirstName As String FirstName = "Patricia" LastName = "Katts" End Sub Remember that a private variable can be accessed by any code in the same module. In the next lesson, we will learn how to create other sections of code.
Public Variables
A variable is referred to as public if it can be accessed by code either from within the same file (the same module) where it is declared or from code outside its module. To declare a public variable, instead of Dim, you use the Public keyword. Here is an example: Option Explicit Private LastName As String Public FullName As String
10 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson03.htm
Sub Exercise() Dim FirstName As String FirstName = "Patricia" LastName = "Katts" FullName = FirstName & " " & LastName End Sub As a reminder, a public variable is available to code inside and outside of its module. This means that you can create a module, declare a public variable in it, and access that variable in another file (module) where needed. A private variable is available inside its module but not outside its module. If you declare a private variable in a module and try accessing it in another module, you would receive an error: Module 1: Option Explicit Private FullName As String Module 2: Option Explicit Private LastName As String Private FirstName As String Sub Exercise() FirstName = "Patricia" LastName = "Katts" FullName = FirstName & " " & LastName ActiveCell.FormulaR1C1 = FullName End Sub This would produce:
11 of 11
9/20/2012 2:44 PM
http://www.functionx.com/vbaexcel/Lesson04.htm
A unary operator is an operator that performs its operation on only one operand. An operator is referred to as binary if it operates on two operands.
Dimensioning a Variable
When interacting with Microsoft Excel, you will be asked to provide a value. Sometimes, you will be presented with a value to view or change. Besides the values you use in a spreadsheet, in the previous lesson, we learned that we could also declare variables in code and assign values to them.
In the previous lesson, we saw that we could use the Dim operator to declare a variable. Here is an example: Option Explicit Sub Exercise() Dim Value End Sub After declaring a variable like this, we saw that we could then use it as we saw fit.
1 of 7
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson04.htm
End Sub
The Parentheses: ()
Parentheses are used in various circumstances. The parentheses in an operation help to create sections in an operation. This regularly occurs when more than one operators are used in an operation. Consider the following operation: 8 + 3 * 5 The result of this operation depends on whether you want to add 8 to 3 then multiply the result by 5 or you want to multiply 3 by 5 and then add the result to 8. Parentheses allow you to specify which operation should be performed first in a multi-operator operation. In our example, if you want to add 8 to 3 first and use the result to multiply it by 5, you would write (8 + 3) * 5. This would produce 55. On the other hand, if you want to multiply 3 by 5 first then add the result to 8, you would write 8 + (3 * 5). This would produce 23. As you can see, results are different when parentheses are used on an operation that involves various operators. This concept is based on a theory called operator precedence. This theory manages which operation would execute before which one; but parentheses allow you to completely control the sequence of these operations.
The Comma ,
The comma is used to separate variables used in a group. For example, a comma can be used to delimit the names of variables that are declared on the same line. Here is an example: Sub Exercise() Dim FirstName As String, LastName As String, FullName As String End Sub
2 of 7
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson04.htm
Arithmetic Operators
Positive Unary Operator: +
Algebra uses a type of ruler to classify numbers. This ruler has a middle position of zero. The numbers on the left side of the 0 are referred to as negative while the numbers on the right side of the rulers are considered positive: - - -6 -6 -5 -5 -4 -4 -3 -3 -2 -2 -1 0 -1 1 2 3 4 5 6 + 1 2 3 4 5 6 +
A value on the right side of 0 is considered positive. To express that a number is positive, you can write a + sign on its left. Examples are +4, +228, +90335. In this case the + symbol is called a unary operator because it acts on only one operand. The positive unary operator, when used, must be positioned on the left side of its operand, never on the right side. As a mathematical convention, when a value is positive, you don't need to express it with the + operator. Just writing the number without any symbol signifies that the number is positive. Therefore, the numbers +4, +228, and +90335 can be, and are better, expressed as 4, 228, 90335. Because the value does not display a sign, it is referred as unsigned.
The Negative Operator -
As you can see on the above ruler, in order to express any number on the left side of 0, it must be appended with a sign, namely the - symbol. Examples are -12, -448, -32706. A value accompanied by - is referred to as negative. The - sign must be typed on the left side of the number it is used to negate. Remember that if a number does not have a sign, it is considered positive. Therefore, whenever a number is negative, it MUST have a - sign. In the same way, if you want to change a value from positive to negative, you can just add a - sign to its left.
Addition +
The addition is performed with the + sign. It is used to add one value to another. Here is an example: Sub Exercise() Dim Side# Dim Perimeter# Side# = 42.58 Perimeter# = Side# + Side# + Side# + Side# End Sub Besides arithmetic operations, the + symbol can also be used to concatenate strings, that is, to add one string to another. This is done by appending one string at the end of another. Here is an example: Sub Exercise() Dim FirstName$, LastName$, FullName$ FirstName$ = "Danielle" LastName$ = "Kouma" FullName$ = FirstName$ + " " + LastName$ ActiveCell.FormulaR1C1 = FullName$ End Sub
Multiplication *
The multiplication operation allows you to add a number to itself a certain number of times set
3 of 7
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson04.htm
The multiplication operation allows you to add a number to itself a certain number of times set by another number. The multiplication operation is performed using the * sign. Here is an example: Sub Exercise() Dim Side# Dim Area# Side# = 42.58 Area# = Side# * Side# End Sub
Subtraction The subtraction operation is performed using the - sign. This operation produces the difference of two or more numbers. It could also be used to display a number as a negative value. To subtract 28 from 65, you express this with 65-28. The subtraction can also be used to subtract the values of two values.
Integer Division \
Dividing an item means cutting it in pieces or fractions of a set value. Therefore, the division is used to get the fraction of one number in terms of another. The Visual Basic language provides two types of operations for the division. If you want the result of the operation to be a natural number, called an integer, use the backlash operator "\" as the divisor. The formula to use is: Value1 \ Value2 This operation can be performed on two types of valid numbers, with or without decimal parts. After the operation, the result would be a natural number.
Decimal Division /
The second type of division results in a decimal number. It is performed with the forward slash "/". Its formula is: Value1 / Value2 After the operation is performed, the result is a decimal number.
Exponentiation ^
Exponentiation is the ability to raise a number to the power of another number. This operation is performed using the ^ operator (Shift + 6). It uses the following formula: yx In Microsoft Visual Basic, this formula is written as: y^x and means the same thing. Either or both y and x can be values, variables, or expressions, but they must carry valid values that can be evaluated. When the operation is performed, the value of y is raised to the power of x.
Remainder: Mod
The division operation gives a result of a number with or without decimal values, which is fine in some circumstances. Sometimes you will want to get the value remaining after a division renders a natural result. The remainder operation is performed with keyword Mod. Its formula is: Value1 Mod Value2 The result of the operation can be used as you see fit or you can display it in a control or be involved in another operation or expression.
Bit Manipulations
Introduction
From our introduction to variables, you may remember that the computer stores its data in memory using small locations that look like boxes and each box contains a bit of information. Because a bit can be represented only either as 1 or 0, we can say that each box contains 1 or 0. Bit manipulation consists of changing the value (1 or 0, or 0 or 1) in a box. As we will see in the next few operations, it is not just about changing a value. It can involve reversing a value or kind of "moving" a box from its current position to the next position. The operations on bits are performed on 1s and 0s only. This means that any number in decimal or hexadecimal format involved in a bit operation must be converted to binary first. You will almost never perform some of the operations we are going to review. You will hardly
4 of 7
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson04.htm
You will almost never perform some of the operations we are going to review. You will hardly perform some other operations. There is only one operation you will perform sometimes: the OR operation.
"Reversing" a Bit
Remember that, at any time, a box (or chunk) in memory contains either 1 or 0:
Bit reversal consists of reversing the value of a bit. If the box contains 1, you can reverse it to 0. If it contains 0, you can reverse it to 1. To support this operation, the Visual Basic language provides the Not Operator. As an example, consider the number 286. The decimal number 286 converted to binary is 100011110. You can reverse each bit as follows: 286 1 Not 286 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1
Bitwise Conjunction
Bitwise conjunction consists of adding the content of one box (a bit) to the content of another box (a bit). To support the bitwise conjunction operation, the Visual Basic language provides the And operator. To perform the bit addition on two numbers, remember that they must be converted to binary first. Then: If a bit with value 0 is added to a bit with value 0, the result is 0 Bit0 Bit1 Bit0 And Bit1 0 0 0
If a bit with value 1 is added to a bit with value 0, the result is 0 Bit0 Bit1 Bit0 And Bit1 1 0 0
If a bit with value 0 is added to a bit with value 1, the result is 0 Bit0 Bit1 Bit0 And Bit1 0 1 0
If a bit with value 1 is added to a bit with value 1, the result is 1 Bit0 Bit1 Bit0 And Bit1 1 1 1
As an example, consider the number 286 bit-added to 475. The decimal number 286 converted to binary is 100011110. The decimal number 4075 converted to binary is 111111101011. Based on the above 4 points, we can add these two numbers as follows: 286 0 4075 1 286 And 0 4075 0 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 1 0 1 0
Therefore, 286 And 4075 produces 100001010 which is equivalent to: Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 256 128 64 286 And 4075 1 256 0 0 0 0 32 0 0 16 0 0 8 1 8 4 0 0 2 1 2 1 0 0
5 of 7
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson04.htm
This means that 286 And 4075 = 256 + 16 + 2 = 266 This can also be programmatically calculated as follows: Sub Exercise() Dim Number1 As Integer Dim Number2 As Integer Dim Result As Integer
Number1 = 286 Number2 = 4075 Result = Number1 And Number2 ActiveCell.FormulaR1C1 = Result End Sub
Bitwise Disjunction
Bitwise disjunction consists of disjoining one a bit from another bit. To support this operation, the Visual Basic language provides the Or operator. To perform a bitwise conjunction on two numbers, remember that they must be converted to binary first. Then: If a bit with value 0 is added to a bit with value 0, the result is 0 Bit0 Bit1 Bit0 Or Bit1 0 0 0
If a bit with value 1 is added to a bit with value 0, the result is 1 Bit0 Bit1 Bit0 Or Bit1 1 0 1
If a bit with value 0 is added to a bit with value 1, the result is 1 Bit0 Bit1 Bit0 Or Bit1 0 1 1
If a bit with value 1 is added to a bit with value 1, the result is 1 Bit0 Bit1 Bit0 Or Bit1 1 1 1
As an example, consider the number 305 bit-disjoined to 2853. The decimal number 305 converted to binary is 100110001. The decimal number 2853 converted to binary is 101100100101. Based on the above 4 points, we can disjoin these two numbers as follows: 305 0 2853 1 305 Or 2853 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 1 1 1
Therefore, 305 Or 2853 produces 101100110101 which is equivalent to: Bit11 Bit10 Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 2048 1024 512 256 128 64 305 Or 2853 1 2048 0 0 1 1 0 0 0 0 32 1 32 16 1 16 8 0 0 4 1 4 2 0 0 1 1 1
512 256
This means that 286 And 4075 = 2048 + 512 + 256 + 32 + 16 + 4 + 1 = 2869 This can also be programmatically calculated as follows: Sub Exercise() Dim Number1 As Integer Dim Number2 As Integer Dim Result As Integer
6 of 7
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson04.htm
Bitwise Exclusion
Bitwise exclusion consists of adding two bits with the following rules. To support bitwise exclusion, the Visual Basic language provides an operator named Xor: If both bits have the same value, the result is 0 Bit0 Bit1 Bit0 Xor Bit1 0 0 0 1 1 0
If both bits are different, the result is 1 Bit0 Bit1 Bit0 Xor Bit1 0 1 1 1 0 1
As an example, consider the number 618 bit-excluded from 2548. The decimal number 618 converted to binary is 1001101010. The decimal number 2548 converted to binary is 100111110100. Based on the above 2 points, we can bit-exclude these two numbers as follows: 618 0 2548 1 618 Xor 2548 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0
Therefore, 305 Or 2853 produces 101110011110 which is equivalent to: Bit11 Bit10 Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 2048 1024 512 256 128 64 618 Xor 2548 1 2048 0 0 1 1 1 0 0 32 0 0 16 1 16 8 1 8 4 1 4 2 1 2 1 0 0
This means that 286 And 4075 = 2048 + 512 + 256 + 128 + 16 + 8 + 4 + 2 = 2974 This can also be programmatically calculated as follows: Sub Exercise() Dim Number1 As Integer Dim Number2 As Integer Dim Result As Integer
Number1 = 286 Number2 = 4075 Result = Number1 Xor Number2 ActiveCell.FormulaR1C1 = Result End Sub
Previous
Next
7 of 7
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
3. In the Code section, click the Visual Basic button 4. To create a module, on the main menu, click Insert -> Module 5. If the Properties window is not available, on the main menu, click View -> Properties Windows. In the Properties window, click (Name) 6. Type Procedures and press Enter
In the Visual Basic language, like most other languages, there are two types of procedures: functions and sub procedures.
Introduction to Sub-Procedures
A sub procedure is an assignment that is carried but does not give back a result. To create a sub procedure, start with the Sub keyword followed by a name (like everything else, a procedure must have a name). The name of a procedure is always followed by parentheses. At the end of the sub procedure, you must type End Sub. Therefore, the primary formula to create a sub procedure is:
Sub ProcedureName() End Sub The name of a procedure should follow the same rules we learned to name the variables. In addition: If the procedure performs an action that can be represented with a verb, you can use that verb to name it. Here are examples: show, display To make the name of a procedure stand, you should start it in uppercase. Examples are Show, Play, Dispose, Close You should use explicit names that identify the purpose of the procedure. If a procedure would be used as a result of another procedure or a control's event, reflect it on the name of the sub procedure. Examples would be: afterupdate, longbefore. If the name of a procedure is a combination of words, you should start each word in uppercase. An example is AfterUpdate The section between the Sub and the End Sub lines is referred to as the body of the procedure. Here is an example: Sub CreateCustomer() End Sub In the body of the procedure, you carry the assignment of the procedure. It is also said that you define the procedure or you implement the procedure. One of the actions you can in the body of a procedure consists of declaring a variable. There is no restriction on the type of variable you can declare in a procedure. Here is an example: Sub CreateCustomer() Dim strFullName As String End Sub In the same way, you can declare as many variables as you need inside of a procedure. The
1 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
In the same way, you can declare as many variables as you need inside of a procedure. The actions you perform inside of a procedure depend on what you are trying to accomplish. For example, a procedure can simply be used to create a string. The above procedure can be changed as follows: Sub CreateCustomer() Dim strFullName As String strFullName = "Paul Bertrand Yamaguchi" End Sub
Introduction to Functions
Introduction
Like a sub procedure, a function is used to perform an assignment. The main difference between a sub procedure and a function is that, after carrying its assignment, a function gives back a result. We also say that a function "returns a value". To distinguish both, there is a different syntax you use for a function.
2 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
Creating a Function
To create a function, you use the Function keyword followed by a name and parentheses. Unlike a sub procedure, because a function returns a value, you must specify the type of value the function will produce. To give this information, on the right side of the closing parenthesis, you can type the As keyword, followed by a data type. To indicate where a function stops, type End Function. Based on this, the minimum syntax used to create a function is: AccessModifier Function FunctionName() As DataType End Function As seen for a sub procedure, a function can have an access modifier. The Function keyword is required. The name of a function follows the same rules and suggestions we reviewed for names of sub procedures. The As keyword may be required (in the next sections, we will review the alternatives to the As DataType expression). The DataType factor indicates the type of value that the function will return. If the function will produce a word or a group of words, you can create it as String. The other data types are also valid in the contexts we reviewed them in the previous lesson. Here is an example: Function GetFullName() As String End Function
3 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
FirstName = "Patricia" LastName = "Katts" GetFullName = LastName & ", " & FirstName End Function
Option Explicit Function GetCustomerName() As String GetCustomerName = "Paul Bertrand Yamaguchi" End Function
2. To return to Microsoft Excel, on the Standard toolbar, click the View Microsoft Excel button
Calling a Function
As done for the sub procedure, in order to use a function in your program, you must call it. Like a sub procedure, to call a function, you can simply type its name in the desired section of the program. Here is an example: Function CallMe() As String Dim Salute As String Salute = "You can call me Al" CallMe = Salute End Function Sub Exercise() CallMe End Sub When calling the function, you can optionally type the parentheses on the right side of its name. The primary purpose of a function is to return a value. To better take advantage of such a value, you can assign the name of a function to a variable in the section where you are calling the function. Here is an example: Function GetFullName$() Dim FirstName As String, LastName As String FirstName = "Patricia" LastName = "Katts" GetFullName = LastName & ", " & FirstName End Function Sub Exercise() Dim FullName$ FullName = GetFullName() ActiveCell.FormulaR1C1 = FullName End Sub
4 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
Function GetFullName$() Dim FirstName As String, LastName As String FirstName = "Patricia" LastName = "Katts" GetFullName = LastName & ", " & FirstName End Function Sub Exercise() ActiveCell.FormulaR1C1 = GetFullName() End Sub In the same way, since a function returns a value, you can use it directly in your spreadsheet. To do this, click any box in the work area. After clicking the box, type =, followed by the name of the function. As you are typing the name of the function, Microsoft Excel would present a list of functions that match that name. If you see the name of the function, you can double-click it, or you can just keep typing. After typing the name of the function, type its parentheses, and press Enter or click the Enter button on the Formula Bar.
3. If you see GetCustomerName in the list, double-click it. Otherwise, complete it with =GetCustomerName() and, on the Formula Bar, click the Enter button
5 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
Based on this characteristic of the procedures of a module having access to global variables of the same module, you can declare such variables and initialize or modify them in any procedure of the same code file. Here is an example: Option Explicit Private Length As Double Private Width As Double Private Sub GetLength() Length = 48.24 End Sub Private Sub GetWidth() Width = 25.82 End Sub Private Function CalculatePerimeter() As Double GetLength GetWidth CalculatePerimeter = (Length + Width) * 2 End Function
Introduction to Arguments
So far, to use a value in a procedure, we had to declare it. In some cases, a procedure may need an external value in order to carry its assignment. A value that is supplied to a procedure is called an argument. When creating a procedure that will use an external value, declare the argument that represents that value between the parentheses of the procedure. For a sub procedure, the syntax you use would be: Sub ProcedureName(Argument) End Sub If you are creating a function, the syntax would be: Function ProcedureName(Argument) As DataType Function Sub The argument must be declared as a normal variable, omitting the Dim keyword. Here is an example that creates a function that takes a string as argument: Function CalculatePayroll(strName As String) As Double Function Sub While a certain procedure can take one argument, another procedure can take more than one argument. In this case, in the parentheses of the procedure, separate the arguments with a comma. Here is an example of a sub procedure that takes two arguments: Sub EvaluateInvoice(EmplName As String, HourlySalary As Currency) End Sub In the body of a procedure that takes one or more arguments, use the argument(s) as you see fit as if they were locally declared variables. For example, you can involve them with values inside of the procedure. You can also exclusively use the values of the arguments to perform the assignment.
Option Explicit Public Function CalculatePerimeter(Length As Double, _ Width As Double) As Double Dim Perimeter As Double Perimeter = (Length + Width) * 2 CalculatePerimeter = Perimeter End Function Public Function CalculateArea(Length As Double, Width As Double) As Double Dim Area As Double Area = Length * Width CalculateArea = Area End Function
6 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
7 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
3. In the list of suggested functions, double-click CalculatePerimeter. If you don't see it, complete the typing with =CalculatePerimeter( 4. After the opening parenthesis, type 48.26, 25.42 as the arguments, then type the closing parenthesis ")"
8 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
FName = First & Last GetFullName$ = FName End Function Sub Exercise() Dim FirstName As String, LastName As String Dim FullName As String FirstName = "Raymond " LastName = "Kouma" FullName = GetFullName(FirstName, LastName) ActiveCell.FormulaR1C1 = FullName End Sub
Public Function CalculatePerimeter(ByVal Length As Double, _ ByVal Width As Double) As Double Dim Perimeter As Double Perimeter = (Length + Width) * 2 CalculatePerimeter = Perimeter End Function Public Function CalculateArea(ByVal Length As Double, _ ByVal Width As Double) As Double Dim Area As Double Area = Length * Width CalculateArea = Area End Function
2. To return to Microsoft Excel, on the toolbar, click the View Microsoft Excel button
9 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson05.htm
When the Exercise() procedure starts, the Number variable is declared and its value is set to 0. When the ShowResult variable is called, it assigns a value to the variable. Since the variable is declared by reference, when the procedure exits, the variable comes back with the new value it was given. As a result, when this code runs, the Number variable has a new value. Using this technique, you can pass as many arguments by reference and as many arguments by value as you want. As you may guess already, this technique can be used to make a sub procedure return a value, which a regular sub routine cannot do. Furthermore, passing arguments by reference allows a procedure to return as many values as possible while a regular function can return only one value.
Previous
Next
10 of 10
9/20/2012 2:45 PM
http://www.functionx.com/vbaexcel/Lesson06.htm
Introduction to Objects
Classes and Objects
Introduction
The Microsoft Visual Basic language uses the concept of class to identify or manage the parts of an application. Consider an object like a house. It has such characteristics as its type (single family, townhouse, condominium, etc), the number of bedrooms, the number of bathrooms, etc:
These characteristics are used to describe a house to somebody who wants to buy it. To get such an object, you must first define the criteria that describe it. Here is an example: House [ Address Type of House Number of Bedrooms Number of Bathrooms Has Indoor Garage The Living Room is Covered With Carpet The Kitchen Has an Island Stove ] This information is used to describe a house. Based on this, House is called a class. To actually describe a real house, you must provide information for each of the above characteristics. Here is an example: House: Langston [ Address: 6802 Leighton Ave Type of House: Single Family Number of Bedrooms: 4 Number of Bathrooms: 3 Has Indoor Garage: Yes The Living Room is Covered With Carpet: Yes The Kitchen Has an Island Stove: No ] In this case, Langston is not a class anymore, it is a real house and is explicitly described. Therefore, Langston is called an object. Based on this, a class is a technique used to provide the criteria to define an object. An object is the result of a description based on a class.
1 of 4
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson06.htm
If the control is selected in the work area, in the Controls section of the Ribbon, click the Properties button Any of these two actions would display the Properties window for the control that was rightclicked:
The Properties window would stay on the screen of Microsoft Excel as long as you want. To show the properties of another control, simply click it in the work area. If you are working in Microsoft Visual Basic, to show the characteristics of a control, right-click it and click Properties. This also would display the Properties window and show the characteristics of the selected control. While the Properties window in Microsoft Excel floats and does not hold a specific position, by default, in Microsoft Visual Basic, the Properties window is position on the lower-left side. You can move it by dragging its title bar.
2 of 4
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson06.htm
argument, another method would need more than one. The number of arguments of a method depends on its goal. The arguments of a method are provided in parentheses. Suppose you have a House object and you want it to protect what is inside. There may be different reasons why the inside needs to be protected: may be from the rain, may be from the windy dust, may be at night time from too much light that prevents from sleeping, etc. Based on this, you may have to provide additional information to indicate why or how the inside should be protected. For this reason, when such a method is called, this additional information must be provided, in the parentheses of the method. Here is an example: House [ Address TypeOfHouse NumberOfBedrooms NumberOfBathrooms HasIndoorGarage LivingRoomCoveredWithCarpet KitchenHasIslandStove ProtectFromOutside(Reason) ] As mentioned above, a method can be created to take more than one argument. In this case, the arguments are separated with commas. Here is an example: House [ Address TypeOfHouse NumberOfBedrooms NumberOfBathrooms HasIndoorGarage LivingRoomCoveredWithCarpet KitchenHasIslandStove ProtectFromOutside(Reason, WhenToProtect) ] The arguments are used to assist the object with performing the intended action. Once a method has been created, it can be used. Once again, using a method is referred to as calling it. If a method takes one argument, when calling it, you must provide a value for the argument, otherwise the method would not work. To call a method that takes an argument, type the name of the method followed by the opening parenthesis (, followed by the value that will be the argument, followed by a closing parenthesis ). The argument you pass can be a regular constant value or it can be the name of another object. If the method is taking more than one argument, to call it, type the values for the arguments, in the exact order indicated, separated from each other by a comma.
Default Arguments
We have mentioned that, when calling a method that takes an argument, you must supply a value for the argument. There is an exception. Depending on how the method was created, it may be configured to use its own value if you fail, forget, or choose not, to provide one. This is known as the default argument. Not all methods follow this rule. If a method that takes one argument has a default value for it, then you don't have to supply a value when calling that method. Such an argument is considered optional. If a method takes more than one argument, some argument(s) may have default values while some others do not. The arguments that have default values can be used and you don't have to supply them. We will mention default arguments when we come to a method that takes some.
3 of 4
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson06.htm
If you have an object named Camden and that is of type House. To access some of its properties, you would use code as follows: Camden.Address Camden.TypeofHouse If you are working inside of a method of the class, for example if you are working in the body of the ProtectFromOutside method, you can also access the properties the same way, this time without the name of the object. This could be done as follows: ProtectFromOutside() Address TypeofHouse NumberOfBedrooms NumberOfBathrooms End When you are accessing a member of a class inside of one of its own methods, you can precede that member with the Me object. You must include the period operator between Me and the member of the class. Here is an example: ProtectFromOutside() Me.Address Me.TypeofHouse Me.NumberOfBedrooms Me.NumberOfBathrooms End Remember that the Me object is used to access the members of an object while you are inside of another member of the object.
With
We have seen that you can use the name of an object to access its members. Here is an example: Camden.Address Camden.TypeOfHouse Camden.NumberOfBedrooms Camden.NumberOfBathrooms Camden.HasIndoorGarage Instead of using the name of the object every time, you can start a section with the With keyword followed by the name of the object. In another line, end the section with the End With expression: With Camden End With Between the With and the End With lines, to access a member of the class that the object is built from, type a period followed by the desired member. This would be done as follows: With Camden .Address .TypeOfHouse .NumberOfBedrooms .NumberOfBathrooms .HasIndoorGarage End With As you access a member, you can perform on it any action you judge necessary.
4 of 4
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson07.htm
Each field in the Properties window has two sections: the propertys name and the property's value:
1 of 5
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson07.htm
The name of a property is represented in the left column. This is the official name of the property. Notice that the names of properties are in one word. Based on this, our House class would have been defined as follows: House [ Address TypeOfHouse NumberOfBedrooms NumberOfBathrooms HasIndoorGarage LivingRoomCoveredWithCarpet KitchenHasIslandStove ] You can use this same name to access the property in code.
Types of Properties
Empty Fields
By default, these fields don't have a default value. Most of these properties are dependent on other settings of project. To set the property on such a field, you can type in it or sometimes you will need to select from a list.
Text Fields
There are fields that expect you to type a value. Most of these fields have a default value. To change the value of the property, click the name of the property, type the desired value, and press Enter or Tab. While some properties, such as the Caption, would allow anything, some other fields expect a specific type of text, such as a numeric value. To programmatically change the value of a text-based property, on the right side of the = sign, you can type the value in double quotes. For example, suppose you have a
2 of 5
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson07.htm
Numeric Fields
Some fields expect a numeric value. In this case, you can click the name of the field and type the desired value. If you type an invalid value, you would receive a message box notifying you of the error:
When this happens, click OK and type a valid value. If the value is supposed to be an integer, make sure you don't type it with a fractional part.
Expandable Fields
Some fields have a - or a + button. This indicates that the property has a set of sub-properties that actually belong to the same property and are defined together. To expand such a field, click its + button and a button will appear. To collapse the field, click the button. Some of the properties are numeric based. With such a property, you can click its name and type the numeric value. Some other properties are created from a sub-list. If you expand such a field, it would display various options. With such a property, you should select from a list.
Boolean Fields
Some fields can have only a True or False value. These are Boolean fields. To change their value, you can either select from the combo box or double-click the property to switch to the other value. To programmatically specify the value of a Boolean property, on the right side of the = symbol, type True or False. Here is an example: Langston.HasIndoorGarage= True
Intermediary Fields
Some fields use a value that can be set through an intermediary action. Such fields display a browse button
3 of 5
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson07.htm
intermediary action. Such fields display a browse button . When you click the button, a dialog box would come up and you can set the value for the field.
List-Based Fields
To change the value of some of the fields, you would first click the arrow of their combo box to display the available values. After clicking the arrow, a list would display:
There are various types of list-based fields. Some of them display just two items. To change their value, you can just double-click the field. Some other fields have more than two values in the list. To change them, you can click their arrow and select from the list. You can also double-click a few times until the desired value is selected. Some other items would dispplay a window from where you would click the option you want:
To programmatically specify the value of a list-based property, you must use one from a list. For example, suppose you had defined a list of types of house as tpeSingleFamily, tpeTownHouse, and tpeCondominium. To use one of these values for a House object named Langston, you would type: Langston.TypeOfHouse = tpeSingleFamily In most cases, each member of such a list also uses a natural number. An example would be: TypeOfHouse Value 0 1 2 tpeSingleFamily tpeTownHouse tpeCondominium
Although we used 0, 1, and 2 in this list, there are no predefined rules as to the number allocated for each member of the list. The person who created the list also decided what number, if any, each member of the list would have (if you are curious, in most programming languages or libraries, these types of properties are created using an enumeration (in C++ or in the the .NET Framework) or a set (Borland VCL)). Based on this, the above code would also be written as: Langston.TypeOfHouse = 0
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson07.htm
5 of 5
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson08.htm
Introduction to Forms
Forms Fundamentals
Introduction to Forms
A computer application, such as those that run on Microsoft Windows, is equipped with objects called Windows controls. These are the objects that allow a person to interact with the computer. The primary control used on most applications is called a form.
Creating a Form
To create a form, on the main menu of Microsoft Visual Basic, you can click Insert -> UserForm. This would add a form to your project. In the same way, you can add as many forms as you want. The form is primarily used as a platform on which you add other controls. For this reason, a form is referred to as a container. By itself, a form is not particularly useful. You should add other objects to it. When you create or add a form, a module is also automatically created for it. To access the module associated with a form, you can right-click the form and click View Code.
Using a Form
Showing a Form
Although you create a form in Microsoft Visual Basic, you view its results in Microsoft Excel. You have various options. A form is referred to as modal if the user cannot access anything from the same application while the form is displaying. A form is called modeless if the user can click something of the same application behind that form while the form is displaying. To display the run-time view of a form in modal view: While in Microsoft Visual Basic, you can press F5 On the main menu of Microsoft Visual Basic, you can click Run -> Run Sub/UserForm On the Standard toolbar of Microsoft Visual Basic, you can click the Run Sub/UserForm button . This would send the form to Microsoft Excel and display it in the normal view You can also programmatically display a form. To support this, the UserForm object is equipped with a method named Show. Its syntax is: Public Sub UserForm.Show(Optional ByVal Modal As Boolean) This method takes one Boolean argument that is optional. If you omit it, the form would display as modal and the user cannot do anything else in Microsoft Excel as long as the form is not closed. That's the default behavior. If you want to display the form as modeless, pass the argument as False. Here is an example: Private Sub Exercise() UserForm1.Show False End Sub
Printing a Form
If you have equipped a form with many aesthetic objects you want to see on a piece of paper, you can print it. To support printing, the UserForm object is equipped with a method named PrintForm.
1 of 3
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson08.htm
can print it. To support printing, the UserForm object is equipped with a method named PrintForm. Its syntax is: Public Sub PrintForm This method takes no argument. When called, it sends the (body of the) form directly to the printer. Here is an example of calling it: Private Sub Exercise() UserForm1.PrintForm End Sub
Hiding a Form
As opposed to displaying a form, if it is already showing, you can hide it. To allow you to hide a form, the UserForm object is equipped with a method named Hide. Its syntax is: Pyblic Sub UserForm.Hide This method takes no argument. When called, it hides the form (without closing it). Here is an example of calling it: Private Sub Exercise() UserForm1.Hide End Sub
Closing a Form
After using a form, the user can close it by clicking the system close button. To programmatically close a form, use the End statement. Here is an example: Private Sub Exercise() End End Sub
2 of 3
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson08.htm
Private Sub Exercise() UserForm1.Width = 600 End Sub Another option is to call the Move method. In reality, this method takes two required arguments and two optional arguments. Its actual syntax is: Public Sub UserForm.Move(ByVal Left As Single, ByVal Top As Single, _ Optional ByVal Width As Single, Optional ByVal Height As Single) The last two optional arguments allow you to specify the size of the form. Here is an example: Private Sub Exercise() UserForm1.Move 200, 200, 1040, 600 End Sub
3 of 3
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson09.htm
Introduction to Controls
Controls Fundamentals
Introduction
By itself, a form means nothing. Its role is revealed in the objects it holds. You can add such objects to a form or the body of a spreadsheet.
The Spreadsheet
When working in Microsoft Excel, you can use Windows controls either on the work area or in a form in Microsoft Visual Basic. Therefore, just like a form, a spreadsheet also is a container of controls.
This would display the list of controls available in Microsoft Excel. The controls appear in two sections: Form Controls and ActiveX Controls. If you are working on a spreadsheet in Microsoft Excel, you should use only the controls in the ActiveX Controls section. If you are working on a form in Microsoft Visual Basic, a Toolbox equipped with various controls will appear.
1 of 6
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson09.htm
5. To return to Microsoft Excel, on the Taskbar, click Microsoft Excel 6. To display the controls, in the Controls section of the Ribbon, click Insert
You can scroll up and down in the window to locate the desired control. If you see a control you want to use, click it and click OK. In Microsoft Visual Basic, to access more controls, on the main menu, you can click Tools -> Additional Controls... This would open the Additional Controls dialog box:
2 of 6
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson09.htm
To select a control, you can click its check box. After selecting the controls, click OK.
Name Command Button Combo Box Check Box List Box Text Box Scroll Bar Spin Button Option Button Label Image Toggle Button
3 of 6
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson09.htm
In our lessons, when working in Microsoft Excel, we will avoid using the objects in the Form Controls section. If you want, instead of clicking and releasing the mouse, you can click and drag. This allows you to "draw" the control and give the dimensions of your choice. If the control has already been added but you want it to assume different dimensions, you can click it to select it and then drag one of its border handles. To programmatically add a control to a spreadsheet, use the following formula: Private Sub Exercise() Worksheets(1).OLEObjects.Add "Forms.ControlName.1" End Sub The only thing you need to know and change about this formula is the ControlName factor. We will learn about Worksheets(1) in Lesson 12. Use the following names: Use this Name CheckBox CommandButton ListBox OptionButton SpinButton ToggleButton To Get a Check Box Command Button List Box Option Button Spin Button Toggle Button Use this Name To Get ComboBox Label Image ScrollBar TextBox Combo Box Label Image Scroll Bar Text Box
Here is an example that creates and positions a text box on a spreadsheet: Private Sub Exercise() Worksheets(1).OLEObjects.Add "Forms.TextBox.1" End Sub
3. On the Taskbar, click Microsoft Visual Basic to return to it 4. On the Toolbox, click the CommandButton and click somewhere in the top-left section of the form (no need for precision at this time) 5. On the Toolbox, click the ComboBox and click somewhere in the middle-center section of the form (no need for precision at this time) 6. On the Toolbox, click the CheckBox and click somewhere in the lower-right section of the form (no need for precision at this time) 7. To return to Microsoft Excel, click the View Microsoft Excel button
Control Selection
Single Control Selection
After you have added a control to a container, in order to perform any type of configuration on the control, you must first select it. Sometimes you will need to select a group of controls. To select a control in the work area in Microsoft Excel, first, in the Controls section of the Ribbon,
click the Design Mode button . After clicking it, right-click the control and press Esc. If you are working in Visual Basic, to select a control, click it on the form. In Microsoft Excel, when a control is selected, it is surrounded by 8 small circles, also called handles. Here is an example:
4 of 6
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson09.htm
2. In the Controls section of the Ribbon, click the Design Mode button 3. In the work area, click the CommandBut button again 4. Click the combo box. Notice that, this time, you cannot select the controls 5. To return to controls to edit mode, in the Controls section of the Ribbon, click the Design Mode
button 6. To return to Microsoft Visual Basic, in the Code section of the Ribbon, click the Visual Basic
button
If you are working on a form in Microsoft Visual Basic, first click one of the controls you want to select, then press and hold Ctrl. Click each of the desired controls. If you click a control that should not be selected, click it again. After selecting the group of controls, release Ctrl that you were holding. As another technique you can use to select various controls, click an unoccupied area on the form, hold the mouse down, drawing a fake rectangle that would either include each of the desired controls or would touch each, then release the mouse:
5 of 6
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson09.htm
When a group of controls is selected, the first selected control displays 8 handles but its handles are white while the others are dark.
Control Deletion
If there is a control on your form or your work area but you don't need it, you can remove it. To delete a control, first select it and then press Delete. You can also right-click a control and click Cut. To remove a group of controls, first select them, then press Delete or right-click the selection and click Cut.
6 of 6
9/20/2012 2:46 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
Basic button 3. To create a form, on the main menu of Visual Basic, click Insert -> UserForm 4. On the Toolbox, click the CommandButton and click somewhere on the form (no need for precision) 5. On the Toolbox, click ComboBox and click the form away from the previously added CommandButton
Moving a Control
When you add a control to the work area in Microsoft Excel or to a form in Microsoft Visual Basic, it assumes a position on its container. If you want, you can change that location by moving the control. To move a control, click it and drag in the direction of your choice. To move a group of controls, first select them. Click it and drag the selection in the direction of your choice When a control has been selected, as your mouse moves over it, its pointer displays a different cursor. One of these cursors can be used to move a control. This cursor is represented as a cross with four arrows:
To move a control, click its border and hold the mouse down, drag in the direction of your choice. When you get to the desired location, release the mouse.
Aligning Controls
Horizontal Alignment
When many controls are selected on a form, one of the controls has dark handles:
1 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
In our descriptions, the control with the dark handles will be referred to as the base control. During form design, to better position the controls, you can use the main menu with the Format group. Microsoft Visual Basic also provides the UserForm toolbar to assist you. To display the UserForm toolbar, on the main menu of Microsoft Visual Basic, you can click View -> Toolbars -> UserForm. If you have a certain control on the form and want to position it exactly at equal distance between the left and the right borders of the form, select the control, then, on the main menu of Microsoft Visual Basic, click Format -> Center in Form -> Horizontally. To get the same option, on the UserForm toolbar, click the arrow of the Center button and click Horizontally:
Horizontal alignment affects controls whose distance from the left border of the form must be the same. To perform this type of alignment, you can use the main menu where you would click Format -> Align, and select one of the following options: Lefts: All selected controls will have their left border coincide with the left border of the base control Centers: The middle handles of the selected controls will coincide with the middle handles of the base control Rights: All selected controls will have their right border coincide with the right border of the base control To get the same options using the UserForm toolbar, click the arrow of the Align button and select the desired option: Lefts, Centers, or Rights:
Vertical Alignment
Another option you have consists of moving controls up or down for better alignment. Once again you must first select the controls. Then, on the main menu, click Format -> Align, and click one of the following options: Tops: All selected controls will have their top border coincide with the top border of the base control but their left border would have the same distance with the left border of the parent Middles: The top handles of the selected controls will align vertically with the top handle of the base control Bottoms: All selected controls will have their bottom border coincide with the bottom border of the base control but their left border would have the same distance with the left border of the parent To get the same options using the UserForm toolbar, click the arrow of the Align button and select the desired option: Tops, Middles, or Bottoms.
Obviously the controls on this form are not enjoying the most professional look. The Format group of the main menu allows you to specify a better horizontal alignment of controls with regards to each other. To use it, first select the controls. Then, on the main menu of Microsoft Visual Basic,
2 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
each other. To use it, first select the controls. Then, on the main menu of Microsoft Visual Basic, click Format -> Horizontal Spacing, and click one of the following options: Make Equal: Microsoft Visual Basic will calculate the horizontal distances that separate each combination of two controls and find their average. This average is applied to the horizontal distance of each combination of two controls:
Increase: Microsoft Visual Basic will move each control horizontally, except the base control (the control that has white handles) by one unit away from the base control. This will be done every time you click the Increase Horizontal Spacing button or the Format -> Horizontal Spacing -> Increase menu item
Decrease: Microsoft Visual Basic will move each control horizontally, except the base control (the control that has white handles) by one unit towards the base control. This will be done every time you click the Decrease Horizontal Spacing button or the Format -> Horizontal Spacing -> Decrease menu item
Remove: Microsoft Visual Basic will move all controls (horizontally), except for the left control, to the left so that the left border of a control touches the right border of the next control
The controls on this form are not professionally positioned with regards to each other. Once again, the Format group of the main menu allow you to specify a better vertical alignment of controls relative to each other. To align them, on the main menu of Microsoft Visual Basic, click Format -> Vertical Spacing and click one of the following options: Make Equal: Microsoft Visual Basic will calculate the total vertical distances that separate each combination of two controls and find their average. This average is applied to the vertical distance of each combination of two controls
3 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
Increase: Microsoft Visual Basic will move each control vertically, except the base control (the control that has darker handles) by one unit away from the base control. This will be done every time you click the Increase Horizontal Spacing button or the Format -> Horizontal Spacing -> Increase menu item
Decrease: Microsoft Visual Basic will move each control, except the base control (the control that has darker handles) by one unit towards the base control. This will be done every time you click the Decrease Horizontal Spacing button or the Format -> Horizontal Spacing -> Decrease menu item
Remove: Microsoft Visual Basic will move all controls vertically, except for the top control, to the top so that the top border of a control touches the bottom border of the next control towards the top
4 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
Properties window, click Width and type the desired value. To programmatically specify the width of a control, access it using its name, type the period, followed by Width, the assignment operator, and the desired value. If a control displays or contains text, such as the caption of a button, click the control. On the main menu of Microsoft Visual Basic, click Format and click Size to Fit.
Imagine you would like each of these buttons to have just enough space to accommodate its caption. First select the controls that will be resized. To resize the controls, on the main menu of Microsoft Visual Basic, click Format and click Size to Fit. If you do, the controls will be resized based on the contents of their value:
If all the controls are text boxes, their widths would be reduced to be able to hold a character. Consider the following form:
Imagine one of the controls has a certain width and you want to apply that width to the other controls. Select the controls but make as the base control the object that has the width you want. Here is an example where the button labeled Order Processing is selected as the base:
5 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
On the main menu, you can click Format -> Make Same Size -> Width. Alternatively, on the UserForm toolbar, you can click the arrow of the right button and click Width:
After doing this, the controls would be enlarged or narrowed based on the width of the control that was set as the base:
6 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
To visual specify the height of a control, click it, position the mouse on one of its top or bottom handle until the mouse cursor appears with a vertisal bar with two arrows . Then click and drag up or down in the direction of your choice until you get the desired height. Then release the mouse. To specify the width of a control with precision, click the control. In the Properties window, click Height and type the desired value. To programmatically specify the height of a control, access it using its name, type the period, followed by Height, followed by =, and the desired value. If a control displays or contains text, such as the caption of a button, click the control. On the main menu of Microsoft Visual Basic, click Format and click Size to Fit. To programmatically specify the height of a control, type its name, access its Height property and assign the desired value.
You can shrink or heighten many controls based on the height of one of the controls. To start, select the controls but use as base the control that has the height you would like to apply on the other controls. Here is an example where the button labeled Get is set as the base:
On the main menu, you can click Format -> Make Same Size -> Height. Or, on the UserForm toolbar, you can click the arrow of the right button and click Height. After doing this, the controls would get shrunk or tall based on the width of the control that was set as the base:
7 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
corner of the selected control. Use the appropriate mouse cursor: Cursor Role Moves the seized border in the North-West <-> South-East direction Shrinks or heightens the control Moves the seized border in the North-East <-> South-West direction Narrows or enlarges the control Changes both the width and height of a control
To visually resize various controls, first select them. Position the mouse on the border or corner of one of the selected controls until you get the cursor that would resize to the direction of your choice:
Once you get the desired size, release the mouse. To precisely change the sizes of various controls at the same time, first select them. Then, in the Properties window, change the values of the Width and Height properties. The new value would be applied to all selected controls. Alternatively, Microsoft Visual Basic provides tools to automatically do this for you.
Control Maintenance
Copying a Control
If you had applied some design on a control and you want to replicate that design, you can copy the control. This is mostly a simple operation of copy n' paste. You can copy a control on the work area or on a form and paste it on the same container (you are not allowed to copy a control from the work area to a form and vice versa). You can also copy a control from one work area and paste it in another work area. You can copy a control from one form and paste it in another form. When you copy and paste a control, there are some characteristics it would retain and some others it would loose. Normally, it would keep its aesthetic characteristics (such as the color) and its size but it will loose some others (such as its location and its programmatic characteristics such as its name. To copy a control: Right-click the control and click Copy Click the control to select it and press Ctrl + C To copy a group of controls, first select the controls:
8 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
Right-click in the selection and click Copy Press Ctrl + C To paste the copied controls, in the work area or on a form: Right-click the destination (work area or form) and click Paste Press Ctrl + V
Deleting Controls
If you have added a control to the work area or a form but you don't need it anymore, you can remove it from the container. You can also delete a group of controls in one step. To remove a control from a work area or from a form: Click the control and press Delete Right-click the control and click Cut To remove a group of controls, select them: Press Delete Right-click one of the selected controls and click Cut
Tab Ordering
When using the controls of a form, you can press Tab to move from one control to another. For example, after entering a value in a text box of a form, if there is another text box on the right side, when you press Tab, the caret should move to that right control. If there is no control on the right side, the caret should move to the control under the one previously used. If the caret or focus is in the last bottom control on a form and you press Tab, the caret should move back to the first record. This follows the arranged sequence of the controls on the form. For this reason, the controls on a form should be aligned in the order of a logical sequence. When you add a control to a form that already has other controls, it is sequentially positioned at the end of the existing controls. The sequence of controls navigation is set using the Tab Order dialog box. To access the Tab Order dialog box: Right-click the form and click Tab Order
On the main menu of Microsoft Visual Basic, click View -> Tab Order
9 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
Cannot contain space Based on these rules, you can adapt your own.
Border Style
Some controls display a border when they are drawn and some others don't. Some of these controls allow you to specify a type of border you want to show surrounding the control. This characteristic is controlled by the BorderStyle property.
10 of 11
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson10.htm
It provides three options: TextAlign 1 - frmTextAlignLeft Result Text will be aligned to the left of the control
2 - fmTextAlignCenter Text will be position in the center of the control 3 - fmTextAlignRight Text will be aligned to the left of the control
To programmatically specify the text alignment of a control that supports this characteristics, assign the desired option to this property. Here is an example: TextBox1.TextAlign = fmTextAlignRight
From this dialog box, you can select the font name, the style, the size, and the effect(s). Once you are ready, click OK.
11 of 11
9/20/2012 2:47 PM
Microsoft Excel VBA - Lesson 11: Messages and Events of Windows C...
http://www.functionx.com/vbaexcel/Lesson11.htm
To communicate its intention to the operating system, a Windows control must compose a message and send it (to the operating system).
WHAT message? When a control is sending a message, it must specify the type of message. A control can be able to send various types of messages. For example, when a control gets clicked, it sends a Click message. If the same control receives focus but you press a key, the control sends a keyboard-related message. When the mouse passes over that same control, its sends a different type of message. Every message a control can send has a name. To see the types of message available for a particular control, open Microsoft Visual Basic. In the Object combo box, select the name of the control. Then, click the arrow of the Procedure combo box:
By convention, the name of the message follows the name of the control but they are separated with an underscore. It would appear as: Private Sub ControlName_Push Arguments: An argument is additional information needed to process a message. When a control sends a message, it may need to accompany it with some information. For example, if you position the mouse on a control and click, the operating system may need to know what button of the mouse was used to click. On the other hand, if you select an object and start dragging, the operating system may need to know if a key such as Shift or Ctrl was held down while you were dragging. An additional piece of information that the control provides is provided as an argument. While some messages may need to provide only one piece of information, some messages would require more than one argument. Some other messages don't need any additional information
1 of 6
9/20/2012 2:47 PM
Microsoft Excel VBA - Lesson 11: Messages and Events of Windows C...
http://www.functionx.com/vbaexcel/Lesson11.htm
require more than one argument. Some other messages don't need any additional information at all: the name of the message would completely indicate how the message must be processed. The arguments of a message are provided in parentheses. They would appear as: Private Sub ControlName_Push(Argument1, Argument2, Argument_n) After specifying the message, you can type code that tells the operating system what to do to process the message. To indicate the end of the code that relates to a message, type End Sub Private Sub ControlName_Push(Argument1, Argument2, Argument_n) End Sub As mentioned earlier, a message must be composed and sent. The action of sending a message is called an event. It is also said that the controls "fires" an event. Based on the above descriptions, to compose and send a message, in the Object combo box, you can select the name of the control that will send the message, then select the desired message in the Procedure combo box. When you do this, Microsoft Visual Basic will write the first line that specifies the name of the control, the name of the event, its arguments if any, and would write End Sub for you. You can then enter the necessary code between those two lines. Most Windows control have a special event referred to as the default. This is the even that is the most obvious that the control can fire. For example, when you think of a button, the first action that comes to mind is Click. For this reason, Click is the default event of a button. If you add a control to a work area or to a form and double-click the control, its default event would be invoked and the skeleton of that event would be written in the corresponding module. If you don't want to use that event or to fires another event for the same control, you can simply select the event in the Procedure combo box.
Name
Caption
Other Properties
lblHourlySalary Hourly Salary: txtHourlySalary lblWeeklyHours Weekly Hours: txtWeeklyHours TextAlign: 3 frmTextAlignRight TextAlign: 3 frmTextAlignRight
CommandButton cmdCalculate Label TextBox 9. Save the file lblWeeklySalary txtWeeklySalary Weekly Salary: TextAlign: 3 frmTextAlignRight
2 of 6
9/20/2012 2:47 PM
Microsoft Excel VBA - Lesson 11: Messages and Events of Windows C...
http://www.functionx.com/vbaexcel/Lesson11.htm
Click
To interact with the computer, one of the most usually performed actions is to click. The mouse is equipped with two buttons. The most clicked button is the left one. Because the action simply consists of clicking, when you press this button, a simple event, called Click is sent or fired. When you press the (left) button on the mouse, the mouse pointer is usually on a Windows control. Based on this, the control that is clicked "owns" the event and must manage it. Therefore, no detailed information is provided as part of the event. The operating system believes that the control that fired the event knows what to do. For this reason, whenever you decide to code an OnClick event, you should make sure you know what control sent or fired the event. This is (one of) the most common events of Windows controls.
HourlySalary = CCur(txtHourlySalary.Text) WeeklyHours = CDbl(txtWeeklyHours.Text) WeeklySalary = HourlySalary * WeeklyHours txtWeeklySalary.Text = CStr(WeeklySalary) End Sub 3. To test the form, on the main menu of Visual Basic, click Run -> Run Sub/UserForm 4. Enter 15.48 in the Hourly Salary and 36.50 in the Weekly Hours text boxes and click Calculate
Double-Click
Another common action you perform on a control may consist of double-clicking it. This action causes the control to fire an event known as DblClick.
3 of 6
9/20/2012 2:47 PM
Microsoft Excel VBA - Lesson 11: Messages and Events of Windows C...
http://www.functionx.com/vbaexcel/Lesson11.htm
Entering a Control
Just as an application can have many forms, a form can be equipped with various controls. Such is the case for any data entry form. On a form that is equipped with many controls, only one control can be changed at a time. Such a control is said to have focus. To give focus to a control, you can click it or can keep pressing Tab until the desired control indicates that it has focus. In a form with many controls, the control that has focus may display a caret or a dotted line around its selection or its caption. When a form or a control receives focus, it fires the Enter event. We mentioned that a user can give focus to a control by clicking it. If the control is text-based, then a caret blinking in the control indicates that the control has focus. The Enter event does not take any argument: Private Sub TextBox1_Enter() End Sub
Exiting a Control
After using a control, you can switch to another control either by clicking another or by pressing Tab. This causes the focus to shift from the current control to another. If the focus shifts to another control, the control that had focus fires an Exit event. The Exit event takes one argument, : Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) End Sub
Keyboard Events
Word processing consists of manipulating text and characters on your computer until you get the fantastic result you long for. To display these characters, you press some keys on your keyboard. If the application is configured to receive text, your pressing actions will display characters on the screen. The keyboard is also used to perform various other actions such as accepting what a dialog box displays or dismissing it. When you press the keys on a keyboard, the control in which the characters are being typed sends one or more messages to the operating system. There are three main events that Microsoft Windows associates to the keyboard. KeyDown: When you press a key on the keyboard, an event called KeyDown is fired. The KeyDown event takes two arguments: Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) End Sub KeyUp: When you release a key that was pressed, an event called KeyUp fires. These two previous events apply to almost any key on the keyboard, even if you are not typing; that is, even if the result of pressing a key did not display a character on the document. Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) End Sub KeyPress: The KeyPress event fires if the key you pressed is recognized as a character key; that is, a key that would result in displaying a character in a document. Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) End Sub
4 of 6
9/20/2012 2:47 PM
Microsoft Excel VBA - Lesson 11: Messages and Events of Windows C...
http://www.functionx.com/vbaexcel/Lesson11.htm
Some keys on the keyboard don't display anything on a document. Instead, they perform (only) an action. Examples of such keys are Enter, Tab, Esc. Therefore, if you mean to find out what key you pressed, use the KeyDown event instead of the KeyPress event.
Changing Text
One of the most important messages of a text box occurs when its content changes. That is, when the text it has is deleted, added to, or edited. When you click in a text box control and start typing it or change its text, the control fires a Change event.
Control
Name
Caption
5 of 6
9/20/2012 2:47 PM
Microsoft Excel VBA - Lesson 11: Messages and Events of Windows C...
Control Label TextBox Label TextBox Label TextBox txtFullName txtLastName Full Name: txtFirstName Last Name: Name Caption First Name:
http://www.functionx.com/vbaexcel/Lesson11.htm
4. Double-click the top text box and implement its Change event as follows: Private Dim Dim Dim Sub txtFirstName_Change() FirstName As String LastName As String FullName As String
FirstName = txtFirstName.Text LastName = txtLastName.Text FullName = FirstName & " " & LastName txtFullName.Text = FullName End Sub 5. In the Object combo box, select txtLastName and implement its Change event as follows: Private Dim Dim Dim Sub txtLastName_Change() FirstName As String LastName As String FullName As String
FirstName = txtFirstName.Text LastName = txtLastName.Text FullName = FirstName & " " & LastName txtFullName.Text = FullName End Sub 6. To test the form, on the main menu of Visual Basic, click Run -> Run Sub/UserForm 7. Click the top text box, type Julienne and press Tab 8. In the other text box, start typing Pal and notice that the Full Name text box is changing
Previous
Next
6 of 6
9/20/2012 2:47 PM
http://www.functionx.com/vbaexcel/Lesson12.htm
Creating a Collection
In our lessons, we will not create new collections. We will only use two categories: the Collection class and the built-in collection. To support collections, the Visual Basic language is equipped with a class named Collection. Actually, the Collection class we are going to study here is the one defined in VBA. The parent Visual Basic language has a somewhat different Collection class with additional functionality not found in the VBA's version. This class can be used to create a collection. To do this, declare a variable of type Collection. Here is an example: Sub Exercise() Dim Employees As Collection End Sub After declaring the variable, to allocate memory for it, use the Set operator to assign a New instance to the variable. Here is an example: Sub Exercise() Dim Employees
As Collection
1 of 4
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson12.htm
Set Employees = New Collection End Sub Instead of always creating a new collection unless you have to, VBA for Microsoft Excel comes equipped with many collections so that you almost may never need to create your own collection. The collections that are already built in the VBA language are referred to as built-in collections. The built-in collection classes are derived from the Visual Basic's Collection class. As a result, all of their primary functionality comes from the Collection class. This also means that everything we will mention for the Collection class applies to any built-in collection. To use a built-in collection, you can declare a variable for it. Here is an example: Sub Exercise() Dim CurrentSheets As Worksheets End Sub In reality, and as we will next in the next lessons, when Microsoft Excel starts, most (if not all) of the built-in collection classes are already available so that you do not have to declare their variable before using them.
As Collection
Set Employees = New Collection Employees.Add "Patricia Katts" End Sub In the same way, you can add as many items as you want: Sub Exercise() Dim Employees
As Collection
Set Employees = New Collection Employees.Add Employees.Add Employees.Add Employees.Add End Sub "Patricia Katts" "James Wiley" "Gertrude Monay" "Helene Mukoko"
Remember that if you are using one of the built-in collection classes, you do not have to declare a variable for it. You can just call the Add method on it to add an item to it. Here is an example: Sub Exercise() Worksheets.Add End Sub
2 of 4
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson12.htm
cbxNameItem1.AddItem cbxNameItem1.AddItem cbxNameItem1.AddItem cbxNameItem1.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem2.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem3.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem cbxNameItem4.AddItem
"Tie" "Coat" "Jacket" "Swede" "None" "Women Suit" "Dress" "Regular Skirt" "Skirt With Hook" "Men 's Suit 2Pc" "Men 's Suit 3Pc" "Sweaters" "Silk Shirt" "Tie" "Coat" "Jacket" "Swede" "None" "Women Suit" "Dress" "Regular Skirt" "Skirt With Hook" "Men 's Suit 2Pc" "Men 's Suit 3Pc" "Sweaters" "Silk Shirt" "Tie" "Coat" "Jacket" "Swede" "None" "Women Suit" "Dress" "Regular Skirt" "Skirt With Hook" "Men 's Suit 2Pc" "Men 's Suit 3Pc" "Sweaters" "Silk Shirt" "Tie" "Coat" "Jacket" "Swede"
Rem Create the orders status cbxOrderStatus.AddItem "Processing" cbxOrderStatus.AddItem "Ready" cbxOrderStatus.AddItem "Picked Up" End Sub 3. Close Microsoft Visual Basic 4. Save the document
As Collection
Set Employees = New Collection Employees.Add Employees.Add Employees.Add Employees.Add "Patricia Katts" "James Wiley" "Gertrude Monay" "Helene Mukoko"
Employees.Item 2 End Sub Remember that you an also use parentheses: Sub Exercise() Dim Employees
As Collection
3 of 4
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson12.htm
Set Employees = New Collection Employees.Add Employees.Add Employees.Add Employees.Add "Patricia Katts" "James Wiley" "Gertrude Monay" "Helene Mukoko"
Employees.Item (2) End Sub Instead of using the Item property, you can apply the index directly to the collection object. Here are examples: Sub Exercise() Dim Employees
As Collection
Set Employees = New Collection Employees.Add Employees.Add Employees.Add Employees.Add "Patricia Katts" "James Wiley" "Gertrude Monay" "Helene Mukoko"
Employees.Item 2 Employees.Item (2) Employees 2 Employees (2) End Sub All these four techniques (notations) give you access to the item whose index you provided.
As Collection
Set Employees = New Collection Employees.Add Employees.Add Employees.Add Employees.Add "Patricia Katts" "James Wiley" "Gertrude Monay" "Helene Mukoko"
Employees.Remove 2 End Sub This code deletes the second item in the collection.
4 of 4
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson13.htm
Workbooks
Workbooks Fundamentals
Introduction
When you start Microsoft Excel, it immediately creates a new workbook. You can start working on it and, eventually, you can save it. You are then said to save the workbook. On the other hand, if you have an existing workbook somewhere in the computer or from an attached document sent from a message to you, you can open it as a document.
13. Right-click the button and click View Code 14. Write the code as follows:
Option Explicit Private AutoRepairExists As Boolean Private Sub cmdNewAutoRepair_Click() AutoRepairExists = False End Sub 15. Return to Microsoft Excel
Referring to a Workbook
In the VBA language, a workbook is an object that belongs to a collection called Workbooks. Each workbook of the Workbooks collection is an object of type Workbook, which is a class. As seen in the previous lesson with regards to collections, each workbook of the Workbooks collection can be identified using the Item property. To programmatically refer to a workbook, access the Item property and pass either the index or the file name of the workbook to it. After referring to a workbook, if you want to perform an action on it, you must get a reference to it. To do this, declare a Workbook variable and assign the calling Item() to it. This would be done as follows:
1 of 7
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson13.htm
Creating a Workbook
When it starts, Microsoft Excel creates a default blank workbook for you. Instead of using an existing workbook or while you are working on another workbook, at any time, you can create a new workbook. As mentioned already, a workbook is an object of type Workbook and it is part of the Workbooks collection. To support the ability to create a new workbook, the Workbooks collection is equipped with a method named Add. Its syntax is: Workbooks.Add(Template) As Workbook You start with the Workbooks class, a period, and the Add method. This method takes only one argument but the argument is optional. This means that you can call the method without an argument and without parentheses. Here is an example: Private Sub cmdNewWorkbook_Click() Workbooks.Add End Sub When the method is called like this, a new workbook would be created and presented to you. After creating a workbook, you may want to change some of its characteristics. To prepare for this, notice that the Add() method returns a Workbook object. Therefore, when creating a workbook, get a reference to it. To do this, assign the called method to a Workbook variable. Here is an example: Private Sub cmdNewWorkbook_Click() Dim SchoolRecords As Workbook Set SchoolRecords = Workbooks.Add End Sub After doing this, you can then use the new variable to change the properties of the workbook.
2 of 7
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson13.htm
To support the ability to programmatically change the default folder, the Application class is equipped with a property named DefaultFilePath. Therefore, to programmatically specify the default folder, assign its string to the Application.DefaultFilePath property. Here is an example: Private Sub Exercise() Application.DefaultFilePath = "C:\Georgetown Dry Cleaning Services" End Sub When this code has executed, the Default File Location of the Excel Options dialog box would be changed.
Saving a Workbook
To visually save a workbook, you can click the Office Button and click Save. You can also press Ctrl + S. If the document was saved already, it would be saved behind the scenes without your doing anything else. To support the ability to programmatically save a workbook, the Workbook class is equipped with a method named Save. Its syntax is: Workbook.Save() As you can see, this method takes no argument. If you click the Office Button and click Save or if you call the Workbook.Save() method on a work that was not saved yet, you would be prompted to provide a name to the workbook. To save a workbook to a different location, you can click the Office Button, position the mouse on Save As and select from the presented options. You can also press F12. To assist you with programmatically saving a workbook, the Workbook class is equipped with a method named SaveAs. Its syntax is: Workbook.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local) The first argument is the only required one. It holds the name or path to the file. Therefore, you can provide only a name of the file with extension when you call it. Here is an example: Private Sub cmdNewWorkbook_Click() Dim SchoolRecords As Workbook Set SchoolRecords = Workbooks.Add SchoolRecords.SaveAs "SchoolRecords.xlsx" End Sub If you provide only the name of a file when calling this method, the new workbook would be saved in the current directory or in My Documents (Documents in Windows Vista). If you want, an alternative is to provide a complete path to the file.
3 of 7
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson13.htm
6. Right-click the button and click View Code 7. Write its code as follows:
Workbook.SaveAs(FileName, FileFormat) In this case, pass the second argument as xlHTML. Here is an example: Sub Exercise() Workbooks(1).SaveAs "Affiche10.htm", xlHtml End Sub
Opening a Workbook
Microsoft Excel is a multiple document interface (MDI) application. This means that you can open many workbooks at the same time and be limited only by the memory on your computer. For this reason, the ability to programmatically open a workbook is handled by the Workbooks collection. To support this, the Workbooks class is equipped with a method named Open. Its syntax is: Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad) FileName is the only required argument. When calling this method, you must provide the name of the file or its path. This means that you can provide a file name with its extension. Here is an example: Private Sub cmdOpenWorkbook_Click() Workbooks.Open "SchoolRecords.xlsx" End Sub If you provide only the name of a file, Microsoft Excel would look for it in the current directory or in My Documents (Documents in Windows Vista). If Microsoft Excel cannot file the file, you would receive an error:
As you can imagine, a better alternative is to provide a complete path to the file.
4 of 7
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson13.htm
6. Right-click the button and click View Code 7. Write its code as follows:
Closing Workbooks
Closing a Workbook
After using a workbook or to dismiss a document you don't need, you can close it. To support this operation, the Workbook class is equipped with a method named Close. Its syntax is: Public Sub Close(Optional ByVal SaveChanges As Boolean, Optional ByVal Filename As String, Optional ByVal RouteWorkbook As Boolean) All three arguments are optional. The first argument indicates whether you want to save the
5 of 7
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson13.htm
All three arguments are optional. The first argument indicates whether you want to save the changes, if any have been made on the workbook since it was opened. If no change had been made since the time the workbook was created or since the last time it was opened, this argument is not considered. If the first argument is set to True and the workbook has changes that need to be save, the second argument specifies the name of the file to save the workbook to. The third argument specifies whether the workbook should be sent to the next user.
Private Sub cmdSaveAutoRepair_Click() ActiveWorkbook.Save ActiveWorkbook.Close End Sub 3. Return to Microsoft Excel
Accessing a Workbook
To access a workbook, the Workbook class is equipped with a method named Activate. Its syntax is: Workbook.Activate() This method takes no argument. Therefore, to call it, you can get a reference to the workbook you want to access, then call the Activate() method. Here is an example: Private Sub cmdSelectWorkbook_Click() Dim SchoolRecords As Workbook Set SchoolRecords = Workbooks.Item(2)
6 of 7
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson13.htm
Set SchoolRecords = Workbooks.Item(2) SchoolRecords.Activate End Sub You can also do this with less code by applying the index directly to the Workbooks collection. Here is an example: Private Sub cmdSelectWorkbook_Click() Workbooks(2).Activate End Sub
7 of 7
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson14.htm
Worksheets
Worksheets Fundamentals
Introduction
A worksheet is a document in Microsoft Excel. A worksheet is an object created inside a workbook. That is, a workbook is a series of worksheets that are treated as a group.
5. In the Code section, click the Visual Basic button 6. To create a form, on the main menu of Microsoft Visual Basic, click Insert -> UserForm 7. Right-click the form and click Properties 8. Change its Caption to Red Oak High School - Management
Identifying a Worksheet
A worksheet is an object of type Worksheet. The various worksheets you will use are stored in a collection called Worksheets. Another name for the collection that contains the worksheets is called Sheets. In most cases, you can use either of these two collections. Each worksheet is an object of type Worksheet.
Referring to a Worksheet
In the previous lesson, we saw that, if you have only one workbook opened, to refer to it, you can pass an index of 1 to the Item property of the Workbooks collection to access its Workbook object. Here is an example: Sub Exercise() Workbooks.Item(1) End Sub You can omit the Item name if you want and you would get the same result: Sub Exercise() Workbooks(1) End Sub Because the worksheets of a document are part of the workbook that is opened, to support them, the Workbook class is equipped with a property named Worksheets or Sheets. Therefore, after identifying the workbook, use the period operator to access the Worksheets or the Sheets property. Here is an example: Sub Exercise() Workbooks.Item(1).Sheets End Sub As mentioned already, the worksheets are stored in the Worksheets collection, which is actually a class. Each worksheet can be located based on an indexed property named Item. The Item property is a natural number that starts at 1. The most left worksheet has an index of 1. The second worksheet from left has an index of 2, and so on. To access a worksheet, type one of the Worksheets or Sheets collections, followed by the period operator, followed by Item() and, between the parentheses, type the index of the worksheet you want. For example, the following code will access the second worksheet from left: Private Sub Exercise() Workbooks.Item(1).Sheets.Item(2) End Sub Just as we saw that you can omit the Item word on the Workbooks object, you can also omit it on the Worksheets or the Sheets object. This can be done as follows: Sub Exercise() Workbooks.Item(1).Worksheets(2) End Sub
1 of 8
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson14.htm
Or as follows: Sub Exercise() Workbooks(1).Worksheets(2) End Sub Each tab of a worksheet has a label known as its name. By default, the most left tab is labeled Sheet1. The second tab from left is labeled Sheet2. To refer to a worksheet using its label, call the Worksheets or the Sheets collection and pass the label of the tab you want, as a string. Here is an example that refers to the worksheet labeled Sheet3: Sub Exercise() Workbooks.Item(1).Sheets.Item("Sheet3") End Sub On all the code we have written so far, we were getting a worksheet from the currently opened workbook. As mentioned already, by default, when Microsoft Excel starts, it creates a default workbook and gets a Workbooks.Item(1) reference. This means that you do not have to indicate that you are referring to the current workbook: it is already available. Consequently, in your code, you can omit Workbooks.Item(1) or Workbooks(1). Here is an example: Sub Exercise() Sheets.Item("Sheet3") End Sub
Selecting a Worksheet
To select a worksheet, access the Sheets collection, pass the name of the desired worksheet as string, and call Select. Here is an example that selects a worksheet labeled Sheet1: Private Sub Exercise() Sheets("Sheet1").Select End Sub The worksheet that is selected and that you are currently working on is called the active worksheet. It is identified as the ActiveSheet object (it is actually a property of the current document).
Worksheets Names
To rename a worksheet, pass its index or its default name as a string to the Sheets (or the Worksheets) collection, then access the Name property of the collection and assign the desired name. Here is an example: Private Sub Exercise() Sheets("Sheet1").Name = "Employees Records" End Sub This code will change the name of the Sheet1 worksheet to Employees Records. As we saw earlier, you can refer to, or select, a worksheet, using its name. If you had renamed a worksheet, you can use that name to select it. Here is an example that selects a worksheet named Tuition Reimbursement: Private Sub Exercise() Sheets("Tuition Reimbursement").Select End Sub
2 of 8
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson14.htm
Name
Caption Rename:
Private Sub cmdRename_Click() Worksheets(txtSheetOldName.Text).Name = txtSheetNewName.Text txtSheetOldName.Text = "" txtSheetNewName.Text = "" End Sub 3. To use the form, on the main menu of Visual Basic, click Run -> Run Sub/UserForm 4. In the Rename text box, type Sheet1 5. In the As text box, type Student Registration
6. Click Rename and notice that the To rename the first worksheet, double-click the Sheet1 tab to put it in edit mode 7. In the Rename text box, type Sheet2 8. In the As text box, type Emergency Information and click Rename
3 of 8
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson14.htm
syntax of this method is: Worksheets(Index).Move(Before, After) Both arguments are optional. If you don't specify any argument, Microsoft Visual Basic would create a new workbook with one worksheet using the index passed to the collection with a copy of that worksheet. Suppose you are (already) working on a workbook that contains a few worksheets named Sheet1, Sheet2, and Sheet3. If you call this method on a collection with the index set to one of these worksheets, Microsoft Excel would make a copy of that worksheet, create a new workbook with one worksheet that contains a copy of that worksheet. For example, the following code with create a new workbook that contains a copy of the Sheet2 of the current workbook: Private Sub CommandButton1_Click() Sheets.Item("Sheet2").Move End Sub In this case, the name of the worksheet you are passing as argument must exist. Otherwise you would receive an error. Instead of using the name of the worksheet, you can pass the numeric index of the worksheet that you want to copy. For example, the following code will create a new workbook that contains one worksheet named Sheet3: Private Sub CommandButton1_Click() Sheets.Item(3).Move End Sub If calling the Item property, make sure the index is valid, otherwise you would receive an error. To actually move a worksheet, you must specify whether it would be positioned to the left or the right of an existing worksheet. To position a worksheet to the left of a worksheet, assign it the Before factor. To position a worksheet to the left of a worksheet, assign it the After argument. Consider the following code: Private Sub cmdMove_Click() Worksheets("Sheet3").Move After:=Worksheets("Sheet1") End Sub This code will move the worksheet named Sheet3 to the right of a worksheet named Sheet1.
Control
Name
Label
4 of 8
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson14.htm
2. Double-click the Create button and implement its Click event as follows:
Private Sub cmdNewWorksheet_Click() Worksheets.Add Before:=Worksheets("Sheet3") Worksheets(Worksheets.Count - 1).Name = txtNewWorksheet.Text txtNewWorksheet.Text = "" End Sub 3. To test the code, on the Standard toolbar of Microsoft Visual Basic, click the Run Sub/UserForma button 4. Click the Create A New Worksheet Named text box and type 6th Grade
5. Click Create
6. In the same way, create new worksheets named 5th Grade, 4th Grade, 3rd Grade, 2nd Grade, and 1st Grade 7. Close the form
Removing Worksheets
To remove a worksheet, call the Delete() method of its collection. When calling this method, pass the name of the worksheet you want to remove to the collection.
5 of 8
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson14.htm
Name
txtRemoveSheet Delete
CommandButton cmdDelete
2. Double-click the Create button and implement its Click event as follows:
Private Sub cmdRemoveSheet_Click() Worksheets("Sheet3").Delete txtRemoveSheet.Text = "" End Sub 3. To test the code, on the Standard toolbar of Microsoft Visual Basic, click the Run Sub/UserForm button 4. Click the Delete The Worksheet Named text box, type Sheet3
5. Click Delete
6. After reading the warning, click Delete 7. In the same way, delete the worksheet named Sheet2
6 of 8
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson14.htm
7. In the same way, delete the worksheet named Sheet2 8. Close the form 9. Save the document
Accessing a Worksheet
To access a worksheet, the Worksheet class is equipped with a method named Activate. Its syntax is: Worksheet.Activate() This method takes no argument. To call it, get a reference to the worksheet you want to access and call the Activate() method. You can also do this with less code by applying the index directly to the Worksheets collection. Here is an example: Private Sub cmdSelectWorkbook_Click() Worksheets(2).Activate End Sub
13. Click Cell B2 and type Bethesda Car Rental 14. Click the Enter button 15. Click the Employees sheet tab 16. Click Cell B6 and type Employee # 17. Create a few employees 18. Click the Customers sheet tab 19. Click Cell B6 and type Driver's Lic. # 20. Create a few customers 21. Click the Cars sheet tab 22. Click Cell B6 and type Tag Number 23. Create a few cars 24. On the Ribbon, click Developer
25. In the Code section of the Ribbon, click Visual Basic 26. On the main menu of Microsoft Visual Basic, click Insert -> UserForm 27. If the Properties window is not available, on the main menu, click View -> Properties Window. In the Properties window, click (Name) and type frmRentalOrder 28. Click Caption and type Bethesda Car Rental - Order Processing - Rental Order 29. Add a Command Button to the form and change its properties as follows: (Name): cmdEmployees Caption: Employees 30. Right-click Employees button and click View Code 31. Implement the event as follows:
7 of 8
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson14.htm
Private Sub cmdEmployees_Click() Worksheets(2).Activate End Sub 32. Display the form again 33. Add another Command Button and change its characteristics as follows: (Name): cmdCustomers Caption: Customers 34. Double-click the Customers button and implement the event as follows:
Private Sub cmdCustomers_Click() Worksheets(3).Activate End Sub 35. Return to the form 36. Add another Command Button and change its characteristics as follows: (Name): cmdCars Caption: Cars 37. Double-click the Cars button and implement the event as follows:
Private Sub txtCars_Click() Worksheets(4).Activate End Sub 38. Show the form one more time 39. Add another Command Button and change its characteristics as follows: (Name): cmdRentalRates Caption: Rental Rates 40. Double-click the new button and implement its Click event as follows:
Private Sub cmdRentalRates_Click() Worksheets(5).Activate End Sub 41. On the Standard toolbar, click the Run Sub/UserForm button 42. Click each button and notice that the corresponding worksheet displays 43. Close the form 44. Close Microsoft Visual Basic 45. Close Microsoft Excel 46. If asked whether you want to save, click No
8 of 8
9/20/2012 2:48 PM
http://www.functionx.com/vbaexcel/Lesson15.htm
If you want to get a reference to a column or a group of columns, declare a variable of type Range: Sub Exercise() Dim Series As Range End Sub To initialize the variable, you will identify the workbooks and the worksheets you are using. We will see various examples later on.
Identifying a Column
A Column by its Index
The columns on a worksheet are arranged by positions. A position is in fact referred to as the index of the column. The first column on the left has the index 1, the second from left has the index 2, and so on. Based on this, to refer to its column, pass its index to the parentheses of the Columns collection. Here are two examples: Sub Exercise() REM This refers to the first column Workbooks(1).Worksheets(2).Columns(1) ' This refers to the 12th column Workbooks(1).Worksheets(2).Columns(12) End Sub In the previous lesson, we saw that you can omit calling the Workbooks(1) property to identify the first workbook if you know you are referring to the default workbook. Therefore, the above codee can be written as follows: Sub Exercise() REM This refers to the fourth column Worksheets(2).Columns(4) End Sub This code now indicates that you are referring to the fourth column in the second worksheet. When this code runs, Microsoft Excel must be displaying the second worksheet. If you run this code while Microsoft Excel is displaying a worksheet other than the second, you would receive an error:
This means that if you trying accessing a column from a worksheet other than the one indicated in your code, the code would fail. If you want to access a specific column in any worksheet from the workbook that Microsoft Excel is currently showing, you can omit indicating the worksheet from the Worksheets collection. Here is an example: Sub Exercise() REM This refers to the fourth column Columns(4) End Sub
1 of 4
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson15.htm
End Sub This time, the code indicates that you are referring to the fourth column of whatever worksheet is currently active.
Adjacent Columns
To programmatically refer to adjacent columns, you can use the Columns collection. In its parentheses, type the name of a column that would be on one end of the range, followed by a colon ":", followed by the name of the column that would on the other end. Here is an example that refers to columns in the range D to G: Sub ColumnReference() Rem Refer to the range of columns D to G Columns("D:G") End Sub You can also select columns using the Range class. To do this, in the ch the name of the first column, followed by a colon, followed by the name of the column on the other end. Here is an example: Sub ColumnReference() Rem This refers to the columns in the range D to G Range("D:H") End Sub
Non-Adjacent Columns
Columns are refered to as non-adjacent when they do not follow each other. For example, columns B, D, and G are non-adjacent. To programmatically refer to non-adjacent columns, use the Range collection. In its parentheses, type each name of a column, followed by a colon, followed by the same name of column, then separate these combinations with commas. Here is an example: Sub Exercise() Rem This refers to Column H, D, and B Range("H:H, D:D, B:B") End Sub To refer to all columns of a worksheet, use the Columns name. Here is an example: Sub Exercise() Columns End Sub
Columns Selection
Selecting a Column
To support column selection, the Column class is equipped with a method named Select. This method does not take any argument. Based on this, to select the fourth column using its indexed, you would use code as follows: Sub Exercise() Rem This selects the fourth column Columns(4).Select End Sub To select a column using its name, you would use code as follows: Sub Exercise() Rem This selects the column labeled ADH Columns("ADH").Select End Sub When a column has been selected, it is stored in an object called Selection. You can then use that object to take an action to apply to the column.
2 of 4
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson15.htm
Sub Exercise() Rem This selects the range of columns from Column D to Column G Columns("D:G").Select End Sub You can use this same notation to select one column. To do this, use the Range collection. In the parentheses of the colection, enter the name of the column, followed by a colon, followed by the same column name. Here is an example: Sub Exercise() Rem This selects Column G Range("G:G").Select End Sub
Creating Columns
Adding a New Column
To support the creation of columns, the Column class is equipped with a method named Insert. This method takes no argument. When calling it, you must specify the column that will succeed the new one. Here is an example that will create a new column in the third position and move the columns from 3 to 16384 to the right: Sub CreateColumn() Columns(3).Insert End Sub
Deleting Columns
Deleting a Column
To provide the ability to delete a column, the Column class is equipped with a method named Delete. This method does not take an argument. To delete a column, use the Columns collection to specify the index or the name of the column that will be deleted. Then call the Delete method. Here is an example that removes the fourth column. Here is an example: Sub DeleteColumn() Columns("D:D").Delete End Sub
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson15.htm
Introduction
To support column sizes, the Column class is equipped with a property named ColumnWidth. Therefore, to programmatically specify the width of a column, access it, then access its ColumnWidth property and assign the desired value to it. Here is an example that sets Column C's width to 4.50: Sub Exercise() Columns("C").ColumnWidth = 4.5 End Sub
4 of 4
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson16.htm
Identifying a Row
To support the rows of a worksheet, the Worksheet class is equipped with a property named Rows. Therefore, to refer to a row, you can use the Worksheets collection or the Worksheet object to access the Rows property. Another way you can refer to rows is by using the Range object. To identify a row, indicate its worksheet and you can pass its number to the parentheses of the Rows collection. Here is an example that refers to the 5th row of the second worksheet of the current workbook: Sub Exercise() Workbooks.Item(1).Worksheets.Item(2).Rows(5) End Sub As reviewed for the columns, this code would work only if the second worksheet of the current workbook is displaying. If you run it while a worksheet other than the second is active, you would receive an error. To access any row, omit the Workbooks and the Worksheets collections. As mentioned already, you can refer to a row using the Range object. To do that, pass a string to the Range object. In the parentheses, type the number of the row, followed by a colon, followed by the number of the row. Here is an example that refers to Row 4: Sub Exercise() Range("4:4") End Sub If you want to refer to the rows more than once, you can declare a variable of type Range and initialize it using the Set operator and assign it the range you want. Here is an example: Sub Exercise() Dim SeriesOfRows As Range Set SeriesOfRows = Workbooks.Item(1).Worksheets.Item("Sheet1").Range("4:4") SeriesOfRows.Whatever End Sub
Rows Selection
Selecting a Row
To support row selection, the Row class is equipped with a method named Select. Therefore, to
1 of 3
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson16.htm
To support row selection, the Row class is equipped with a method named Select. Therefore, to programmatically select a row, access a row from the Rows collection using the references we saw earlier. Then call the Select method. Here is an example that selects Row 6: Sub Exercise() Rows(6).Select End Sub We also saw that you could refer to a row using the Range object. After accessing the row, call the Select method. Here is an example that selects Row 4: Sub Exercise() Range("4:4").Select End Sub When a row has been selected, it is stored in an object called Selection. You can then use that object to apply an action to the row.
Managing Rows
The Height of a Row
To support the height of a row, the Row object is equipped with a property named RowHeight. Therefore, to programmatically specify the height of a row, access the row using a reference as we saw earlier, access its RowHeight property and assign the desired value to it. Here is an example that sets the height of Row 6 to 2.50 Sub Exercise() Rows(6).RowHeight = 2.5 End Sub
Removing Rows
Deleting a Row
To support row removal, the Row class is equipped with a method named Delete that takes no argument. Based on this, to delete a row, access it using a reference as we saw earlier, and call the Delete method. Here is an example:
2 of 3
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson16.htm
the Delete method. Here is an example: Sub Exercise() Rows(3).Delete End Sub Of course, you can use either the Rows collection or the Range object to refer to the row.
Deleting Rows
To delete a group of rows, identify them using the Range collection. Then call the Delete method. Here is an example: Sub Exercise() Range("3:3, 6:6, 10:10").Delete End Sub
Using Rows
Moving Rows
To move a group of rows, access the Range collection and identify them. Call the Cut method. Access its Destination argument to which you will assign the rows where you are moving. Here is an example: Sub Exercise() Rows("11:12").Cut Destination:=Rows("16:17") End Sub
3 of 3
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson17.htm
Introduction to Cells
A Cell in a Worksheet
Introduction
A spreadsheet is a series of columns and rows. These columns and rows intersect to create cells:
When Microsoft Excel starts, it creates 16,384 columns and 1,048,576 rows. As a result, a Microsoft Excel spreadsheet has 16,384 * 1,048,576 = 17,179,869,184 cells available.
Referencing Cells
To identify a cell, you can use the Range object. In the parentheses of the Range object, pass a string that contains the name of the cell. Here is an example that refers to the cell located as D6: Sub Exercise() Workbooks.Item(1).Worksheets.Item("Sheet1").Range("D6") End Sub To get a reference to a cell, declare a variable of type Range. To initialize the variable, identify the cell and assign it to the variable using the Set operator. Here is an example: Sub Exercise() Dim Cell As Range Set Cell = Workbooks.Item(1).Worksheets.Item("Sheet1").Range("D6") End Sub Cells are referred to as adjacent when they touch each other. To refer to a group of adjacent cells, in the parentheses of the Range object, pass a string that is made of the address of the cell that will be on one corner, followed by a colon, followed by the address of the cell that will be on the other corner. Here is an example: Sub Exercise() Range("B2:H6") End Sub You can use this same technique to refer to one cell. To do this, use the same cell address on both sides of the colon. Here is an example: Sub Exercise() Range("D4:D4") End Sub Instead of referring to one group of adjacent cells, you can refer to more than one group of non-adjacent cells. To do this, pass a string to the Range object. In the string, create each range as you want but separate them with commas. Here is an example: Sub Exercise() Range("D2:B5, F8:I14")
1 of 5
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson17.htm
Selecting Cells
Introduction
Before doing anything on a cell or a group of cells, you must first select it. To support cell selection, the Range object is equipped with a method named Select. Therefore, to programmatically select a cell, after referencing it, call the Select method. Here is an example: Sub Exercise() Range("D6").Select End Sub When you have selected a cell, it is stored in an object named Selection. You can use this object to take an action on the cell that is currently selected.
Selecting Cells
To programmatically select a group of adjacent cells, refer to the group using the techniques we saw earlier, then call the Select method. To programmatically select all cells of a column, access the Columns collection and pass the column name as a string, then call the Select method. Here is an example we saw in Lesson 9: Sub Exercise() Rem This selects all cells from the fourth column Columns(4).Select End Sub To perform this operation using the name of a column, pass that name as argument. Here is an example that selects all cells from Column ADH: Sub Exercise() Rem This selects all cells from the column labeled ADH Columns("ADH").Select End Sub You can also perform this operation using the Range object. To do this, use the Range collection. In the parentheses of the colection, enter the name of the column, followed by a colon, followed by the same column name. Here is an example: Sub Exercise() Rem This selects all cells from Column G Range("G:G").Select End Sub To programmatically select all cells that belong to a group of adjacent columns, in the parentheses of the Columns collection, enter the name of the first column on one end, followed by a colon ":", followed the name of the column that will be at the other end. Here is an example: Sub Exercise() Rem This selects all cells in the range of columns from Column D to Column G Columns("D:G").Select End Sub To select the cells that belong to a group of non-adjacent columns, use the technique we saw earlier to refer to non-adjacent columns, then call the Select method. Here is an example: Sub Exercise() Rem This selects the cells from columns B, D, and H Range("H:H, D:D, B:B").Select End Sub To programmatically select all cells that belong to a row, access a row from the Rows collection, then call the Select method. Here is an example that all cells from Row 6: Sub Exercise() Rows(6).Select End Sub You can also use the Range object. After accessing the row, call the Select method. Here is an example that selects all cells from Row 4: Sub Exercise() Range("4:4").Select End Sub To select all cells that belong to a range of rows, refer to the range and call the Select method. Here is an example that selects all cells that belong to the rows from 2 to 6: Sub Exercise() Rows("2:6").Select End Sub To select all cells that belong to non-adjacent rows, refer to the rows and call the Select method. Here is an example that selects all cells belonging to Rows 3, 5, and 8:
2 of 5
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson17.htm
To programmatically select cells in the same region, enter their range as a string to the Range object, then call the Select method. Here is an example: Sub Exercise() Range("B2:H6").Select End Sub Remember that you can use the same technique to refer to one cell, thus to select a cell. Here is an example: Sub Exercise() Range("D4:D4").Select End Sub To select more than one group of non-adjacent cells, refer to the combination as we saw earlier and call the Select method. Here is an example: Sub Exercise() Range("D2:B5, F8:I14").Select End Sub To select all cells of a spreadsheet, you can call the Select method on the Rows collection. Here is an example: Sub Exercise() Rows.Select End Sub Instead of the Rows collection, you can use the Columns collection instead and you would get the same result. When you have selected a group of cells, the group is stored in an object named Selection. You can use this object to take a common action on all of the cells that are currently selected.
Operations on Cells
Adding Cells
We know that, to insert a column made of (vertical) cells, you can access the Columns collection, specify an index in its parentheses, and call the Insert method. Here is an example: Sub CreateColumn() Columns(3).Insert End Sub We also know how to create a series of rows made of cells horizontally.
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson17.htm
8. In the Code section of the Ribbon, click Macros 9. In the Macro dialog box, make sure CreateWorkbook is selected and click Edit 10. Change the code as follows:
Option Explicit Sub CreateWorkbook() ' CreateWorkbook Macro ' This macro is used to create a workbook for the ' Georgetown Dry Cleaning Services ' Keyboard Shortcut: Ctrl+Shift+W Rem Just in case there is anything on the Rem worksheet, delete everything Range("A:K").Delete Range("1:20").Delete Rem Create the sections and headings of the worksheet Range("B2") = "Georgetown Dry Cleaning Services" Range("B5") = "Order Identification" Range("B6") = "Receipt #:" Range("G6") = "Order Status:" Range("B7") = "Customer Name:" Range("G7") = "Customer Phone:" Range("B9") = "Date Left:" Range("G9") = "Time Left:" Range("B10") = "Date Expected:" Range("G10") = "Time Expected:" Range("B11") = "Date Picked Up:" Range("G11") = "Time Picked Up:" Range("B13") Range("B14") Range("D14") Range("E14") Range("F14") Range("B15") Range("H15") Range("B16") Range("B17") = = = = = = = = = "Items to Clean" "Item" "Unit Price" "Qty" "Sub-Total" "Shirts" "Order Summary" "Pants" "None"
4 of 5
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson17.htm
Range("B17") Range("H17") Range("B18") Range("H18") Range("I18") Range("J18") Range("B19") Range("H19") Range("B20") Range("H20")
= = = = = = = = = =
"None" "Cleaning Total:" "None" "Tax Rate:" "5.75" "%" "None" "Tax Amount:" "None" "Order Total:"
Rem Change the widths and heights of some columns and rows Rem In previous lessons, we learned all these things Range("E:E, G:G").ColumnWidth = 4 Columns("H").ColumnWidth = 14 Columns("J").ColumnWidth = 1.75 Rows("3").RowHeight = 2 Range("8:8, 12:12").RowHeight = 8 Rem Hide the gridlines ActiveWindow.DisplayGridlines = False End Sub
11. To return to Microsoft Excel, click the View Microsoft Excel button 12. To fill the worksheet, press Ctrl + Shift + W
13. Close Microsoft Excel 14. When asked whether you want to save, click No
5 of 5
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson18.htm
8. In the Code section of the Ribbon, click Macros 9. In the Macro dialog box, make sure CreateWorkbook is selected and click Edit 10. Change the code as follows: Option Explicit Sub CreateWorkbook() ' CreateWorkbook Macro ' This macro is used to create a workbook for the ' Georgetown Dry Cleaning Services ' Keyboard Shortcut: Ctrl+Shift+W Rem Just in case there is anything on the Rem worksheet, delete everything Range("A:K").Delete Range("1:20").Delete Rem Create the sections and headings of the worksheet Range("B2") = "Georgetown Dry Cleaning Services" Range("B5") = "Order Identification" Range("B6") = "Receipt #:" Range("G6") = "Order Status:" Range("B7") = "Customer Name:" Range("G7") = "Customer Phone:" Range("B9") = "Date Left:" Range("G9") = "Time Left:" Range("B10") = "Date Expected:" Range("G10") = "Time Expected:" Range("B11") = "Date Picked Up:" Range("G11") = "Time Picked Up:"
1 of 7
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson18.htm
Range("G11") = "Time Picked Up:" Range("B13") Range("B14") Range("D14") Range("E14") Range("F14") Range("B15") Range("H15") Range("B16") Range("B17") Range("H17") Range("B18") Range("H18") Range("I18") Range("J18") Range("B19") Range("H19") Range("B20") Range("H20") = = = = = = = = = = = = = = = = = = "Items to Clean" "Item" "Unit Price" "Qty" "Sub-Total" "Shirts" "Order Summary" "Pants" "None" "Cleaning Total:" "None" "Tax Rate:" "5.75" "%" "None" "Tax Amount:" "None" "Order Total:"
Rem Change the widths and heights of some columns and rows Rem In previous lessons, we learned all these things Range("E:E, G:G").ColumnWidth = 4 Columns("H").ColumnWidth = 14 Columns("J").ColumnWidth = 1.75 Rows("3").RowHeight = 2 Range("8:8, 12:12").RowHeight = 8 Rem Hide the gridlines ActiveWindow.DisplayGridlines = False End Sub
11. To return to Microsoft Excel, click the View Microsoft Excel button 12. To fill the worksheet, press Ctrl + Shift + W
13. Close Microsoft Excel 14. When asked whether you want to save, click No
2 of 7
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson18.htm
Rem Just in case there is anything on the Rem worksheet, delete everything Range("A:K").Delete Range("1:20").Delete Rem Create the sections and headings of the worksheet Range("B2") = "Georgetown Dry Cleaning Services" Range("B2").Font.Name = "Rockwell Condensed" Range("B5") = "Order Identification" Range("B5").Font.Name = "Cambria" Range("B6") Range("G6") Range("B7") Range("G7") = = = = "Receipt #:" "Order Status:" "Customer Name:" "Customer Phone:"
Range("B9") = "Date Left:" Range("G9") = "Time Left:" Range("B10") = "Date Expected:" Range("G10") = "Time Expected:" Range("B11") = "Date Picked Up:" Range("G11") = "Time Picked Up:" Range("B13") = "Items to Clean" Range("B13").Font.Name = "Cambria" Range("B14") Range("D14") Range("E14") Range("F14") = = = = "Item" "Unit Price" "Qty" "Sub-Total"
Range("B15") = "Shirts" Range("H15") = "Order Summary" Range("H15").Font.Name = "Cambria" . . . No Change End Sub 2. Return to Microsoft Excel and press Ctrl + Shift + W to see the result
3 of 7
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson18.htm
Rem Just in case there is anything on the Rem worksheet, delete everything Range("A:K").Delete Range("1:20").Delete Rem Create the sections and headings of the worksheet Range("B2") = "Georgetown Dry Cleaning Services" Range("B2").Font.Name = "Rockwell Condensed" Range("B2").Font.Size = 24 Range("B5") = "Order Identification" Range("B5").Font.Name = "Cambria" Range("B5").Font.Size = 14 . . . No Change Range("B13") = "Items to Clean" Range("B13").Font.Name = "Cambria" Range("B13").Font.Size = 14 Range("B14") Range("D14") Range("E14") Range("F14") = = = = "Item" "Unit Price" "Qty" "Sub-Total"
Range("B15") = "Shirts" Range("H15") = "Order Summary" Range("H15").Font.Name = "Cambria" Range("H15").Font.Size = 14 . . . No Change End Sub 2. Return to Microsoft Excel and press Ctrl + Shift + W to see the result
4 of 7
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson18.htm
Range("B15") = "Shirts" Range("H15") = "Order Summary" Range("H15").Font.Name = "Cambria" Range("H15").Font.Size = 14 Range("H15").Font.Bold = True . . . No Change End Sub 2. Return to Microsoft Excel and press Ctrl + Shift + W to see the result 3. Return to Microsoft Visual Basic
Text Color
A character or text can use a color to get a better visual representation. The VBA supports colors at different levels. To support colors, the Font object is equipped with a property named Color. To specify the color, assign the desired color to the property. The VBA provides a (limited) list of colors that each can be specified using a named constant. They are: Color Name Constant Black Red Green Yellow Blue Magenta Cyan White vbBlack vbRed vbGreen vbYellow vbBlue vbMagenta vbCyan vbWhite Value &h00 &hFF &hFF00 &hFFFF &hFF0000 &hFF00FF &hFFFF00 &hFFFFFF Color
Therefore, the available colors are vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan, and vbWhite. These are standard colors. In reality, a color in Microsoft Windows is represented as a value between 0 and 16,581,375 (in the next lesson, we will know where that number comes from). This means that you can assign a positive number to the Font.Color property and use the equivalent color. The colors in the Font Color button are represented by a property named ThemeColor. Each one of the colors in the Theme Colors section has an equivalent name in the VBA. If you know the name of the color, assign it to the ThemeColor property. As another alternative to specify a color, in the next lesson, we will see that you can use a function named RGB to specify a color.
5 of 7
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson18.htm
. . . No Change Range("H15") = "Order Summary" Range("H15").Font.Name = "Cambria" Range("H15").Font.Size = 14 Range("H15").Font.Bold = True Range("H15").Font.ThemeColor = 5 . . . No Change End Sub 2. Return to Microsoft Excel and press Ctrl + Shift + W to see the result
Cell Alignment
Cells Merging
To programmatically merge some cells, first select them and access the MergeCells Boolean property. Then assign True or False depending on your intentions.
6 of 7
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson18.htm
Sub CreateWorkbook() . . . No Change Rem Merge the cells H15, I15, H16, and I16 Range("H15:I16").MergeCells = True Rem Hide the gridlines ActiveWindow.DisplayGridlines = False End Sub
7 of 7
9/20/2012 2:49 PM
http://www.functionx.com/vbaexcel/Lesson19.htm
After creating the constant, you can use its name wherever its value would have been used. Some of the constants you will use in your expressions have already been created. We will mention them when necessary.
Introduction to Expressions
An expression is one or more symbols combined with one or more values to create another value. For example, +16 is an expression that creates the positive value 16. Most expressions that we know are made of arithmetic calculations. An example is 422.82 * 15.55. To add an expression to a selected cell, assign it to the ActiveCell object. Here is an example: Sub Exercise() ActiveCell = 422.82 * 15.5 End Sub
7. In the Code section of the Ribbon, click Macros 8. In the Macro dialog box, make sure CreateWorkbook is selected and click Edit 9. Change the code as follows:
Sub CreateWorkbook() ' ' CreateWorkbook Macro ' This macro is used to create a workbook for the ' Georgetown Dry Cleaning Services ' ' Keyboard Shortcut: Ctrl+Shift+W ' Rem Just in case there is anything on the Rem worksheet, delete everything Range("A:K").Delete Range("1:20").Delete Rem Create the sections and headings of the worksheet Range("B2") = "Georgetown Dry Cleaning Services" Range("B2").Font.Name = "Rockwell Condensed" Range("B2").Font.Size = 24 Range("B2").Font.Bold = True Range("B2").Font.Color = vbBlue Range("B3:J3").Interior.ThemeColor = xlThemeColorLight2 Range("B5") = "Order Identification" Range("B5").Font.Name = "Cambria" Range("B5").Font.Size = 14 Range("B5").Font.Bold = True Range("B5").Font.ThemeColor = 5 Rem To draw a thick line, change the bottom
1 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson19.htm
Range("B14:F14").Borders(xlEdgeLeft).LineStyle = xlContinuous Range("B14:F14").Borders(xlEdgeLeft).Weight = xlThin Range("B14:F14").Borders(xlEdgeTop).LineStyle = xlContinuous Range("B14:F14").Borders(xlEdgeTop).Weight = xlThin Range("B14:F14").Borders(xlEdgeRight).LineStyle = xlContinuous Range("B14:F14").Borders(xlEdgeRight).Weight = xlThin Range("B14:F14").Borders(xlEdgeBottom).LineStyle = xlContinuous Range("B14:F14").Borders(xlEdgeBottom).Weight = xlThin Range("C14").Borders(xlEdgeRight).LineStyle = xlContinuous Range("C14").Borders(xlEdgeRight).Weight = xlThin Range("D14").Borders(xlEdgeRight).LineStyle = xlContinuous Range("D14").Borders(xlEdgeRight).Weight = xlThin Range("E14").Borders(xlEdgeRight).LineStyle = xlContinuous Range("E14").Borders(xlEdgeRight).Weight = xlThin Range("B15") = "Shirts" Range("B15").Borders(xlEdgeLeft).LineStyle = xlContinuous Range("B15").Borders(xlEdgeLeft).Weight = xlThin Range("H15") = "Order Summary" Range("H15").Font.Name = "Cambria" Range("H15").Font.Size = 14 Range("H15").Font.Bold = True Range("H15").Font.ThemeColor = 5
2 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson19.htm
3 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson19.htm
Range("E18").Borders(xlEdgeRight).Weight = xlHairline Range("F18").Borders(xlEdgeRight).LineStyle = xlContinuous Range("F18").Borders(xlEdgeRight).Weight = xlThin Range("B19:C19").Borders(xlEdgeBottom).LineStyle = xlContinuous Range("B19:C19").Borders(xlEdgeBottom).Weight = xlThin Range("D19:F19").Borders(xlEdgeBottom).LineStyle = xlContinuous Range("D19:F19").Borders(xlEdgeBottom).Weight = xlHairline Range("D19").Borders(xlEdgeRight).LineStyle = xlContinuous Range("D19").Borders(xlEdgeRight).Weight = xlHairline Range("E19").Borders(xlEdgeRight).LineStyle = xlContinuous Range("E19").Borders(xlEdgeRight).Weight = xlHairline Range("F19").Borders(xlEdgeRight).LineStyle = xlContinuous Range("F19").Borders(xlEdgeRight).Weight = xlThin Range("B20:F20").Borders(xlEdgeBottom).LineStyle = xlContinuous Range("B20:F20").Borders(xlEdgeBottom).Weight = xlThin Range("D20").Borders(xlEdgeRight).LineStyle = xlContinuous Range("D20").Borders(xlEdgeRight).Weight = xlHairline Range("E20").Borders(xlEdgeRight).LineStyle = xlContinuous Range("E20").Borders(xlEdgeRight).Weight = xlHairline Range("F20").Borders(xlEdgeRight).LineStyle = xlContinuous Range("F20").Borders(xlEdgeRight).Weight = xlThin Range("H20") = "Order Total:" Range("I20").Borders(xlEdgeBottom).LineStyle = xlContinuous Range("I20").Borders(xlEdgeBottom).Weight = xlHairline Rem Change the widths and heights of some columns and rows Rem In previous lessons, we learned all these things Range("E:E, G:G").ColumnWidth = 4 Columns("H").ColumnWidth = 14 Columns("J").ColumnWidth = 1.75 Rows("3").RowHeight = 2 Range("8:8, 12:12").RowHeight = 8 Rem Merge the cells H15, I15, H16, and I16 Range("H15:I16").MergeCells = True Rem Align the merged text to the left Range("H15:H16").VerticalAlignment = xlBottom Range("H16").Borders(xlEdgeBottom).LineStyle = xlContinuous Range("H16:I16").Borders(xlEdgeBottom).Weight = xlMedium Range("H16:I16").Borders(xlEdgeBottom).ThemeColor = 5 Rem Hide the gridlines ActiveWindow.DisplayGridlines = False End Sub
10. To return to Microsoft Excel, click the View Microsoft Excel button 11. To fill the worksheet, press Ctrl + Shift + W
Introduction to Formulas
A formula is another name for an expression. It combines one or more values, one or more variables, to an operator, to produce a new value. This also means that you use the same approach or building an expression when creating a formula. To assist you with assigning the result of a formula to a cell or a group of cells, the Range class is equipped with a property named Formula. This property is of type Variant, which means its value can be anything, not necessarily a number. After accessing the Formula property, you can assign whatever value, expression, or formula you want to it. Here are examples: Sub Exercise() Rem Using the Formula property to assign a string to the active cell ActiveCell.Formula = "Weekly Salary:" Rem Using the Formula property to assign an expression to cell B2 Range("B2").Formula = 24.5 * 42.5 Rem Using the Formula property to assign Rem the same string to a group of cells Range("C2:F5, B8:D12").Formula = "Antoinette" End Sub If you are creating a worksheet that would be used on computers of different languages, use FormulaLocal instead. The FormulaLocal property is equipped to adapt to a different language-based version of Microsoft Excel when necessary. Besides Formula, the Range class is also equipped with a property named FormulaR1C1. Its functionality is primarily the same as Formula. Here are examples: Sub Exercise() Rem Using the Formula property to assign a string to the active cell ActiveCell.FormulaR1C1 = "Weekly Salary:" Rem Using the Formula property to assign an expression to cell B2
4 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson19.htm
If you are creating the worksheet for various languages, use FormulaR1C1Local instead.
6. In the Code section of the Ribbon, click Macros 7. In the Macro dialog box, make sure CalculateOrder is selected and click Edit 8. Change the code as follows:
Sub CalculateOrder() ' ' CreateWorkbook Macro ' ' Keyboard Shortcut: Ctrl+Shift+C ' Rem Calculate the sub-total of each category of items as: Rem SubTotal = Unit Price * Quantity Rem And display the total in the equivalent F cell Range("F15").Formula = Range("D15") * Range("E15") Range("F16").Formula = Range("D16") * Range("E16") Range("F17").Formula = Range("D17") * Range("E17") Range("F18").Formula = Range("D18") * Range("E18") Range("F19").Formula = Range("D19") * Range("E19") Range("F20").Formula = Range("D20") * Range("E20") Rem Retrieve the values of the cleaning total and the tax rate Rem Use them to calculate the amount of tax Range("I19").Formula = Range("I17") * Range("I18") / 100 Rem Calculate the total order by adding Rem the cleaning total to the tax amount Range("I20").Formula = Range("I17") + Range("I19") End Sub
5 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson19.htm
function, type Application, followed by a period, followed by a period. Then type (or select the name of the function you want to use:
After specifying the function you want to use, because it is a function, you must include the parentheses. In the parentheses, type the necessary argument(s). Here is an example: Private Sub cmdCreate_Click() txtValue.Text = Application.WorksheetFunction.Sum(Range("D4:D8")) End Sub
Conversion Functions
You may recall that when studying data types, we saw that each had a corresponding function used to convert a string value or an expression to that type. As a reminder, the general syntax of the conversion functions is: ReturnType = FunctionName(Expression) The Expression could be of any kind. For example, it could be a string or expression that would produce a value such as the result of a calculation. The conversion function would take such a value, string, or expression and attempt to convert it. If the conversion is successful, the function would return a new value that is of the type specified by the ReturnType in our syntax. The conversion functions are as follows: Function Name CBool CByte CDbl CDec CInt CLng CObj CSByte CShort CSng CUInt CULng CUShort Return Type Boolean Byte Double Decimal Integer Long Object SByte Short Single UInt ULong UShort Description Converts an expression into a Boolean value Converts an expression into Byte number Converts an expression into a floating-point number with double precision Converts an expression into a decimal number Converts an expression into an integer (natural) number Converts an expression into a long integer (a large natural) number Converts an expression into an Object type Converts an expression into a signed byte Converts an expression into a short integer Converts an expression into a floating-point number with single precision Converts an expression into an unsigned integer Converts an expression into an unsigned long integer Converts an expression into an unsigned short integer
Sub CalculateOrder() ' ' CalculateOrder Macro ' ' Keyboard Shortcut: Ctrl+Shift+C Rem Calculate the sub-total of each category of items as: Rem SubTotal = Unit Price * Quantity Rem And display the total in the equivalent F cell Range("F15").Formula = CDbl(Range("D15")) * CInt(Range("E15")) Range("F16").Formula = CDbl(Range("D16")) * CInt(Range("E16")) Range("F17").Formula = CDbl(Range("D17")) * CInt(Range("E17")) Range("F18").Formula = CDbl(Range("D18")) * CInt(Range("E18"))
6 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson19.htm
Range("F18").Formula = CDbl(Range("D18")) * CInt(Range("E18")) Range("F19").Formula = CDbl(Range("D19")) * CInt(Range("E19")) Range("F20").Formula = CDbl(Range("D20")) * CInt(Range("E20")) Rem Retrieve the values of the cleaning total and the tax rate Rem Use them to calculate the amount of tax Range("I19").Formula = CDbl(Range("I17")) * CDbl(Range("I18")) / 100 Rem Calculate the total order by adding the Rem cleaning total to the tax amount Range("I20").Formula = CDbl(Range("I17")) + CDbl(Range("I19")) End Sub
7 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson20.htm
Strings
Introduction to Strings
A String
A string is one or a combination of characters. To declare a variable for it, you can use either String or the Variant data types. To initialize the variable, put its value in double-quotes and assign it to the variable. Here are examples:
Here is an example: Sub Exercise() ActiveCell = "AAA" End Sub When this code runs, the value AAA would be entered into any cell that is currently selected. Sub Exercise() Dim FirstName As Variant Dim LastName As String FirstName = "William" LastName = "Sansen" End Sub
String Concatenation
A string concatenation consists of adding one string to another. to support this operation, you can use either the + or the & operator. Here are examples: Sub Exercise() Dim FirstName As Variant Dim LastName As String Dim FullName As String FirstName = "William" LastName = "Sansen" FullName = LastName + ", " & FirstName ActiveCell = "Full Name: " & FullName End Sub This would produce:
Introduction to Characters
Getting the ASCII Character of a Number
The characters used in the US English and the most common characters of Latin-based languages are created in a list or map of character codes. Each character is represented with a small number between 0 and 255. This means that each character must fit in a byte. To help you find the equivalent ASCII character of such a number, the Visual Basic language provides a function named Chr. Its syntax is:
1 of 6
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson20.htm
Public Function Chr(ByVal CharCode As Integer) As String When calling this function, pass a small number as argument. Here is an example: Sub Exercise() Dim Character As String Dim Number As Integer Number = 114 Character = Chr(Number) ActiveCell = "The ASCII character of " & Number & " is " & Character End Sub This would produce:
Besides finding the ASCII equivalent of a number, the Chr() function can be used to apply some behavior in a program. For example, a combination of Chr(13) and Chr(10) would break a line in an expression, which is equivalent to the vbCrLf operator.
2 of 6
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson20.htm
The Microsoft Excel library provides the LEN() function that produces the same result.
3 of 6
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson20.htm
Case Conversion
If you are presented with a string or an expression whose cases must be the same, you can convert all of its characters in either uppercase or lowercase. To convert a character, a string or an expression to uppercase, you can call the VBA's UCase() or the Microsoft Excel's UPPER() functions. These functions take one argument as the string or expression to be considered. The syntaxes are: Function UCase(ByVal Value As String) As String Function UPPER(ByVal Value As String) As String Each function receives a character or string as argument. If a character is already in uppercase, it would be returned the same. If the character is not a readable character, no conversion would happen and the function would return it. If the character is in lowercase, it would be converted to uppercase and the function would then return the uppercase equivalent. Here is an example: Sub Exercise() Dim ProgrammingEnvironment As String ProgrammingEnvironment = "Visual Basic for Application for Microsoft Excel" ActiveCell = UCase(ProgrammingEnvironment) End Sub To convert a character or a string to lowercase, you can call the VBA's LCase() or the Microsoft Excel's UPPER() functions. Their syntaxes are: Function LCase(ByVal Value As String) As String Function LOWER(ByVal Value As String) As String The function takes a character or a string as argument. If a character is not a readable symbol, it would be kept "as is". If the character is in lowercase, it would not be converted. If the character is in uppercase, it would be converted to lowercase.
4 of 6
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson20.htm
words, you cannot have a sub-string if you do not have a string in the first place.
Finding a Sub-String
One of the most regular operations you will perform on a string consists of finding out whether it contains a certain character or a certain contiguous group of characters. To help you with this operation, the Visual Basic language provides the InStr() function and the Microsoft Excel library equipped with the FIND() function. Their syntaxes are: InStr([start, ]string1, string2[, compare]) FIND([Find_Text, Within_Text, Start_Num) In the first version of the function, the String1 argument is the string on which the operation will be performed. The String2 argument is the character or the sub-string to look for. If String2 is found in String1 (as part of String1), the function return the position of the first character. Here is an example: The first version of the function asks the interpreter to check String1 from the left looking for String2. If String1 contains more than one instance of String2, the function returns (only) the position of the first instance. Any other subsequent instance would be ignored. If you want to skip the first instance or want the interpreter to start checking from a position other than the left character, use the second version. In this case, the Start argument allows you to specify the starting position from where to start looking for String2 in String1. The InStr() function is used to start checking a string from the left side. If you want to start checking from the right side, call the InStrRev() function. Its syntax is: InstrRev(stringcheck, stringmatch[, start[, compare]])
5 of 6
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson20.htm
After finding a character or a sub-string inside of a string, you can take action on it. One of the operations you can perform consists of replacing that character or that sub-string with another character or a sub-string. To do this, the Visual Basic language provides the Replace() function and Microsoft Excel provides the REPLACE() function. Its syntax is: Replace(expression, find, replace[, start[, count[, compare]]]) REPLACE(Old_Text, Find_Text, Start_Num, Num_Characters, New_Text) The first argument is the string on which the operation will be performed. The second argument is the character or string to look for in the Expression. If that character or string is found, the third argument is the character or string to replace it with.
6 of 6
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson21.htm
Introduction to Conditions
Introduction to Boolean Values
Introduction
A value is referred to as Boolean if it can be either true or false. As you may imagine, the essence of a Boolean value is to check that a condition is true or false, valid or invalid.
To initialize a Boolean variable, assign it a True or a False value. In the Visual Basic language, a Boolean variable can also deal with numeric values. The False value is equivalent to 0. For example, instead of False, you can initialize a Boolean variable with 0. Any other numeric value, whether positive or negative, corresponds to True: Sub Exercise() Dim EmployeeIsMarried As Boolean EmployeeIsMarried = -792730 Range("B2").FormulaR1C1 = "Employee Is Married? " & EmployeeIsMarried End Sub This would produce:
The number can be decimal or hexadecimal: Sub Exercise() Dim EmployeeIsMarried As Boolean EmployeeIsMarried = &HFA26B5 Range("B2").FormulaR1C1 = "Employee Is Married? " & EmployeeIsMarried End Sub
1 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson21.htm
To pass an argument as a Boolean value, in the parentheses of the procedure, type the name of the argument followed by the As Boolean expression. Here is an example: Private Sub CheckingEmployee(ByVal IsFullTime As Boolean) End Sub In the same way, you can pass as many Boolean arguments as you need, and you can combine Boolean and non-Boolean arguments as you judge necessary. Then, in the body of the procedure, use (or do not use) the Boolean argument as you wish.
If the argument is holding any other value that cannot be identified as a number, the function produces False. Here is an example: Sub Exercise() Dim Value As Variant Value = #12/4/1770# Range("B2").FormulaR1C1 = "Is Numeric? " & IsNumeric(Value)
2 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson21.htm
If the value of the argument cannot be evaluated to a valid date or time, the function returns False. Here is an example: Sub Exercise() Dim DateHired As Variant DateHired = "Who Knows?" Range("B2").FormulaR1C1 = "Is it a valid date? " & IsDate(DateHired) End Sub This would produce:
Logical Operators
Introduction
A comparison is an operation used to get the boolean result of two values one checked against the other. Such a comparison is performed between two values of the same type.
Equality
To compare two variables for equality, use the = operator. Its syntax is: Value1 = Value2 The equality operation is used to find out whether two variables (or one variable and a constant) hold the same value. From our syntax, the value of Value1 would be compared with the value of Value2. If Value1 and Value2 hold the same value, the comparison produces a True result. If they are different, the comparison renders false or 0.
3 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson21.htm
Here is an example: Sub Exercise() Dim IsFullTime As Boolean Range("B2").FormulaR1C1 = "Is Employee Full Time? " & IsFullTime) IsFullTime = True Range("B4").FormulaR1C1 = "Is Employee Full Time? " & IsFullTime) End Sub This would produce:
Inequality <>
As opposed to checking for equality, you may instead want to know whether two values are different. The operator used to perform this comparison is <> and its formula is: Variable1 <> Variable2
If the operands on both sides of the operator are the same, the comparison renders false. If both operands hold different values, then the comparison produces a true result. This also shows that the equality = and the inequality <> operators are opposite. Here is an example: Public Function IsDifferent(ByVal Value1 As Integer, _ ByVal Value2 As Integer) As Boolean IsDifferent = Value1 <> Value2 End Function Sub Exercise() Dim a%, b% Dim Result As Boolean a% = 12: b% = 48 Result = IsDifferent(a%, b%) Range("B2").FormulaR1C1 = "The resulting comparison of 12 <> 48 is " & Result End Sub This would produce:
4 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson21.htm
Here is an example: Sub Exercise() Dim PartTimeSalary, ContractorSalary As Double Dim IsLower As Boolean PartTimeSalary = 20.15 ContractorSalary = 22.48 IsLower = PartTimeSalary < ContractorSalary MsgBox ("Part Time Salary: " & PartTimeSalary & vbCrLf & _ "Contractor Salary: " & ContractorSalary & vbCrLf & _ "Is PartTimeSalary < ContractorSalary? " & IsLower) PartTimeSalary = 25.55 ContractorSalary = 12.68 IsLower = PartTimeSalary < ContractorSalary MsgBox ("Part Time Salary: " & PartTimeSalary & vbCrLf & _ "Contractor Salary: " & ContractorSalary & vbCrLf & _ "Is PartTimeSalary < ContractorSalary? " & IsLower) End Sub This would produce:
5 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson21.htm
Here is an example: Sub Exercise() Dim PartTimeSalary, ContractorSalary As Double Dim IsLower As Boolean PartTimeSalary = 20.15 ContractorSalary = 22.48 IsLower = PartTimeSalary > ContractorSalary MsgBox ("Part Time Salary: " & PartTimeSalary & vbCrLf & _ "Contractor Salary: " & ContractorSalary & vbCrLf & _ "Is PartTimeSalary > ContractorSalary? " & IsLower) PartTimeSalary = 25.55 ContractorSalary = 12.68 IsLower = PartTimeSalary > ContractorSalary MsgBox ("Part Time Salary: " & PartTimeSalary & vbCrLf & _ "Contractor Salary: " & ContractorSalary & vbCrLf & _ "Is PartTimeSalary > ContractorSalary? " & IsLower) End Sub This would produce:
6 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson21.htm
Meaning Equality to Not equal to Less than Less than or equal to Greater than Greater than or equal to
Example a=b 12 <> 7 25 < 84 Cab <= Tab 248 > 55 Val1 >= Val2
7 of 7
9/20/2012 2:50 PM
http://www.functionx.com/vbaexcel/Lesson22.htm
Once the condition has been checked, you can use the result (as True or False) to take action. Because there are different ways to check a condition, there are also different types of keywords to check different things. To use them, you must be aware of what each does or cannot do so you would select the right one.
Name
5. Return to Microsoft Excel 6. Save the file with the name Conditions1 as a Macro-Enabled Workbook 7. Return to Microsoft Visual Basic 8. Right-click the form and click View Code
1 of 4
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson22.htm
If there are many statements to execute as a truthful result of the condition, you should write the statements on alternate lines. Of course, you can use this technique even if the condition you are examining is short. If you write the conditional statement in more than one line, you must end it with End If on its own line. The formula used is: If ConditionToCheck Then Statement End If Here is an example: Sub Exercise() Dim IsMarried As Boolean Dim TaxRate As Double TaxRate = 33# MsgBox ("Tax Rate: " & TaxRate & "%") IsMarried = True If IsMarried = True Then TaxRate = 30.65 MsgBox ("Tax Rate: " & TaxRate & "%") End If End Sub
FirstName = txtFirstName.Text LastName = txtLastName.Text FullName = LastName & ", " & FirstName txtFullName.Text = FullName If LastName = "" Then txtFullName.Text = FirstName End Sub 2. In the Variant combo box, select txtLastName and change its Change event as follows: Private Dim Dim Dim Sub txtLastName_Change() FirstName As String LastName As String FullName As String
FirstName = txtFirstName.Text LastName = txtLastName.Text FullName = LastName & ", " & FirstName txtFullName.Text = FullName If LastName = "" Then txtFullName.Text = FirstName End Sub 3. To test the form, on the main menu of Visual Basic, click Run -> Run Sub/UserForm 4. Click the top text box and type Julienne. Notice that only the first name displays in the Full Name text box
2 of 4
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson22.htm
5. Press Tab 6. In the other text box, start typing Pal and notice that the Full Name text box is changing 7. Complete it with Palace 8. Close the form and return to Microsoft Visual Basic
Based on this, if you want to check whether a newly declared and uninitialized Boolean variable is false, you can omit the = False expression applied to it. Here is an example: Sub Exercise() Dim IsMarried As Boolean Dim TaxRate As Double TaxRate = 33# If IsMarried Then TaxRate = 30.65 MsgBox ("Tax Rate: " & TaxRate & "%") End Sub This would produce:
Notice that there is no = after the If IsMarried expression. In this case, the value of the variable is False. On the other hand, if you want to check whether the variable is True, make sure you include the = True expression. Overall, whenever in doubt, it is safer to always initialize your variable and it is safer to include the = True or = False expression when evaluating the variable: Sub Exercise() Dim IsMarried As Boolean Dim TaxRate As Double TaxRate = 36.45 ' % IsMarried = True If IsMarried = False Then TaxRate = 33.15 MsgBox ("Tax Rate: " & TaxRate & "%") End Sub In the previous lesson, we introduced some Boolean-based functions such as IsNumeric and IsDate. The default value of these functions is True. This means that when you call them, you can omit the = True expression.
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson22.htm
FirstName = txtFirstName.Text LastName = txtLastName.Text If LastName = "" Then FullName = FirstName Else FullName = LastName & ", " & FirstName End If txtFullName.Text = FullName End Sub Private Dim Dim Dim Sub txtLastName_Change() FirstName As String LastName As String FullName As String
FirstName = txtFirstName.Text LastName = txtLastName.Text If FirstName = "" Then FullName = LastName Else FullName = LastName & ", " & FirstName End If txtFullName.Text = FullName End Sub 2. Press F5 to test the form 3. After using the form, close it and return to Visual Basic
4 of 4
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson23.htm
Functional Conditions
Alternatives to a Condition Being True/False?
The If...Then...ElseIf Condition
The If...Then...ElseIf statement acts like the If...Then...Else expression, except that it offers as many choices as necessary. The formula is:
If Condition1 Then Statement1 ElseIf Condition2 Then Statement2 ElseIf Conditionk Then Statementk End If The program will first examine Condition1. If Condition1 is true, the program will execute Statment1 and stop examining conditions. If Condition1 is false, the program will examine Condition2 and act accordingly. Whenever a condition is false, the program will continue examining the conditions until it finds one that is true. Once a true condition has been found and its statement executed, the program will terminate the conditional examination at End If. Here is an example: Sub Exercise() Dim MemberAge As Byte MemberAge = 32 If MemberAge <= 18 Then MsgBox ("Membership: " & "Teen") ElseIf MemberAge < 55 Then MsgBox ("Membership: " & "Adult") End If End Sub This would produce:
Name
Other Properties
txtQuantity
TextAlign: 3 frmTextAlignRight
CommandButton cmdEvaluate Evaluate Frame Label TextBox Based on the Specified Quantity Each CD will cost: txtUnitPrice 0.00 TextAlign: 3 frmTextAlignRight
1 of 1
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson24.htm
Conditional Selections
The Select...Case Statement
Introduction
If you have a large number of conditions to examine, the If...Then...Else statement will go through each one of them. The Visual Basic language offers the alternative of jumping to the statement that applies to the state of a condition. This is referred to as a select case condition and it uses the keywords Select and Case. The formula of the Select Case statement is:
Select Case Expression Case Expression1 Statement1 Case Expression2 Statement2 Case Expression_X Statement_X End Select The statement starts with Select Case and ends with End Select. On the right side of Select Case, enter a value, the Expression factor, that will be used as a tag. The value of Expression can be a Boolean value (a Boolean type), a character or a string (a String type), a natural number (a Byte, an Integer, or a Long type), a decimal number (a Single or a Double type), a date or time value (a Date type), an enumeration (an Enum type), or else (a Variant type). Inside the Select Case and the End Select lines, you provide one or more sections that each contains a Case keyword followed by a value. The value on the right side of a Case, Expresion1, Expresion2, or Expresion_X, must be the same type as the value of Expression or it can be implied from it. After the case and its expression, you can write a statement. When this section of code is accessed, the value of Expression is considered. Then the value of Expression is compared to each Expression_X of each case: a. If the value of Expression1 is equal to that of Expression, then Statement1 is executed. If the value of Expression1 is not equal to that of Expression, then the interpreter moves to Expression2 b. If the value of Expression2 is equal to that of Expression, then Statement2 is executed c. This will continue down to the last Expression_X Here is an example: Sub Exercise Dim Answer As Byte Answer = CByte(InputBox( _ "One of the following is not a Visual Basic keyword" & vbCrLf & _ "1) Function" & vbCrLf & _ "2) Except" & vbCrLf & _ "3) ByRef" & vbCrLf & _ "4) Each" & vbCrLf & vbCrLf & _ "Your Answer? ")) Select Case Answer Case 1 MsgBox("Wrong: Function is a Visual Basic keyword." & vbCrLf & _ "It is used to create a procedure of a function type") Case 2 MsgBox("Correct: Except is not a keyword in " & vbCrLf & _ "Visual Basic but __except is a C++ " & vbCrLf & _ "keyword used in Exception Handling") Case 3 MsgBox("Wrong: ByRef is a Visual Basic keyword used " & vbCrLf & _ "to pass an argument by reference to a procedure") Case 4 MsgBox("Wrong: The ""Each"" keyword is used in " & vbCrLf & _ "Visual Basic in a type of looping " & vbCrLf & _ "used to ""scan"" a list of item.") End Select End Sub Here is an example of running the program:
1 of 7
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson24.htm
6. Save the workbook 7. To open Microsoft Visual Basic, on the Ribbon, click Developer and, in the Code section, click Visual Basic:
2 of 7
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson24.htm
Visual Basic:
8. Right-click the Time Left text box (the text box on the right side of Time Left) and click View Code 9. In the Objects combo box, make sure txtTimeLeft is selected. In the Procedure combo box, select Exit and implement the event as follows:
Private Sub txtTimeLeft_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim DateLeft As Date, TimeLeft As Date Dim DateExpected As Date, TimeExpected As Date If IsDate(txtTimeLeft) Then TimeLeft = CDate(txtTimeLeft) Else MsgBox "The value you entered is not a valid time" txtTimeLeft = Time End If End Sub
3 of 7
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson24.htm
Select Case Answer Case 1 MsgBox("Wrong: Function is a Visual Basic keyword." & vbCrLf & _ "It is used to create a procedure of a function type") Case 2 MsgBox("Correct: Except is not a keyword in " & vbCrLf & _ "Visual Basic but __except is a C++ " & vbCrLf & _ "keyword used in Exception Handling") Case 3 MsgBox("Wrong: ByRef is a Visual Basic keyword used " & vbCrLf & _ "to pass an argument by reference to a procedure") Case 4 MsgBox("Wrong: The ""Each"" keyword is used in " & vbCrLf & _ "Visual Basic in a type of looping " & vbCrLf & _ "used to ""scan"" a list of item.") Case Else MsgBox("Invalid Selection") End Select End Sub Here is an example of running the program:
Private Sub txtEmployeeNumber_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim EmployeeNumber As Long Dim EmployeeName As String EmployeeNumber = CLng(txtEmployeeNumber) Select Case EmployeeNumber Case 22804 EmployeeName = "Helene Mukoko" Case 92746 EmployeeName = "Raymond Kouma" Case 54080 EmployeeName = "Henry Larson" Case 86285 EmployeeName = "Gertrude Monay" Case 20860 EmployeeName = "Paul Bertrand Yamaguchi" Case Else EmployeeName = "Unidentified Employee" End Select txtEmployeeName = EmployeeName End Sub
4. On the Standard toolbar, click the Run Sub/UserForm button 5. In the Employee # of the form, enter one of the numbers such as 54080 and press Tab 6. Close the form and return to Microsoft Visual Basic
Combining Cases
As mentioned in our introduction, the Select Case can use a value other than an integer. For example you can use a character: Sub Exercise Dim Gender As String Gender = "M"
4 of 7
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson24.htm
Select Case Gender Case "F" MsgBox("Female") Case "M" MsgBox("Male") Case Else MsgBox("Unknown") End Select Return 0 End Function End Sub This would produce:
Notice that in this case we are using only upper case characters. If want to validate lower case characters also, we may have to create additional case sections for each. Here is an example: Sub Exercise Dim Gender As String Gender = "f" Select Case Gender Case "f" MsgBox("Female") Case "F" MsgBox("Female") Case "m" MsgBox("Male") Case "M" MsgBox("Male") Case Else MsgBox("Unknown") End Select End Sub This would produce:
Instead of using one value for a case, you can apply more than one. To do this, on the right side of the Case keyword, you can separate the expressions with commas. Here are examples: Sub Exercise Dim Gender As String Gender = "F" Select Case Gender Case "f", "F" MsgBox("Female") Case "m", "M" MsgBox("Male") Case Else MsgBox("Unknown") End Select End Sub
5 of 7
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson24.htm
6 of 7
9/20/2012 2:51 PM
http://www.functionx.com/vbaexcel/Lesson24.htm
We also saw that the Visual Basic language provides the Choose() function that can check a condition and take an action. The Choose() function is another alternative to a Select...Case statement. Once again, consider the syntax of the Choose function: Function Choose( _ ByVal Index As Double, _ ByVal ParamArray Choice() As Variant _ ) As Object This function takes two required arguments. The first argument is equivalent to the Expression of our Select Case formula. As mentioned already, the first argument must be a number. This is the central value against which the other values will be compared. Instead of using Case sections, provide the equivalent ExpressionX values as a list of values in place of the second argument. The values are separated by commas. Here is an example: Choose(Number, "Teen", "Adult", "Senior") As mentioned already, the values of the second argument are provided as a list. Each member of the list uses an index. The first member of the list, which is the second argument of this function, has an index of 1. The second value of the argument, which is the third argument of the function, has an index of 2. You can continue adding the values of the second argument as you see fit. When the Choose() function has been called, it returns a value of type Variant. You can retrieve that value, store it in a variable and use it as you see fit. Here is an example: Sub Exercise Dim Number As Integer, MembershipType As String Number = 1 MembershipType = Choose(Number, "Teen", "Adult", "Senior") MsgBox("Membership Type: " & MembershipType) End Sub This would produce:
7 of 7
9/20/2012 2:51 PM
VBA for Microsoft Excel - Lesson 25: Logical Conjunction and Disjunction
http://www.functionx.com/vbaexcel/Lesson25.htm
Sub Exercise Dim TypeOfHouse As String Dim Choice As Integer Dim Value As Double TypeOfHouse = "Unknown" Choice = CInt(InputBox("Enter the type of & vbCrLf & _ "1. Single Family" & vbCrLf "2. Townhouse" & vbCrLf & _ "3. Condominium" & vbCrLf & "You Choice? ")) Value = CDbl(InputBox("Up to how much can house you want to purchase" _ & _ vbCrLf & _ you afford?"))
TypeOfHouse = Choose(Choice, "Single Family", _ "Townhouse", _ "Condominium") End Sub If the user selects a single family, you can then write code inside the conditional statement of the single family. Here is an example: Sub Exercise Dim TypeOfHouse As String Dim Choice As Integer Dim Value As Double TypeOfHouse = "Unknown" Choice = CInt(InputBox("Enter the type of & vbCrLf & _ "1. Single Family" & vbCrLf "2. Townhouse" & vbCrLf & _ "3. Condominium" & vbCrLf & "You Choice? ")) Value = CDbl(InputBox("Up to how much can house you want to purchase" _ & _ vbCrLf & _ you afford?"))
TypeOfHouse = Choose(Choice, "Single Family", _ "Townhouse", _ "Condominium") If Choice = 1 Then MsgBox("Desired House Type: "Maximum value afforded: End If End Sub Here is an example of running the program:
" & vbTab & TypeOfHouse & vbCrLf & _ " & vbTab & FormatCurrency(Value))
1 of 6
9/20/2012 2:52 PM
VBA for Microsoft Excel - Lesson 25: Logical Conjunction and Disjunction
http://www.functionx.com/vbaexcel/Lesson25.htm
In that section, you can then write code that would request and check the value the user entered. If that value is valid, you can take necessary action. Here is an example: Sub Exercise Dim TypeOfHouse As String Dim Choice As Integer Dim Value As Double TypeOfHouse = "Unknown" Choice = CInt(InputBox("Enter the type of & vbCrLf & _ "1. Single Family" & vbCrLf "2. Townhouse" & vbCrLf & _ "3. Condominium" & vbCrLf & "You Choice? ")) Value = CDbl(InputBox("Up to how much can house you want to purchase" _ & _ vbCrLf & _ you afford?"))
TypeOfHouse = Choose(Choice, "Single Family", _ "Townhouse", _ "Condominium") If Choice = 1 Then MsgBox ("Desired House Type: "Maximum value afforded:
" & vbTab & TypeOfHouse & vbCrLf & _ " & vbTab & FormatCurrency(Value))
If Value <= 550000 Then MsgBox ("Desired House Matched") Else MsgBox ("The House Doesn't Match the Desired Criteria") End If End If End Sub
A Conditional Conjunction
Using conditional nesting, we have seen how you can write one conditional statement that depends on another. But you must write one first condition, check it, then nest the other condition. This works fine and there is nothing against it. To provide you with an alternative, you can use what is referred to as a logical conjunction. It consists of writing one If...Then expression that checks two conditions at the same time. To illustrate, once again consider a customer who wants to purchase a single family home that is less than $550,000. You can consider two statements as follows: a. The house is single family b. The house costs less than $550,000 To implement it, you would need to write an If...Then condition as: If The house is single family AND The house costs less than $550,000 Then Validate End If In the Visual Basic language, the operator used to perform a logical conjunction is And. Here is an example of using it: Sub Exercise Dim TypeOfHouse As String Dim Choice As Integer Dim Value As Double TypeOfHouse = "Unknown" Choice = _ CInt(InputBox("Enter the type of house you want to purchase" & vbCrLf & _ "1. Single Family" & vbCrLf & _ "2. Townhouse" & vbCrLf & _ "3. Condominium" & vbCrLf & vbCrLf & _ "You Choice? ")) Value = CDbl(InputBox("Up to how much can you afford?")) TypeOfHouse = Choose(Choice, "Single Family", _ "Townhouse", _ "Condominium") If TypeOfHouse = "Single Family" And Value <= 550000 Then
2 of 6
9/20/2012 2:52 PM
VBA for Microsoft Excel - Lesson 25: Logical Conjunction and Disjunction
If TypeOfHouse = "Single Family" And Value <= 550000 Then MsgBox("Desired House Type: " & vbTab & TypeOfHouse & vbCrLf & _ "Maximum value afforded: " & vbTab & FormatCurrency(Value)) MsgBox("Desired House Matched") Else MsgBox("The House Doesn't Match the Desired Criteria") End If End Sub Here is an example of running the program:
http://www.functionx.com/vbaexcel/Lesson25.htm
By definition, a logical conjunction combines two conditions. To make the program easier to read, each side of the conditions can be included in parentheses. Here is an example: Sub Exercise . . . No Change If (TypeOfHouse = "Single Family") And (Value <= 550000) Then MsgBox("Desired House Type: " & vbTab & TypeOfHouse & vbCrLf & _ "Maximum value afforded: " & vbTab & FormatCurrency(Value)) MsgBox("Desired House Matched") Else MsgBox("The House Doesn't Match the Desired Criteria") End If End Sub To understand how logical conjunction works, from a list of real estate properties, after selecting the house type, if you find a house that is a single family home, you put it in the list of considered properties: Type of House The house is single family House True
If you find a house that is less than or equal to $550,000, you retain it: Price Range $550,000 Value True
For the current customer, you want a house to meet BOTH criteria. If the house is a town house, based on the request of our customer, its conditional value is false. If the house is less than $550,000, such as $485,000, the value of the Boolean Value is true:
3 of 6
9/20/2012 2:52 PM
VBA for Microsoft Excel - Lesson 25: Logical Conjunction and Disjunction
http://www.functionx.com/vbaexcel/Lesson25.htm
If the house is a town house, based on the request of our customer, its conditional value is false. If the house is more than $550,000, the value of the Boolean Value is true. In logical conjunction, if one of the conditions is false, the result if false also. This can be illustrated as follows: Type of House Town House False House Value $625,000 False Result Town House AND $625,000 False
Suppose we find a single family home. The first condition is true for our customer. With the AND Boolean operator, if the first condition is true, then we consider the second criterion. Suppose that the house we are considering costs $750,500: the price is out of the customer's range. Therefore, the second condition is false. In the AND Boolean algebra, if the second condition is false, even if the first is true, the whole condition is false. This would produce the following table: Type of House Single Family True House Value $750,500 False Result Single Family AND $750,500 False
Suppose we find a townhouse that costs $420,000. Although the second condition is true, the first is false. In Boolean algebra, an AND operation is false if either condition is false: Type of House Town House False House Value $420,000 True Result Town House AND $420,000 False
If we find a single family home that costs $345,000, both conditions are true. In Boolean algebra, an AND operation is true if BOTH conditions are true. This can be illustrated as follows: Type of House Single Family True House Value $345,000 True Result Single Family AND $345,000 True
These four tables can be resumed as follows: Condition1 AND Condition2 False False False True
As you can see, a logical conjunction is true only of BOTH conditions are true.
Combining Conjunctions
As seen above, the logical conjunction operator is used to combine two conditions. In some cases, you will need to combine more than two conditions. Imagine a customer wants to purchase a single family house that costs up to $450,000 with an indoor garage. This means that the house must fulfill these three requirements: A. The house is a single family home B. The house costs less than $450,001 C. The house has an indoor garage Here is the program that could be used to check these conditions: Sub Exercise Dim TypeOfHouse As String Dim Choice As Integer
4 of 6
9/20/2012 2:52 PM
VBA for Microsoft Excel - Lesson 25: Logical Conjunction and Disjunction
http://www.functionx.com/vbaexcel/Lesson25.htm
Dim Value As Double Dim IndoorGarageAnswer As Integer Dim Answer As String TypeOfHouse = "Unknown" Choice = _ CInt(InputBox("Enter the type of house you want to purchase" _ & vbCrLf & _ "1. Single Family" & vbCrLf & _ "2. Townhouse" & vbCrLf & _ "3. Condominium" & vbCrLf & vbCrLf & _ "You Choice? ")) Value = CDbl(InputBox("Up to how much can you afford?")) TypeOfHouse = Choose(Choice, "Single Family", _ "Townhouse", _ "Condominium") IndoorGarageAnswer = _ MsgBox("Does the house have an indoor garage (1=Yes/0=No)?", _ vbQuestion Or vbYesNo, _ "Real Estate") Answer = IIf(IndoorGarageAnswer = vbYes, "Yes", "No") If (TypeOfHouse = "Single Family") And _ (Value <= 550000) And _ (IndoorGarageAnswer = vbYes) Then MsgBox "Desired House Type: " & vbTab & "Maximum value afforded: " & vbTab & FormatCurrency(Value) & vbCrLf & _ "House has indoor garage: " & vbTab & MsgBox "Desired House Matched" Else MsgBox ("The House Doesn't Match the Desired End If End Sub
Criteria")
We saw that when two conditions are combined, the interpreter first checks the first condition, followed by the second. In the same way, if three conditions need to be considered, the interpreter evaluates the truthfulness of the first condition: Type of House A Town House False If the first condition (or any condition) is false, the whole condition is false, regardless of the outcome of the other(s). If the first condition is true, then the second condition is evaluated for its truthfulness: Type of House A Single Family True Property Value B $655,000 False
If the second condition is false, the whole combination is considered false: A True B False A AND B False
When evaluating three conditions, if either the first or the second is false, since the whole condition would become false, there is no reason to evaluate the third. If both the first and the second conditions are false, there is also no reason to evaluate the third condition. Only if the first two conditions are true will the third condition be evaluated whether it is true: Property Value B $425,650 True Indoor Garage C None False
The combination of these conditions in a logical conjunction can be written as A AND B AND C. If the third condition is false, the whole combination is considered false: A AND B AND C False
A True
B True
A AND B True
C False
From our discussion so far, the truth table of the combinations can be illustrated as follows: A AND B
5 of 6
9/20/2012 2:52 PM
VBA for Microsoft Excel - Lesson 25: Logical Conjunction and Disjunction
http://www.functionx.com/vbaexcel/Lesson25.htm
The whole combination is true only if all three conditions are true. This can be illustrated as follows: A AND B AND C False False False False False False False True
6 of 6
9/20/2012 2:52 PM
http://www.functionx.com/vbaexcel/Lesson26.htm
Error Handling
Handling Errors
Introduction to Errors
A computer application is supposed to run as smooth as possible. Unfortunately, this is not always the case. A form may close unexpectedly. A control on a form may hide itself at the wrong time. The application may crash. A calculation may produce unexpected results, etc.
You can predict some of these effects and take appropriate actions. Some other problems are not under your control. Fortunately, both Microsoft Excel and the VBA language provide various tools or means of dealing with errors.
2. Click the Payroll tab 3. Click the TimeSheet tab 4. To save the workbook and prepare it for code, press F12 5. Specify the folder as (My) Documents 6. In the Save As Type combo box, select Excel Macro-Enabled Workbook 7. Click Save
1 of 6
9/20/2012 2:52 PM
http://www.functionx.com/vbaexcel/Lesson26.htm
Private Sub cmdCalculate_Click() Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double ' One of these two lines could produce an error, such as ' if the user types an invalid number HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) ' If there was an error, the flow would jump to the label WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary) ThereWasBadCalculation: MsgBox "There was a problem when performing the calculation" End Sub To avoid this, you should find a way to interrupt the flow of the program before the label section. One way you can do this is to add a line marked Exit Sub before the label. This would be done as follows: Private Sub cmdCalculate_Click() Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double ' One of these two lines could produce an error, such as ' if the user types an invalid number HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) ' If there was an error, the flow would jump to the label WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary) Exit Sub ThereWasBadCalculation: MsgBox "There was a problem when performing the calculation" End Sub
In Case of Error
Jump to a Label
We saw that you can create a label that would present a message to the user when an error occurs. Before an error occurs, you would indicate to the compiler where to go if an error occurs. To provide this information, under the line that starts the procedure, type an On Error GoTo expression followed by the name of the label where you created the message. Here is an example: Private Sub cmdCalculate_Click() On Error GoTo ThereWasBadCalculation Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double ' One of these two lines could produce an error, such as ' if the user types an invalid number HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) ' If there was an error, the flow would jump to the label WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary) Exit Sub ThereWasBadCalculation: MsgBox "There was a problem when performing the calculation" End Sub The On Error GoTo indicates to the compiler where to transfer code if an error occurs.
Go to a Numbered Label
Instead of defining a lettered label where to jump in case of error, you can create a numeric label: Private Sub cmdCalculate_Click() Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary)
2 of 6
9/20/2012 2:52 PM
http://www.functionx.com/vbaexcel/Lesson26.htm
Exit Sub 28: MsgBox "There was a problem when performing the calculation" End Sub After creating the numeric label, you can ask the compiler to jump to it if a problem occurs. To do this, type On Error GoTo followed by the numeric label. The compiler would still jump to it when appropriate. Here is an example: Private Sub cmdCalculate_Click() On Error GoTo 28 Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary) Exit Sub 28: MsgBox "There was a problem when performing the calculation" End Sub Notice that the numeric label works like the lettered label. In other words, before writing the On Error GoTo expression, you must have created the label. In reality, this is not a rule. You can ask the compiler to let you deal with the error one way or another. To do this, use the On Error GoTo 0 (or On Error GoTo -1) expression. Here is an example: Private Sub cmdCalculate_Click() On Error GoTo 0 Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary) End Sub In this case, if/when the error occurs, you must have a way to deal with it.
3 of 6
9/20/2012 2:52 PM
http://www.functionx.com/vbaexcel/Lesson26.htm
Private Sub cmdCalculate_Click() On Error GoTo ThereWasBadCalculation Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double ' One of these two lines could produce an error, such as ' if the user types an invalid number HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) ' If there was an error, the flow would jump to the label WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary) Exit Sub ThereWasBadCalculation: MsgBox "There was a problem when performing the calculation" Resume Next End Sub We know that in our code, there was probably a problem, which is the reason we presented a message to the user. Then, when code resumes, where should the compiler go? After all, the problem was not solved. One way you can deal with the problem is to provide an alternative to what caused the problem, since you are supposed to know what type of problem occurred (in the next sections, we will analyze the types of problems that can occur). In the case of an arithmetic calculation, imagine we know that the problem was caused by the user typing an invalid number (such as typing a name where a number was expected). Instead of letting the program crash, we can provide a number as an alternative. The easiest number is 0. Before asking the compiler to resume, to provide an alternative solution (a number in this case), you can re-initialize the variable that caused the error. Here is an example: Private Sub cmdCalculate_Click() On Error GoTo ThereWasBadCalculation Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double ' One of these two lines could produce an error, such as ' if the user types an invalid number HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) ' If there was an error, the flow would jump to the label WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary) Exit Sub ThereWasBadCalculation: MsgBox "There was a problem when performing the calculation" HourlySalary = 0 Resume Next End Sub If there are many variables involved, as is the case for us, you can initialize each. Here an example: Private Sub cmdCalculate_Click() On Error GoTo ThereWasBadCalculation Dim HourlySalary As Double, WeeklyTime As Double Dim WeeklySalary As Double ' One of these two lines could produce an error, such as ' if the user types an invalid number HourlySalary = CDbl(txtHourlySalary) WeeklyTime = CDbl(txtWeeklyTime) ' If there was an error, the flow would jump to the label WeeklySalary = HourlySalary * WeeklyTime txtWeeklySalary = FormatNumber(WeeklySalary) Exit Sub ThereWasBadCalculation: MsgBox "There was a problem when performing the calculation" HourlySalary = 0 WeeklyTime = 0 Resume Next End Sub
Types of Error
4 of 6
9/20/2012 2:52 PM
http://www.functionx.com/vbaexcel/Lesson26.htm
Introduction
In our introductions to errors, we mostly anticipated only problems related to arithmetic calculations. In reality, a program can face various categories of bad occurrences. The more problems you prepare for, the least phone calls and headaches you will have. Problems are divided in two broad categories.
Syntax Errors
A syntax error occurs if your code tries to perform an operation that the VBA language does not allow. These errors are probably the easiest to locate because the Code Editor is configured to point them out at the time you are writing your code. If you try typing or try inserting an operator or keyword in the wrong place on your code, the Code Editor would point it out. Here is an example:
In this case, if you were trying to use the Do keyword instead of a data type (probably Double in this case), the Code Editor would show it right away. This type of error is pointed out for every keyword and operator you try to use. Notice that, in the above example, we used a valid keyword but at the wrong time. If you mistype a keyword or an operator, you would receive an error. Fortunately, the Code Editor is equipped to know all keywords of the Visual Basic language. Consider the following example:
The programmer mistyped the Mod operator and wrote MAD instead. If you forget to include a necessary factor in your code, you would get a syntax error. For example, if you are creating a binary arithmetic expression that expects a second operand after the operator, you would receive an error. Here is an example:
5 of 6
9/20/2012 2:52 PM
http://www.functionx.com/vbaexcel/Lesson26.htm
In this case, the programmer pressed Enter after the Mod operator, as if the expression was complete. This resulted in an error. These are just a few types of syntax errors you may encounter. As mentioned already, if you work in Microsoft Visual Basic to write your code, most of these errors are easy to detect and fix.
Run-Time Errors
A run-time error occurs when your application tries to do something that the operating system does not allow. In some cases, only your application would crash (Microsoft Excel may stop working). In some other cases, the user may receive a more serious error. As its name indicates, a run-time error occurs when the program runs; that is, after you have created your application. Fortunately, during the testing phase, you may encounter some of the errors so you can fix them before distributing your application. Some other errors may not occur even if you test your application. They may occur to the users after you have distributed your application. For example, you can create a car rental application that is able to display pictures 100% of the time on your computer while locating them from the E: drive. Without paying attention, after distributing your application, the user's computer may not have an E: drive and, when trying to display the pictures, the application may crash. Examples of run-time errors are: a. Trying to use computer memory that is not available b. Performing a calculation that the computer hardware (for example the processor) does not allow. An example is division by 0 c. Trying to use or load a library that is not available or is not accessible, for any reason d. Performing an arithmetic operation on two incompatible types (such as trying to assign to an Integer variable the result of adding a string to a Double value) e. Using a loop that was not properly initialized f. Trying to access a picture not accessible. Maybe the path specified for the picture is wrong. Maybe your code gives the wrong extension to the file, even though the file exists g. Accessing a value beyond the allowable range. For example, using a Byte variable to assign a performed operation that produces a value the variable cannot hold As you may imagine, because run-time errors occur after the application has been described as ready, some of these errors can be difficult to identify. Some other errors depend on the platform that is running the application (the operating system, the processor, the version of the application, the (available) memory, etc).
6 of 6
9/20/2012 2:52 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
File Processing
Creating a File
Introduction
In Microsoft Excel, instead of a worksheet, you could create a form-based application that your users would use. If (since) you have already used Windows-based applications, you are surely familiar with data entry on a form, in which case you use Windows controls. File processing is the ability to store the values of a document in the computer so you can retrieve such values another time.
File processing is the ability to save values from an application and be able to get those values back when needed. The VBA language supports file processing.
13. Click Cell B2 and type Bethesda Car Rental 14. Click the Enter button 15. Format it as you see fit:
16. Click the Employees sheet tab 17. To save the workbook, press Ctrl + S 18. In the top combo box, select the C drive (or any drive you want)
1 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
18. In the top combo box, select the C drive (or any drive you want) 19. Click the Create New Folder (Windows XP) or New Folder (Windows Vista) button 20. Type Bethesda Car Rental as the name of the new folder and press Enter 21. Make sure the new folder is selected. Change the file name to Business Records 22. In the Save As Type combo box, select Excel Macro-Enabled Workbook
23. Click Save 24. In the Employees sheet tab, click Cell B6 and type Employee # 25. Create a list of employees 26. Click Cell E7, type =D7 & ", " & C7 and click the Enter button 27. Drag its AutoFill down to Cell E13
28. Click the Customers sheet tab 29. Click Cell B6 and type Driver's Lic. # 30. Create a list of customers
2 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
31. Click the Cars sheet tab 32. Click Cell B6 and type Tag Number 33. Create a list of cars 34. Click the Rental Rates sheet tab 35. Click Cell B6 and type Category 36. Complete the table with the following values: Category Economy Compact Standard Full Size Mini Van SUV Truck Van Daily 35.95 39.95 45.95 49.95 55.95 55.95 42.75 69.95 Weekly 32.75 35.75 39.75 42.75 50.75 50.75 38.75 62.75 Monthly 28.95 32.95 35.95 38.95 45.95 45.95 35.95 55.95 Weekend 24.95 28.95 32.95 35.95 42.95 42.95 32.95 52.95
37. To save the workbook, press Ctrl + S 38. On the Ribbon, click Developer
39. In the Code section of the Ribbon, click Visual Basic 40. On the main menu of Microsoft Visual Basic, click Insert -> UserForm 41. If the Properties window is not available, right-click the form and click Properties. In the Properties window, click (Name) and type frmNewRentalOrder 42. Click Caption and type Bethesda Car Rental - Order Processing - New Rental Order 43. Design the form as follows:
3 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
Control
(Name)
Caption/Text
Other Properties BackColor: &H00808080& BorderColor: &H00000000& ForeColor: &H00FFFFFF& BackColor: &H00808080& BorderColor: &H00000000& ForeColor: &H00FFFFFF&
Label
Processed By
Label
Car Selected
Label Text Box Text Box Label Text Box Label Combo Box cbxCarConditions txtTagNumber txtEmployeeNumber txtEmployeeName
Employee #:
Tag Number:
Condition:
Label
Processed For
Label Text Box Label Text Box Label Text Box Label Text Box Label Text Box Label Combo Box Label Text Box Label Text Box Label Text Box Label Text Box txtCity txtMileageEnd txtMileageStart txtAddress cbxTankLevels txtCarYear txtCustomerName txtModel txtDrvLicenseNbr txtMake
Make:
Driver's Lic. #:
Model:
Name:
Address:
Label
Order Evaluation
Label Text Box Label Text Box Label Text Box Label Text Box txtTaxRate txtRateApplied txtZIPCode txtState
State:
ZIP Code:
Rate Applied: 24.95 Tax Rate: 5.75 TextAlign: 3 fmTextAlignRight TextAlign: 3 fmTextAlignRight
4 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
Label
BackColor: &H00808080& BorderColor: &H00000000& ForeColor: &H00FFFFFF& Days: txtDays 0 Tax Amount: txtTaxAmount 0.00 Start Date: txtStartDate End Date: txtEndDate Sub-Total: txtSubTotal 0.00 Order Total: txtOrderTotal 0.00 Receipt #: txtReceiptNumber cmdSave cmdReset Save Reset / New Rental Order TextAlign: 3 fmTextAlignRight TextAlign: 3 fmTextAlignRight TextAlign: 3 fmTextAlignRight TextAlign: 3 fmTextAlignRight
Label Text Box Label Text Box Label Text Box Label Text Box Label Text Box Label Text Box Label Text Box Command Button Command Button
44. Right-click the Employee Number text box and click View Code 45. In the Procedure combo box, select Enter 46. Implement the event as follows: Private Sub txtEmployeeNumber_Enter() REM When the Employee # has focus, activate the Employees worksheet Worksheets(2).Activate End Sub 47. In the Procedure combo box, select Exit 48. Implement the event as follows: Private Sub txtEmployeeNumber_Exit(ByVal Cancel As MSForms.ReturnBoolean) On Error GoTo txtEmployeeNumber_Error ' Check if the user left the Employee Number empty If txtEmployeeNumber.Text = "" Then ' If so, put leave the Employee Name empty txtEmployeeName.Text = "" Else ' If the user entered a valid employee #, use the Microsoft Excel's ' VLOOKUP() function to get the corresponding employee name ' We are using the range of cells from B7 to E13 but you can use a ' range of your choice as long as it contains the employees records txtEmployeeName.Text = _ Application.WorksheetFunction.VLookup(txtEmployeeNumber.Text, _ Worksheets(2).Range("B7:E13"), 4, False) End If Exit Sub txtEmployeeNumber_Error: ' If the user entered an invalid employee #, put Unknown in the name If Err.Number = 1004 Then txtEmployeeNumber.Text = "" txtEmployeeName.Text = "Unknown clerk" End If End Sub 49. In the Object combo box, select txtTagNumber 50. In the Procedure combo box, select Enter 51. Implement the event as follows: Private Sub txtTagNumber_Enter() Worksheets(4).Activate End Sub 52. In the Procedure combo box, select Exit
5 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
52. In the Procedure combo box, select Exit 53. Implement the event as follows: Private Sub txtTagNumber_Exit(ByVal Cancel As MSForms.ReturnBoolean) On Error GoTo txtTagNumber_Error ' Check if the user left the Tag Number text box empty If txtTagNumber.Text = "" Then ' If so, leave the car information empty txtTagNumber.Text = "" txtMake.Text = "" txtModel.Text = "" txtCarYear.Text = "" Else ' If the user entered a valid Tag Number, use the Microsoft Excel's ' VLOOKUP() function to get the corresponding car information txtMake.Text = _ Application.WorksheetFunction.VLookup(txtTagNumber.Text, _ Worksheets(4).Range("B6:I26"), 2, False) txtModel.Text = _ Application.WorksheetFunction.VLookup(txtTagNumber.Text, _ Worksheets(4).Range("B6:I26"), 3, False) txtCarYear.Text = _ Application.WorksheetFunction.VLookup(txtTagNumber.Text, _ Worksheets(4).Range("B6:I26"), 4, False) End If Exit Sub txtTagNumber_Error: ' If the user entered an invalid tag #, leave the Tag Number empty If Err.Number = 1004 Then txtTagNumber.Text = "" txtMake.Text = "" txtModel.Text = "" txtCarYear.Text = "" End If End Sub 54. In the Object combo box, select txtDrvLicenseNbr 55. In the Procedure combo box, select Enter 56. Implement the event as follows: Private Sub txtDrvLicenseNbr_Enter() Worksheets(3).Activate End Sub 57. In the Procedure combo box, select Exit 58. Implement the event as follows: Private Sub txtDrvLicenseNbr_Exit(ByVal Cancel As MSForms.ReturnBoolean) On Error GoTo txtDrvLicenseNbr_Error If txtDrvLicenseNbr.Text = "" Then txtCustomerName.Text = "" txtAddress.Text = "" txtCity.Text = "" txtState.Text = "" txtZIPCode.Text = "" Else txtCustomerName.Text = _ Application.WorksheetFunction.VLookup(txtDrvLicenseNbr.Text, Worksheets(3).Range("B6:I26"), 2, False) txtAddress.Text = _ Application.WorksheetFunction.VLookup(txtDrvLicenseNbr.Text, Worksheets(3).Range("B6:I26"), 3, False) txtCity.Text = _ Application.WorksheetFunction.VLookup(txtDrvLicenseNbr.Text, Worksheets(3).Range("B6:I26"), 4, False) txtState.Text = _ Application.WorksheetFunction.VLookup(txtDrvLicenseNbr.Text, Worksheets(3).Range("B6:I26"), 5, False) txtZIPCode.Text = _ Application.WorksheetFunction.VLookup(txtDrvLicenseNbr.Text, Worksheets(3).Range("B6:I26"), 6, False) End If Exit Sub txtDrvLicenseNbr_Error: If Err.Number = 1004 Then txtDrvLicenseNbr.Text = "" txtCustomerName.Text = "" txtAddress.Text = "" txtCity.Text = "" txtState.Text = ""
6 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
' For a receipt number, we will create a random number strRandomNumber = CStr(CInt(Rnd * 9)) strRandomNumber = strRandomNumber & CStr(CInt(Rnd * 9)) strRandomNumber = strRandomNumber & CStr(CInt(Rnd * 9)) strRandomNumber = strRandomNumber & CStr(CInt(Rnd * 9)) strRandomNumber = strRandomNumber & CStr(CInt(Rnd * 9)) strRandomNumber = strRandomNumber & CStr(CInt(Rnd * 9)) txtReceiptNumber = strRandomNumber ' In the real world, you would check the list of files ' in the Bethesda Car Rental folder. You would then get the ' name of the last file, or the highest receipt number. You ' would then increase this number by 1, and use that as the ' new receipt number txtEmployeeNumber.Text = "" txtEmployeeName.Text = "" txtDrvLicenseNbr.Text = "" txtCustomerName.Text = "" txtAddress.Text = "" txtCity.Text = "" txtState.Text = "" txtZIPCode.Text = "" txtStartDate.Text = "" txtEndDate.Text = "" txtTagNumber.Text = "" cbxCarConditions.Text = "Excellent" txtMake.Text = "" txtModel.Text = "" txtCarYear.Text = "" cbxTankLevels.Text = "" txtMileageStart.Text = "0" txtMileageEnd.Text = "0" txtRateApplied.Text = "24.95" txtTaxRate.Text = "5.75" txtDays.Text = "0" txtTaxAmount.Text = "0.00" txtSubTotal.Text = "0.00" txtOrderTotal.Text = "0.00" txtNotes.Text = "" ' Display today's date in the date text boxes txtStartDate = Date txtEndDate = Date End Sub Private Sub UserForm_Activate() Call ResetRentalOrder End Sub 65. In the Object combo box, select cmdReset 66. Implement the Click event as follows: Private Sub cmdReset_Click()
7 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
File Creation
Before performing file processing, the first action you must perform consists of creating a file. To support file creation, the VBA provides a procedure named Open. Its syntax is: Open pathname For Output [Access access] [lock] As [#]filenumber [Len=reclength] The Open statement takes many factors, some are required and others are not. The Open (the name of the procedure) word, the For Output expression, and the As # expression are required. The first argument, pathname, is required. This is a string that can be the name of the file. The file can have an extension or not. Here is an example: Open "example.dat" If you specify only the name of the file, it would be considered in the same folder where the current workbook is (the workbook that was opened when you called this statement). If you want, you can provide a complete path for the file. This would include the drive, the (optional) folder(s), up to the name of the file, with or without extension. Besides the name of the file or its path, the mode factor is required. This factor specifies the actual action you want to perform, such as creating a new file or only opening an existing one. This factor can be one of the following keywords: Output: The file will be created and ready to receive (normal) values Binary: The file will be created and ready to receive values in binary format (as combinations of 1s and 0s) Append: If the file exists already, it will be opened and new values can be added to the end Here is an example of creating a file: Private Sub cmdSave_Click() Open "example.dat" For Output As #1 End Sub The access factor is optional. It specifies what types of actions will be performed in the file, such as writing values to it or only reading existing values. This factor can have one of the following values: Write: After a new file has been created, new values will be written to it Read Write: When a new file has been created or an existing file has been opened, values can be read from it or written to it If you decide to specify the access factor, precede its value with the Access keyword. The lock factor is optional. It indicates how the processor should behave while the file is being used. Its possible values are: Shared: Other applications (actually called processes) can access this file while the current application is accessing it Lock Write: Do not allow other applications (processes) to access this file while the current application (process) is writing to it Lock Read Write: Do not allow other applications (processes) to access this file while the current application (process) is using it
8 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
On the right side of #, type a number, for the filenumber factor, between 1 and 511. If you are working on one file, use the number 1. If you are working on many files, you should use an incremental number. If you have not been keeping track of the number or you get confused at one time, to know the next number you can use, call the FreeFile() function, which returns the next available number in the sequence. The reclength factor is optional. If the file was opened, this factor specifies the length of the record that was read.
Closing a File
When you create a file and start using it, or after opening a file and while you are using it, it uses memory and consumes (or can be consuming) memory (which could be significant). When you have finished using the file, you should free the memory it was using and release the resources it was consuming. To assist you with this, the VBA provides a procedure named Close. Its syntax is: Close [filenumberlist] The filenumberlist factor is the filenumber you would have previously used to create or open the file. Here is an example of closing a file: Private Sub cmdSave_Click() Open "example.dat" For Output As #1 Close #1 End Sub
Printing to a File
After creating a file, you may want to write values to it. To support this, the VBA provides two procedures. One of them is called Print and its syntax is: Print #filenumber, [outputlist] The Print statement takes two factors but only the first is required. The filenumber factor is the filenumber you would have used to create the file. The filenumber is followed by a comma. The outputlist factor can be made of 0, 1 or more parts. Because it is optional, if you do not want to write a value to the file, leave this part empty. If you want to write a value, type a comma after the filenumber factor and follow these rules: If you want to start the value with empty spaces, use the Spc() function and pass an integer (in the parentheses) that represents the number of empty spaces. For example Spc(4) would include 4 empty spaces. This factor is optional, which means you can omit it Instead of a specific number of empty spaces, you can let the operating system specify a built-in number of empty spaces. To do this, call the Tab() function as part of your outputlist factor. The Tab() function specifies the number of columns to include before the value. The Tab() function can be more useful if you are concerned with the alignment of the value(s) you will write in the file. This factor is optional, which means you can omit it To write a string, include it in double-quotes To write a number, whether an integer, a float, or a double, simply include the number normally To write a Boolean value, type it as True or False To write a date or time value, type it between # and # and follow the rules of dates or times of your language such as US English To write a null value, type Null Here is an example of writing some values: Private Sub cmdSave_Click() Open "Employee.txt" For Output As #1 Print Print Print Print #1, #1, #1, #1, "James" "Larenz" True #12/08/2008#
Close #1 End Sub Instead of writing one value per line, you can write more than one value with one statement. To do this, separate them with either a semi-colon or an empty space. Here is an example: Private Sub cmdSave_Click() Open "Employee.txt" For Output As #1
9 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
REM The values are separated by a semi-colon Print #1, "James"; "Larenz" REM The values are separated by an empty space Print #1, True #12/08/2008# Close #1 End Sub
Writing to a File
Besides the Print procedure, the VBA also provides a procedure named Write that can be used to write one or more values to a file. The syntax of the Write statement is the same as that of Print: Write #filenumber, [outputlist] The filenumber factor is required. It must be the filenumber specified when creating the file. The outputlist factor is optional. If you want to skip it, type a comma after the filenumber and end the Write statement. In this case, an empty line would be written to the file. To write the values to the file, follow these rules: To start the value with empty spaces, call the Spc() function and pass a number that represents the number of empty spaces. This factor is optional, which means you can omit it To start the value with a specific number of columns, call the Tab() function and pass the number of columns as argument. This factor is optional, which means you can omit it To write a string, include it in double-quotes To write a number, include it normally To write a Boolean value, type it as #TRUE# or #FALSE# To write a null value, type #NULL# To write a date or time value, type it between # and # Here is an example of writing some values: Private Sub cmdSave_Click() Open "Employee.txt" For Output As #1 Write Write Write Write Write Write #1, #1, #1, #1, #1, #1, "James" "M" "Larenz" #12/08/2008# 24.50 True
Close #1 End Sub You can also write values on the same line. To do this, separate them with an empty space, a comma, or a semi-colon. Here is an example: Private Sub cmdSave_Click() Open "Employee.txt" For Output As #1 REM The values are separated by a semi-colon Write #1, "James"; "M"; "Larenz" REM The values are separated by a comma Write #1, #12/08/2008#, 24.50 Write #1, True Close #1 End Sub
10 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
Exit Sub End If Rem Make sure the user enters a valid customer If txtDrvLicenseNbr.Text = "" Then MsgBox "You must specify a valid car." Exit Sub End If Open "C:\Bethesda Car Rental\" & txtReceiptNumber.Text & _ ".bcr" For Output As #1 Write #1, txtEmployeeNumber.Text Rem Some people would not include the Employee Name in Rem the file because it is already stored in the workbook. Rem But we will include it in our file Write #1, txtEmployeeName.Text Write #1, txtDrvLicenseNbr.Text Rem Some people would not include the customer name, address, Rem city, state, and ZIP code in the file because they are Rem already part of a workbook. Rem But we will include them in our file Write #1, txtCustomerName.Text Write #1, txtAddress.Text Write #1, txtCity.Text Write #1, txtState.Text Write #1, txtZIPCode.Text Write #1, txtStartDate.Text Write #1, txtEndDate.Text Write #1, txtTagNumber.Text Write #1, cbxCarConditions.Text Rem Some people would not include the car make, model, Rem and year in the file because they are Rem already stored in a workbook. Rem But we will include them here Write #1, txtMake.Text Write #1, txtModel.Text Write #1, txtCarYear.Text Write #1, cbxTankLevels.Text Write #1, txtMileageStart.Text Write #1, txtMileageEnd.Text Write #1, txtRateApplied.Text Write #1, txtTaxRate.Text Write #1, txtDays.Text Write #1, txtTaxAmount.Text Write #1, txtSubTotal.Text Write #1, txtOrderTotal.Text Write #1, "Car Rented" Write #1, txtNotes.Text Close #1 Exit Sub cmdSave_Error: MsgBox "There is a problem with the form. It cannot be saved." Resume Next End Sub 4. On the Standard toolbar, click the Save button 5. Return to Microsoft Excel and click the Switchboard tab sheet if necessary 6. In the Developer tab of the Ribbon, in the Controls section, click Insert 7. In the ActiveX Controls section, click Command Button 8. Click the worksheet 9. Right-click the new button and click Properties 10. In the properties window, change the following characteristics (Name): cmdCreateRentalOrder Caption: Create New Rental Order 11. Right-click the button and click View Code 12. Implement the event as follows: Private Sub cmdCreateRentalOrder_Click() frmNewRentalOder.Show End Sub 13. Press Ctrl + S to save 14. Return to Microsoft Excel 15. In the Controls section of the Ribbon, click the Design Mode button to uncheck it 16. Click the button to display the form 17. Enter some values for a rental order
11 of 12
9/20/2012 2:53 PM
http://www.functionx.com/vbaexcel/Lesson27.htm
18. Write down the receipt number on a piece of paper 19. Click the Save button 20. Click the Reset button 21. Enter some values for another rental order
22. Click the Save button 23. Close the form and return to Microsoft Visual Basic
12 of 12
9/20/2012 2:53 PM