Getting to grips with VBA basics in 15 minutes
Article contributed by Bill Coan
I can't turn you into a VBA expert but I can suggest a way to explore VBA that you may find helpful. Below, I've listed 22 steps that can be completed in approximately 15 minutes, assuming someone is kind enough to read them to you as you sit at your keyboard. If you have to read them by yourself and turn your attention alternately to the keyboard and back to the steps, then you may need a half hour or longer to complete the steps. Either way, the steps should give you a feel for what it's like to program in Word.
Before starting, launch Word, then press Alt+F11 to launch the VBA editor, and then maximize the VBA editor window.
Ready? Let's start:
1. |
In the VBA editor, choose Options on the Tools menu and make sure the
following checkboxes are checked:
|
2. |
Press F7 to view a code window, if not already displayed. Then type “Sub Test” and hit the enter key. The VBA editor will create a subroutine for you that looks as follows: Notice that the cursor is already flashing inside the subroutine, ready for
you to type a command
|
3. |
Click in the code window and type the following, making special note of the dot at the end of the expression: ActiveDocument. |
4. |
If you want to work on the active document (and who doesn't) then you have to start this way. (Think Jesus: No one gets to the father except through me!) When you type the "." at the end of the expression a list will pop up. This list is the most amazing guide you can imagine. Each item on the list is either a method or a property of the ActiveDocument or else it's an object unto itself that belongs to the ActiveDocument. For now let's deal with methods. Toward the end of this message we'll deal with properties. At the very end of the message, we'll deal with other objects besides the currently active document. A method is something you can DO to the ActiveDocument, like print it out. The way to think is this: “I'm trying to do something to the active document as a whole, namely, print it. If I'm patient and scroll through this list, I'll almost certainly find a method that will do this for me.” When you first think this way, the word “method” will stick in your throat like a fishbone. Later it will feel more like burnt toast and later still it will feel like candy when you were young. Indeed, in this case, if you're patient, you will scroll far enough to encounter a method called PrintOut. Eureka! You know it's a method (as opposed to a property) because it has an icon next to it that looks like a green brick flying through the air and at this stage the whole concept of method makes you feel like throwing a brick. Nice mnemonic, eh? Let's give it a try. Since you've scrolled down and selected PrintOut, you can press Tab to accept it or you can double-click it right there in the list. Either way, your statement now looks as follows
|
5. |
So far so good. Most people easily get this far. But now what? |
6. |
One possibility is that you're done. After all, you've specified an object (the active document) and you've selected something that you want to do to it (print it out). Indeed, if you're willing to let Word print out the document in whatever way it chooses, then you are done. |
7. |
Another possibility is that you want to control how the print job will be carried out. In this case, you must provide some “arguments” (another fishbone, at first). Not to worry. To enter one or more arguments, all you do is type a space after the method and let the editor help you enter them. Arguments are equivalent to the choices you make in the Print dialog box. So go ahead, type a space after PrintOut, so your screen looks like this (the pipe character “|” represents your flashing insertion point after you've typed a space):
|
8. |
But wait! When you type the space, the VBA editor suddenly gets very helpful again, showing you something like the following:
|
9. |
Aha! Aha! These are the arguments for the PrintOut method. Most of them are immediately recognizable if you've ever paid attention to the Print dialog box. If you're wondering about one or more of them, simply press F1 and you'll call up a help topic that tells you all about each one of them. |
10. |
Now that you can see all the arguments, you can enter values for as many
One way to do this is to type the name of the argument and then a value,
ActiveDocument.PrintOut Background:=False, Copies:= 2 Another, boneheaded (in my opinion) way to do this is to enter values for ALL of the arguments, in which case you don't have to type the names of the arguments but you do have to account for ALL of them, as follows: ActiveDocument.PrintOut False, , , , , , 2, , , , , , , |
11. |
Let's go with the named-argument approach:
|
12. |
That wasn't so painful, was it? Now press F5 to run the subroutine. Or return to Word and choose Tools|Macro|Macros...|Test|Run. (Pressing F5 is easier!) A quick review before we plunge on to properties. You think: “I'm trying to do something to the active document as a whole, namely, print it. So I start by typing “ActiveDocument.” and a list pops up. I scroll through the list and select the PrintOut method. Then I type a space and enter some arguments. In this case, I want background printing off and I want two copies, so I type the names of those arguments and values for each of them. I connect each argument name to its value by using “:=” because I'm part of the cognoscenti.” Take a big breather here because now it's time to explore properties instead of methods . . . |
13. |
Let's go back to our original assumption, namely, that you want to work on the active document as a whole. In this case, though, let's assume you want to change one of the properties of the document, rather than hit it with a brick. |
14. |
Once again, click in a code window and type the following, making special
note of the dot at the end of the expression:
|
15. |
Remember, if you want to work on the active document (and who doesn't) then you have to start this way. (No one gets to the father except through me!) When you type the “.” at the end of the expression a list will pop up. This list is the most amazing guide you can imagine. Each item on the list is either a method or a property of the ActiveDocument or else it's an object unto itself that belongs to the ActiveDocument. For now let's deal with properties. A property is a single characteristic. One of the properties of a document is its password. The way to think is this: “I'm trying to change a property of the active document as a whole, namely, its password. If I'm patient and scroll through this list, I'll almost certainly find a password property.” Indeed, in this case, if you're patient, you will scroll far enough to encounter a property called Password. Eureka! You know it's a property (as opposed to a method) because it has an icon next to it that looks like a finger pointing at a piece of information. Pretty useless mnemonic, eh? Let's give it a try. Since you've scrolled down and selected Password, you
ActiveDocument.Password |
16. |
So far so good. Many people easily get this far. But now what? |
17. |
In this case, the next step is to specify a value for the property. To do this, all you do is type a space and an equals sign after the name of the property, so your screen looks like this (the pipe character “|” represents your flashing insertion point after you've typed a space): ActiveDocument.Password = | |
18. |
Since the VBA editor has no idea what value you want to use for a password, it can't offer any suggestions. Instead, you simply have to come up with an idea on your own and type it in, perhaps as follows: ActiveDocument.Password = "billcoan" That's it! That's it! Now press F5 to run the subroutine. Or return to Word and choose Tools|Macro|Macros...|Test|Run. (Pressing F5 is easier!) When this statement runs, it will assign “billcoan” to be the password for the currently active document. You might wonder how you were supposed to know that the password had to be enclosed in quotation marks. Well, experience ought to be worth something, oughtn't it? In any case, if you had any question, all you would have had to do is position the cursor anywhere in the name of the property (“Password”) and press F1. This would display a help topic that tells you that a password requires a string, which is to say, a bunch of characters inside some quotation marks. Take a big breather here because now it's time to explore objects other than the currently active document . . . Let's face it, the currently active document, as a whole, can hold our attention for only so long. After all, you can carry out only so many methods on it (printout, save, saveas, etc., etc.) and you can change only so many of its properties (password, grammar checked, spelling checked, etc., etc.). But what about working on a particular part of a document, such as the first paragraph all by itself, or on a collection of parts, such as all the paragraphs? Here lies opportunity! After all, documents aren't just objects unto themselves; they're composed of hundreds of other, smaller objects. And you can work on each of those objects individually or as parts of collections. Let's dig deeper and find out how. |
19. |
The good news is that you can “reach” any part of a document that you want to work on by starting out as though you were going to work on the document itself. In other words, you can start as you almost always start. That is, once again click in a code window and type the following, making special note of the dot at the end of the expression: ActiveDocument. |
20. |
If you want to work on a part of the active document then you have to start this way. (Remember: No one gets to the father except through me!) When you type the “.” at the end of the expression a list will pop up. This list is the most amazing guide you can imagine. Each item on the list is either a method or a property of the ActiveDocument or else it's an object unto itself that belongs to the ActiveDocument. For now let's deal with objects that belong to the ActiveDocument. An object is something that you can “work on” by applying methods to it or by changing its properties. Word documents contain lots of different types of objects. When multiple objects of the same type exist (or can exist) in the same document, they are treated as “collections.” For example, a word document has, or can have, multiple paragraphs. Each paragraph is an object. All of the paragraph objects, together, form the “paragraphs collection.” The easiest document objects (and collections) to think about are paragraphs, words, and characters. The way to think is this: “I'm trying to work on an object that belongs to the active document, namely a paragraph. Since a document can contain more than one paragraph, I'll have to locate the collection of paragraphs and then specify the specific paragraph that I want to work on. If I'm patient and scroll through this list, I'll almost certainly find the collection.” When you first think this way, the words “object” and “collection” will stick in your throat like a fishbone. Later it will feel more like burnt toast and later still it will feel like love when you hit puberty. Indeed, in this case, if you're patient, you will scroll far enough to encounter a collection called Paragraphs. Eureka! You know it's not a method because it doesn't have an icon next to it that looks like a green brick flying through the air. You don't think of it as a property, either, but you quickly find out that the VBA editor *does* think of it as a property. OK, OK. So one of the “properties” of a Word document is that it contains a collection of paragraphs. Great. So “Paragraphs” is a collection of paragraph objects and “Paragraphs” is a property of a Word document. This is confusing, so quit worrying about it. Focus on the list! Find the item you want to work on! Let's give it a try. Since you've scrolled down and selected Paragraphs, you can press Tab to accept it or you can double-click it right there in the list. Either way, your statement now looks as follows: ActiveDocument.Paragraphs |
21. |
So far so good. Most people easily get this far. But now what? A major wrinkle, that's what! But hold on, it's easy to deal with. Since “Paragraphs” is a collection, you have to tell the VBA editor which paragraph you're interested in. You do this with a number in parentheses. For example, (1) refers to the first paragraph. Let's assume you want to work on the first paragraph in the collection. Type until your statement looks like this: ActiveDocument.Paragraphs(1). |
22. |
Guess what? You've just “drilled down” from the ActiveDocument object to the Paragraphs collection to the first Paragraph. That is, you've ““reached” or “specified” an object that you want to work on. From here on out, life is easy. Why? Because working on a paragraph object is just like working on a document object. As soon as you type the dot after the object, the VBA editor shows you a list of all the methods, properties, and objects (or collections of objects) that belong to *your* object. Simply select the method that you want to carry out on your object, or select the property that you want to change, or keep drilling down by selecting an object or collection that belongs to your object. That's all there is to it. A possible 23rd step would be to repeat Steps 1 -22 but replace all occurrences of “ActiveDocument.” with “Selection.” This allows you to drill down from the Selection object and discover the various methods, properties, and collections associated with the Selection object. A possible 24th step would be to repeat Steps 1 -22 but replace all occurrences of “ActiveDocument.”” with “Application.” This allows you to drill down from the Word application object and discover the various methods, properties, and collections associated with that object. |