home *** CD-ROM | disk | FTP | other *** search
-
-
-
- 1-2-3 Macro Tips
- A Collection of Illustrative Macros
-
- The Macro facility (The Typing Alternative) is a powerful tool;
- it can allow you to get the most out of 1-2-3. However, it can be
- a little intimidating.
-
- The basic concepts are simple. When you use 1-2-3 without Macros,
- you press keys to enter numbers and labels, to move the cell
- pointer, and to issue commands. Macros are labels containing just
- those keystrokes you would normally type into 1-2-3. There are
- some keys that you can't type directly into a label, like the
- pointer movement keys and the function keys. In Macros, these are
- represented by words in braces, like {left} or {graph}.
-
- Of course, it can get more complicated. There are special 1-2-3
- commands, the /X commands, that can only be used in Macros. These
- determine which Macro instructions are actually executed; they
- allow you to write Macros that are computer programs.
-
- (If you haven't yet done so, read the 1-2-3 manual section on
- Macros before going on.)
-
- A good time to use a Macro is when you find yourself typing the
- same keystrokes again and again. Just remember what keys you are
- striking, and type the same strokes into a label, using the
- bracketed instructions when necessary.
-
- Macros are also problem-solvers. One of the best times to write a
- Macro is when you are trying to perform some task, and none of
- the 1-2-3 commands seems to do exactly what you want. Using a
- Macro, you can create your own commands!
-
- To help you get started, we've assembled some examples of Macros
- that we have found useful. These examples are presented in terms
- of problems and solutions, because that's the way Macros tend to
- get developed. However, even if you don't think you will ever
- face such a problem, it's probably worth reading the example
- anyway; they can teach you some useful general techniques.
-
- We've adopted a Macro-writing style that might be helpful. The
- Macro name, and other cells with range names in the Macro, are
- labeled in the column to the left of the Macro. This way, you can
- assign all the range names at one time, using /Range Name Label
- Right. Also, we capitalize range names within Macros, and use
- lower case for the commands. This makes the Macros easier to
- read.
-
- Here are some problems, and their Macro solutions.
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
- Editing Labels
-
- Problem: To indent some labels.
-
- There are times when you've typed a column full of labels, and
- you want to indent some of them. You could insert a column, and
- move over the labels to be indented, but this might be easier.
-
- Solution: The indent (\I) Macro.
-
- Place the cell pointer on the label cell you want indented. press
- ALT-I.
-
- Version 1:
-
- \I {edit} Go into Edit Mode.
- {home} Put cursor at the beginning of Edit line.
- {right} Move past the Label-Prefix.
- ~ Type two spaces and [Return] to leave Edit
- Mode.
-
- This demonstrates the utility of using Macros to edit labels.
- With the {home}, {end}, {right} and {left} notations in your
- Macro, you can move around on the edit line. {del} and {bs}
- remove characters. To insert characters, simply type them into
- the Macro string. If you want to leave Edit Mode include a tilde
- (~) to represent an [Return].
-
- To use this Macro to indent a series of labels in a column, you
- must position the cell pointer, press ALT-I, move the cell
- pointer down, press Alt-I, and so on. We can make the Macro more
- useful by adding the {down} key.
-
- \I {edit}{home} | This is Version 1.
- {right} ~ |
- {down} Move the cell pointer to the
- next label.
-
- To use it, simply press ALT-I repeatedly. You can manually skip
- over labels you don't want to indent.
-
- Adding the {down} keystroke to the Macro makes it a lot easier to
- use. Whenever a Macro will be used repeatedly, on different
- cells in a particular order, it's a good idea to include arrow
- keys at the end of the Macro, to move the cell pointer to what
- will probably be the next cell.
-
- In fact, some useful Macros consist of just arrow keys.
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
-
- Movement Macros
-
- Problem: To move the cell pointer more than one cell at a time.
-
- You can create Macros that move the cell pointer in big jumps.
- These can be for special purposes, as when working on data where
- corresponding numbers are six columns apart.
-
- Or you can create a set of general purpose big step Macros.
-
- Solution: Big step Macros, Left (\L), Right (\R), Up (\U), Down
- (\D)
-
- You could also choose to give these Macros names of keys that
- form a diamond pattern: Up (\I), Left (\J), Right (\K), and Down
- (\M).
-
- \L {left}{left}{left}{left}
-
- \R {right}{right}{right}{right}
-
- \U {up}{up}{up}{up}
-
- \D {down}{down}{down}{down}
-
- Now, to move in bigger steps, just press ALT-L, R, U or D.
-
- Here's one last motion-key Macro that lets you use the numeric
- keypad.
-
- Using the Keypad
-
- Problem: To use the numeric keypad without having to switch off
- the Num-Lock to move the cell pointer.
-
- The problem with the numeric keypad is that serves two purposes:
- movement keys and numbers. If you want to use the keypad as
- numbers, you can use the [Shift] key to temporarily turn them
- back into arrows.
-
- This Macro, however, moves the cell pointer each time you enter a
- number, so you don't have to use any keys except the number and
- [Return] keys.
-
- Solution: The move Macro (\M).
-
- Use this when you want to enter a column or row of numbers using
- the keypad. This example moves the cell pointer down after you
- press [Return].
-
- Use the {?} to make the Macro stop to get input before moving
- down.
-
-
-
-
-
- 3
-
-
-
-
-
-
-
-
- \M {?} Wait for input; resume when [Return] is pressed.
- {down} Move down.
-
- After you press ALT-M, 1-2-3 will wait until you press [Return]
- before continuing with the execution of the Macro. You can tell
- that you are in a Macro by the little CMD indicator next to the
- Mode Indicator (upper right corner of the screen). And you can
- tell that it's waiting for input because the Mode is READY.
-
- So far, this isn't very useful. It will move the cell pointer
- down, but to use it again, you must press ALT-M, which is about
- as much trouble as Shift-[Down arrow].
-
- What we can do is make the Macro "loop," repeat itself. To do
- this, use the /XG command, which tells the Macro where to go to
- get its next instruction. Note that this is different from the
- {goto} function keystroke, which moves the cell pointer, but does
- not affect the steps in the execution of the Macro.
-
- Place the cell pointer at the top of the column in which you want
- to type numbers. Press Alt-M and press the Num Lock key (or vice
- versa). Type the numbers you want to input, and press [Return]
- after each entry; the cell pointer will move down automatically.
- When you are finished, press Ctrl-Break to stop the Macro (and
- turn off the [Num Lock] so you can use the arrow keys).
-
- This Macro was discovered by Rich Landsman at Lotus.
-
- \M {?} | This is version 1.
- {down} |
- /xg\M~ Go back to the beginning of the Macro.
-
- This is an "infinite" loop; it keeps going around in circles
- until you stop it. After you have finished putting your numbers
- in the column, press Ctrl-Break to stop the Macro.
-
- Later we will see how to get a Macro loop to stop itself, but for
- now, let's look at a different type of problem.
-
- Putting a Value in a Cell
-
- Problem: To record the date of the last update.
-
- Many people have found the @today function and the related Date
- formats to be a useful way of dating printed material. However,
- when you use @today to put the date on a worksheet, and save it,
- the date will change when you read in the worksheet and
- recalculate it. This is fine for some purposes, but doesn't give
- you a secure record of the last day a worksheet was revised.
-
- Solution: The Update (\U) Macro.
-
-
-
-
-
-
- 4
-
-
-
-
-
-
-
-
- Name the cell in which you want the date "DATE," and give it a
- date format. After you have made your revisions, press ALT-U, and
- then save the file.
-
- Version 1:
-
- \U {goto}DATE~ Go to the date cell.
- @today Type in the function.
- {calc}~ Replace the function with its present
- value.
-
- This works, but it has one problem. It takes you from wherever
- you are on the worksheet, and leaves you at "DATE."
-
- Version 2:
-
- \U /rncHERE~ Give the name "HERE"
- ~ to the current cell pointer cell.
- {goto}DATE~ |
- @today | This is Version 1.
- {calc}~ |
- {goto}HERE~ Return to your original position.
- /rndHERE~ Delete the name.
-
- Delete the name at the end of the Macro so that when you use it
- again, you don't end up the last place it was created. Remember:
- when you try to create a named range for a name that already
- exists, the cell pointer goes back to the named range's last
- position.
-
- You could insert a {bs} to bring it back to the position when the
- Macro was invoked: /rncHERE~{bs}~, but DON'T. If HERE's old
- position was referred to in a formula (e.g. +C5+HERE+E5), then
- after you moved it, the formula would include HERE, meaning its
- new position.
-
- D5 the name HERE, the formula automatically became +C5+HERE+E5.
- And it would stay that way, wherever you put HERE, until you
- /Range Name Delete HERE.
-
- Later on, we'll demonstrate Macros that depend heavily on range
- names, names that are applied to first one cell, then another. If
- you don't delete the range name before applying the old range
- name to a new range, you can end up with all your formulas and
- range names referring to the same cell.
-
- A good general rule is: whenever you create a range name within a
- Macro, delete it before you exit, or before you change the
- location(s) to be referred to by the name.
-
- Okay, one more version. We don't really need it, but Version 2
- does fail if you've created another range named HERE. Anyway,
- this is a chance to introduce a nice technique (spelled "trick")
- that one of the Lotus staff discovered.
-
-
-
- 5
-
-
-
-
-
-
-
-
- \U /dfDATE~@today~~~ Put the value of today's date in
- the cell named "DATE."
-
- That's it! For this gem, we can all thank Bill Liles, of Product
- Development (this isn't the kind of development we expected, but
- don't get in the way of the freight train of creativity).
-
- Bill found that you could use the /Data Fill command to plug
- values into cells. In fact, in the next example, we'll see how it
- can be used to increment, decrement or otherwise operate on the
- value currently in a cell.
-
- Let's string that same Macro (Version 3) down a column so we can
- more easily explain what is happening.
-
- \U /df Execute the /Data Fill command.
- DATE~ on the range (one cell) named DATE.
- @today~ Make the Start value @today.
- ~~ Accept the defaults for Step and Stop
- (they won't be used in a one-cell range).
-
- What is now in DATE is the VALUE of @today, not the function.
-
- The next example will show how to use this technique to count how
- many times you loop, and stop you when you're done. It also
- demonstrates how to use range names to find out something about
- the current cell.
-
- Stopping a Loop
-
- Problem: To make some cells blank.
-
- When 1-2-3 evaluates a formula it treats empty cells as having a
- value a value of zero. This can create confusion when you have
- missing data. You can substitute @NA for missing cells, but it
- doesn't look very neat.
-
- Here is a listing of salaries for two years. The user wanted to
- create a column with the percent change in salary, but some
- people weren't employed at this company for both years. For them,
- he wanted just blank cells.
-
- Salary 81 Salary 82
- $15,000 $16,500
- $36,000
- $13,000 $14,500
- $35,000
- $19,500 $21,000
-
- Solution: A Macro and a formula.
-
-
-
-
-
-
-
- 6
-
-
-
-
-
-
-
-
- A standard formula for percent change in salary would be:
-
- (Sal82-Sal81)/Sal81
-
- But this gives a value of @ERR when Salary 81 is missing, and a
- value of -1 when Salary 82 is missing. Let's embed our standard
- formula in an @if function formula.
-
- @IF((Sal81=0)#OR#(Sal82=0),999,(Sal82-Sal81)/Sal81)
-
- This takes on a value of 999 when either figure is missing;
- otherwise it gives the correct value. Here is how the figures
- look now.
-
- Salary 81 Salary 82 Percent change
- $15,000 $16,500 10.00%
- $36,000 99900.00%
- $13,000 $14,500 11.54%
- $35,000 99900.00%
- $19,500 $21,000 7.69%
-
- Version 1:
-
- Next, place the cell pointer at the top of the "Percent Change"
- column and press ALT-B. Repeat this until the entire column is
- cleaned up.
-
- \B /rncHERE~ Create the one-cell range, HERE.
- ~ at the present position.
- /xi(HERE=999)~/re~ If HERE equals 999, erase the cell.
- /rndHERE~ Delete the cell name (!)
- {down} And move down.
-
- And this is the result:
-
- Salary 81 Salary 82 Percent change
- $15,000 $16,500 10.00%
- $36,000
- $13,000 $14,500 11.54%
- $35,000
- $19,500 $21,000 7.69%
-
- Finally, we can put the above Macro in a loop that stops itself.
- To do this, we will create ahead of time two one- cell named
- ranges, NCELLS and CNUMBER. First, we'll count the number of
- cells in the column, and put the number in NCELLS. Then, each
- time we check (and perhaps erase) a cell, we'll add one to
- CNUMBER. When CNUMBER is greater than NCELLS, we're finished.
-
-
-
-
-
-
-
-
-
- 7
-
-
-
-
-
-
-
-
- Version 2:
-
- \B /rncHERE~ Create a range named HERE.
- {end}{down}~ Make it the whole column.
- /dfNCELLS~ Put in NCELLS the
- @count(HERE)~~~ number of cells in the column.
- /rndHERE~ Delete HERE.
- /dfCNUMBER~0~~~ Start counting cells with 0.
- LOOP /rncHERE~ | ]<-- This cell is named "LOOP."
- ~ |
- /xi(HERE=999)~/re~ | This is Version 1.
- /rndHERE~ |
- {down} |
- /dfCNUMBER~ Increase the number in CNUMBER
- CNUMBER+1~~~ by one (increment).
- /xi(CNUMBER<=NCELLS)~/xgLOOP~
- This last line has the Macro resume execution at
- the cell named LOOP, until the number in CNUMBER
- is equal to the number in NCELLS.
-
- One last example. This one demonstrates how you can turn a number
- into a formula, and back to a number, using {Edit}.
-
- Accumulating Numbers
-
- Problem: To Update a value.
-
- The user was maintaining a database of sales people and their
- current monthly sales and sales year-to-date. He wanted to be
- able to enter the monthly figures and update the year-to- date.
-
- Salesperson Year-to-date Current
- DiAngelo $83,000 $6,000
- Gottfried $56,000 $8,000
- Jones $48,000 $5,000
- Washington $77,000 $9,000
-
- These were the figures after the previous month's entries. They
- are numbers, not formulas.
-
- Solution: The accumulate Macro (\A).
-
- This Macro takes advantage of the fact that while editing a
- formula, you can point to cells, just as when you are first
- entering formulas. You must be at the end of the edit line and
- the last character must be one that could be followed by a cell
- or range such as an operator (e.g. +, -, #AND#) or an open
- parenthesis. To start pointing to cells, rather than move along
- the edit line, press the {edit} key again to put you in VALUE
- mode. When you then press the pointer-movement key you will be in
- POINT mode, as when entering a formula.
-
- Place the cell pointer on the first "current" cell. Press ALT-A.
- Type the new current value and press [Return]. Press ALT-A again
- to enter the value for the next salesperson.
-
-
- 8
-
-
-
-
-
-
-
-
- Version 1:
-
- \A /re~ Erase the old current value.
- {?}~ Wait for user to put in new value.
- {left} Go to the year-to-date cell.
- {edit} Edit it.
- + Adding the plus turns it into a formula.
- {edit} The {edit} key puts you in VALUE Mode.
- {right}~ Add the value in the "Current" cell.
- {edit}{calc}~ Turn the formula back into a number.
- {right}{down} Move to next current cell.
-
- Remember that when the Macro is waiting for input ({?}) the CMD
- indicator is next to the READY Mode indicator.
-
- Next, let's put the Macro in a loop, so that it will keep asking
- for this month's figures, and stop when it reaches the end of the
- column. The only requirement is that there be no empty cells in
- the year-to-date column (except at the end), so put zeros in any
- empty cells.
-
- This version uses a different technique to stop at the end of the
- column; it checks to see if the next cell is blank, and if it is,
- it stops.
-
- Actually, there is a problem finding out if a single cell is
- blank. Labels, blank cells and zeros all have the value of zero,
- so you can't use that. And @count always has a value of one if
- its' argument is a one-cell range.
-
- This Macro uses @count and a two-cell range, named TEST. The
- range consists of the potential next "Current" cell and the one
- cell above it. The value of @count(TEST) will be 2, until it hits
- the end of the column, when it will be 1.
-
- Version 2:
-
- \A /re~ |
- {?}~ |
- {left} |
- {edit} |
- + | This is Version 1.
- {edit} |
- {right}~ |
- {edit}{calc}~ |
- {right}{down} |
- /rncTEST~{up}~
- /xi(@count(TEST)=2)~/rndTEST~/xg\A~
- /rndTEST~
-
- It's hard to put comments next to those long Macro lines, so
- let's take the last three lines one at a time:
-
- /rncTEST~{up}~
-
-
-
- 9
-
-
-
-
-
-
-
-
- Creates a two-cell range consisting of the potential next
- "Current" cell and the one above it.
-
- /xi(@count(TEST)=2)~/rndTEST~/xg\A~
-
- This checks to see if the value of @count(TEST) is still 2. If it
- is, it deletes TEST (important!) and tells the Macro to start
- again from the beginning.
-
- This Macro label had to be long, because the /xi command tells
- the Macro to do the rest of the Macro label, if the condition is
- true.
-
- /rndTEST~
-
- And finally, to clean things up, we delete TEST at the end of the
- whole Macro. We had to do this because when @count(TEST) is NOT
- 2, the rest of that line doesn't get executed, and TEST still
- exists.
-
- Well, that should be enough to help you get started with Macros.
- Give them a try, and write some of your own.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 10
-
-
-
-
-