home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / lotus123 / lotushlp.arc / LOTUS1.DOC < prev    next >
Text File  |  1985-05-31  |  24KB  |  661 lines

  1.  
  2.  
  3.  
  4.                                 1-2-3 Macro Tips
  5.                        A Collection of Illustrative Macros
  6.  
  7.         The  Macro facility (The Typing Alternative) is a powerful  tool; 
  8.         it can allow you to get the most out of 1-2-3. However, it can be 
  9.         a little intimidating.
  10.  
  11.         The basic concepts are simple. When you use 1-2-3 without Macros, 
  12.         you  press  keys to enter numbers and labels,  to move  the  cell 
  13.         pointer, and to issue commands. Macros are labels containing just 
  14.         those  keystrokes you would normally type into 1-2-3.  There  are 
  15.         some  keys that you can't type directly into a  label,  like  the 
  16.         pointer movement keys and the function keys. In Macros, these are 
  17.         represented by words in braces, like {left} or {graph}.
  18.  
  19.         Of course,  it can get more complicated.  There are special 1-2-3 
  20.         commands, the /X commands, that can only be used in Macros. These 
  21.         determine  which Macro instructions are actually  executed;  they 
  22.         allow you to write Macros that are computer programs.
  23.  
  24.         (If  you  haven't yet done so,  read the 1-2-3 manual section  on 
  25.         Macros before going on.)
  26.  
  27.         A  good time to use a Macro is when you find yourself typing  the 
  28.         same keystrokes again and again.  Just remember what keys you are 
  29.         striking,  and  type  the same strokes into a  label,  using  the 
  30.         bracketed instructions when necessary.
  31.  
  32.         Macros are also problem-solvers. One of the best times to write a 
  33.         Macro  is when you are trying to perform some task,  and none  of 
  34.         the  1-2-3  commands seems to do exactly what you want.  Using  a 
  35.         Macro, you can create your own commands!
  36.  
  37.         To help you get started,  we've assembled some examples of Macros 
  38.         that we have found useful.  These examples are presented in terms 
  39.         of problems and solutions,  because that's the way Macros tend to 
  40.         get  developed.  However,  even if you don't think you will  ever 
  41.         face  such  a problem,  it's probably worth reading  the  example 
  42.         anyway; they can teach you some useful general techniques.
  43.  
  44.         We've  adopted a Macro-writing style that might be  helpful.  The 
  45.         Macro name,  and other cells with range names in the  Macro,  are 
  46.         labeled in the column to the left of the Macro. This way, you can 
  47.         assign  all the range names at one time,  using /Range Name Label 
  48.         Right.  Also,  we capitalize range names within Macros,  and  use 
  49.         lower  case  for the commands.  This makes the Macros  easier  to 
  50.         read.
  51.  
  52.         Here are some problems, and their Macro solutions.
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.                                         1
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.                                  Editing Labels
  71.  
  72.         Problem:    To indent some labels.
  73.  
  74.         There  are times when you've typed a column full of  labels,  and 
  75.         you want to indent some of them.  You could insert a column,  and 
  76.         move over the labels to be indented, but this might be easier.
  77.  
  78.         Solution:   The indent (\I) Macro.
  79.  
  80.         Place the cell pointer on the label cell you want indented. press 
  81.         ALT-I.
  82.  
  83.         Version 1:
  84.  
  85.                \I    {edit}   Go into Edit Mode.
  86.                      {home}   Put cursor at the beginning of Edit line.
  87.                      {right}  Move past the Label-Prefix.
  88.                        ~      Type two spaces and [Return] to leave Edit
  89.                               Mode.
  90.  
  91.         This  demonstrates  the utility of using Macros to  edit  labels. 
  92.         With  the  {home},  {end},  {right} and {left} notations in  your 
  93.         Macro,  you  can move around on the edit line.   {del}  and  {bs} 
  94.         remove characters.   To insert characters,  simply type them into 
  95.         the Macro string.  If you want to leave Edit Mode include a tilde 
  96.         (~) to represent an [Return].
  97.  
  98.         To  use this Macro to indent a series of labels in a column,  you 
  99.         must  position  the cell pointer,  press  ALT-I,  move  the  cell 
  100.         pointer down, press Alt-I, and so on.  We can make the Macro more 
  101.         useful by adding the {down} key.
  102.  
  103.                \I    {edit}{home}    | This is Version 1.
  104.                      {right}  ~      |
  105.                      {down}            Move the cell pointer to the
  106.                                        next label.
  107.  
  108.         To use it,  simply press ALT-I repeatedly.  You can manually skip 
  109.         over labels you don't want to indent.
  110.  
  111.         Adding the {down} keystroke to the Macro makes it a lot easier to 
  112.         use.   Whenever  a  Macro will be used repeatedly,  on  different 
  113.         cells  in a particular order,  it's a good idea to include  arrow 
  114.         keys  at the end of the Macro,  to move the cell pointer to  what 
  115.         will probably be the next cell.
  116.  
  117.         In fact, some useful Macros consist of just arrow keys.
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.                                         2
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.                                   Movement Macros
  137.  
  138.         Problem: To move the cell pointer more than one cell at a time.
  139.  
  140.         You  can create Macros that move the cell pointer in  big  jumps.  
  141.         These can be for special purposes,  as when working on data where 
  142.         corresponding numbers are six columns apart.
  143.  
  144.         Or you can create a set of general purpose big step Macros.
  145.  
  146.         Solution: Big step Macros, Left (\L), Right (\R), Up (\U), Down
  147.                   (\D)
  148.  
  149.         You  could  also choose to give these Macros names of  keys  that 
  150.         form a diamond pattern:  Up (\I), Left (\J), Right (\K), and Down 
  151.         (\M).
  152.  
  153.                \L {left}{left}{left}{left}
  154.  
  155.                \R {right}{right}{right}{right}
  156.  
  157.                \U {up}{up}{up}{up}
  158.  
  159.                \D {down}{down}{down}{down}
  160.  
  161.         Now, to move in bigger steps, just press ALT-L, R, U or D.
  162.  
  163.         Here's  one  last motion-key Macro that lets you use the  numeric 
  164.         keypad.
  165.  
  166.                                 Using the Keypad
  167.  
  168.         Problem: To  use the numeric keypad without having to switch  off 
  169.                  the Num-Lock to move the cell pointer.
  170.  
  171.         The problem with the numeric keypad is that serves two  purposes: 
  172.         movement  keys  and numbers.   If you want to use the  keypad  as 
  173.         numbers,  you  can  use the [Shift] key to temporarily turn  them 
  174.         back into arrows.
  175.  
  176.         This Macro, however, moves the cell pointer each time you enter a 
  177.         number,  so you don't have to use any keys except the number  and 
  178.         [Return] keys.
  179.  
  180.         Solution: The move Macro (\M).
  181.  
  182.         Use  this when you want to enter a column or row of numbers using 
  183.         the  keypad.  This example moves the cell pointer down after  you 
  184.         press [Return].
  185.  
  186.         Use  the  {?} to make the Macro stop to get input  before  moving 
  187.         down.
  188.  
  189.  
  190.  
  191.  
  192.  
  193.                                         3
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.              \M {?}     Wait for input; resume when [Return] is pressed.
  203.                 {down}  Move down.
  204.  
  205.         After you press ALT-M,  1-2-3 will wait until you press  [Return] 
  206.         before continuing with the execution of the Macro.   You can tell 
  207.         that  you are in a Macro by the little CMD indicator next to  the 
  208.         Mode  Indicator (upper right corner of the screen).   And you can 
  209.         tell that it's waiting for input because the Mode is READY.
  210.  
  211.         So  far,  this isn't very useful.  It will move the cell  pointer 
  212.         down,  but to use it again,  you must press ALT-M, which is about 
  213.         as much trouble as Shift-[Down arrow].
  214.  
  215.         What  we can do is make the Macro "loop," repeat itself.   To  do 
  216.         this,  use the /XG command,  which tells the Macro where to go to 
  217.         get  its next instruction.   Note that this is different from the 
  218.         {goto} function keystroke, which moves the cell pointer, but does 
  219.         not affect the steps in the execution of the Macro.
  220.  
  221.         Place the cell pointer at the top of the column in which you want 
  222.         to type numbers.  Press Alt-M and press the Num Lock key (or vice 
  223.         versa).  Type  the numbers you want to input,  and press [Return] 
  224.         after each entry;  the cell pointer will move down automatically. 
  225.         When  you are finished,  press Ctrl-Break to stop the Macro  (and 
  226.         turn off the [Num Lock] so you can use the arrow keys).
  227.  
  228.         This Macro was discovered by Rich Landsman at Lotus.
  229.  
  230.                \M    {?}       | This is version 1.
  231.                      {down}    |
  232.                      /xg\M~      Go back to the beginning of the Macro.
  233.  
  234.         This  is  an "infinite" loop;  it keeps going around  in  circles 
  235.         until you stop it.  After you have finished putting your  numbers 
  236.         in the column, press Ctrl-Break to stop the Macro.
  237.  
  238.         Later we will see how to get a Macro loop to stop itself, but for 
  239.         now, let's look at a different type of problem.
  240.  
  241.                             Putting a Value in a Cell
  242.  
  243.         Problem: To record the date of the last update.
  244.  
  245.         Many  people have found the @today function and the related  Date 
  246.         formats  to be a useful way of dating printed material.  However, 
  247.         when you use @today to put the date on a worksheet,  and save it, 
  248.         the  date  will  change  when  you  read  in  the  worksheet  and 
  249.         recalculate it.  This is fine for some purposes, but doesn't give 
  250.         you a secure record of the last day a worksheet was revised.
  251.  
  252.         Solution: The Update (\U) Macro.
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.                                         4
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.         Name  the cell in which you want the date "DATE," and give  it  a 
  269.         date format. After you have made your revisions, press ALT-U, and 
  270.         then save the file.
  271.  
  272.           Version 1:
  273.  
  274.                \U    {goto}DATE~  Go to the date cell.
  275.                      @today       Type in the function.
  276.                      {calc}~      Replace  the function with its  present 
  277.                                   value.
  278.  
  279.         This  works,  but it has one problem.  It takes you from wherever 
  280.         you are on the worksheet, and leaves you at "DATE."
  281.  
  282.           Version 2:
  283.  
  284.                \U    /rncHERE~        Give the name "HERE"
  285.                      ~                 to the current cell pointer cell.
  286.                      {goto}DATE~    |
  287.                      @today         | This is Version 1.
  288.                      {calc}~        |
  289.                      {goto}HERE~      Return to your original position.
  290.                      /rndHERE~        Delete the name.
  291.  
  292.         Delete  the name at the end of the Macro so that when you use  it 
  293.         again,  you don't end up the last place it was created. Remember: 
  294.         when  you  try  to create a named range for a name  that  already 
  295.         exists,  the  cell  pointer goes back to the named  range's  last 
  296.         position.
  297.  
  298.         You could insert a {bs} to bring it back to the position when the 
  299.         Macro  was invoked:  /rncHERE~{bs}~,  but DON'T.  If  HERE's  old 
  300.         position  was referred to in a formula (e.g.  +C5+HERE+E5),  then 
  301.         after you moved it,  the formula would include HERE,  meaning its 
  302.         new position.
  303.  
  304.         D5 the name HERE,  the formula automatically became  +C5+HERE+E5. 
  305.         And  it  would stay that way,  wherever you put HERE,  until  you 
  306.         /Range Name Delete HERE.
  307.  
  308.         Later on,  we'll demonstrate Macros that depend heavily on  range 
  309.         names, names that are applied to first one cell, then another. If 
  310.         you  don't  delete the range name before applying the  old  range 
  311.         name  to a new range,  you can end up with all your formulas  and 
  312.         range names referring to the same cell.
  313.  
  314.         A good general rule is: whenever you create a range name within a 
  315.         Macro,  delete  it  before  you exit,  or before you  change  the 
  316.         location(s) to be referred to by the name.
  317.  
  318.         Okay,  one more version.  We don't really need it,  but Version 2 
  319.         does  fail if you've created another range  named  HERE.  Anyway, 
  320.         this  is a chance to introduce a nice technique (spelled "trick") 
  321.         that one of the Lotus staff discovered.
  322.  
  323.  
  324.  
  325.                                         5
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.                \U    /dfDATE~@today~~~  Put the value of today's date in
  335.                                         the cell named "DATE."
  336.  
  337.         That's it!  For this gem, we can all thank Bill Liles, of Product 
  338.         Development (this isn't the kind of development we expected,  but 
  339.         don't get in the way of the freight train of creativity).
  340.  
  341.         Bill  found  that you could use the /Data Fill  command  to  plug 
  342.         values into cells. In fact, in the next example, we'll see how it 
  343.         can  be used to increment,  decrement or otherwise operate on the 
  344.         value currently in a cell.
  345.  
  346.         Let's string that same Macro (Version 3) down a column so we  can 
  347.         more easily explain what is happening.
  348.  
  349.                \U    /df       Execute the /Data Fill command.
  350.                      DATE~      on the range (one cell) named DATE.
  351.                      @today~   Make the Start value @today.
  352.                      ~~        Accept the defaults for Step and Stop
  353.                                 (they won't be used in a one-cell range).
  354.  
  355.         What is now in DATE is the VALUE of @today, not the function.
  356.  
  357.         The next example will show how to use this technique to count how 
  358.         many  times  you loop,  and stop you when you're  done.  It  also 
  359.         demonstrates  how to use range names to find out something  about 
  360.         the current cell.
  361.  
  362.                                  Stopping a Loop
  363.  
  364.         Problem: To make some cells blank.
  365.  
  366.         When  1-2-3 evaluates a formula it treats empty cells as having a 
  367.         value  a value of zero.  This can create confusion when you  have 
  368.         missing data.  You can substitute @NA for missing cells,  but  it 
  369.         doesn't look very neat.
  370.  
  371.         Here  is a listing of salaries for two years.  The user wanted to 
  372.         create  a  column with the percent change  in  salary,  but  some 
  373.         people weren't employed at this company for both years. For them, 
  374.         he wanted just blank cells.
  375.  
  376.                           Salary 81   Salary 82
  377.                           $15,000     $16,500
  378.                                       $36,000
  379.                           $13,000     $14,500
  380.                           $35,000
  381.                           $19,500     $21,000
  382.  
  383.         Solution: A Macro and a formula.
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.                                         6
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.         A standard formula for percent change in salary would be:
  401.  
  402.                  (Sal82-Sal81)/Sal81
  403.  
  404.         But  this gives a value of @ERR when Salary 81 is missing,  and a 
  405.         value of -1 when Salary 82 is missing.  Let's embed our  standard 
  406.         formula in an @if function formula.
  407.  
  408.                 @IF((Sal81=0)#OR#(Sal82=0),999,(Sal82-Sal81)/Sal81)
  409.  
  410.         This  takes  on  a value of 999 when either  figure  is  missing; 
  411.         otherwise  it  gives the correct value.  Here is how the  figures 
  412.         look now.
  413.  
  414.                           Salary 81   Salary 82  Percent change
  415.                           $15,000     $16,500         10.00%
  416.                                       $36,000      99900.00%
  417.                           $13,000     $14,500         11.54%
  418.                           $35,000                  99900.00%
  419.                           $19,500     $21,000          7.69%
  420.  
  421.         Version 1:
  422.  
  423.         Next,  place the cell pointer at the top of the "Percent  Change" 
  424.         column  and press ALT-B.  Repeat this until the entire column  is 
  425.         cleaned up.
  426.  
  427.            \B    /rncHERE~            Create the one-cell range, HERE.
  428.                  ~                     at the present position.
  429.                  /xi(HERE=999)~/re~   If HERE equals 999, erase the cell.
  430.                  /rndHERE~            Delete the cell name (!)
  431.                  {down}               And move down.
  432.  
  433.         And this is the result:
  434.  
  435.                           Salary 81   Salary 82  Percent change
  436.                           $15,000     $16,500         10.00%
  437.                                       $36,000
  438.                           $13,000     $14,500         11.54%
  439.                           $35,000
  440.                           $19,500     $21,000          7.69%
  441.  
  442.         Finally,  we can put the above Macro in a loop that stops itself. 
  443.         To  do  this,  we will create ahead of time two  one- cell  named 
  444.         ranges,  NCELLS  and CNUMBER.  First,  we'll count the number  of 
  445.         cells  in the column,  and put the number in NCELLS.  Then,  each 
  446.         time  we  check  (and perhaps erase) a cell,  we'll  add  one  to 
  447.         CNUMBER. When CNUMBER is greater than NCELLS, we're finished.
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.                                         7
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.         Version 2:
  467.  
  468.               \B    /rncHERE~             Create a range named HERE.
  469.                     {end}{down}~          Make it the whole column.
  470.                     /dfNCELLS~            Put in NCELLS the
  471.                     @count(HERE)~~~       number of cells in the column.
  472.                     /rndHERE~             Delete HERE.
  473.                     /dfCNUMBER~0~~~       Start counting cells with 0.
  474.               LOOP  /rncHERE~           | ]<-- This cell is named "LOOP."
  475.                     ~                   |
  476.                     /xi(HERE=999)~/re~  | This is Version 1.
  477.                     /rndHERE~           |
  478.                     {down}              |
  479.                     /dfCNUMBER~           Increase the number in CNUMBER
  480.                     CNUMBER+1~~~           by one (increment).
  481.                     /xi(CNUMBER<=NCELLS)~/xgLOOP~
  482.                        This  last line has the Macro resume execution  at 
  483.                        the cell named LOOP,  until the number in  CNUMBER 
  484.                        is equal to the number in NCELLS.
  485.  
  486.         One last example. This one demonstrates how you can turn a number 
  487.         into a formula, and back to a number, using {Edit}.
  488.  
  489.                               Accumulating Numbers
  490.  
  491.         Problem: To Update a value.
  492.  
  493.         The  user  was maintaining a database of sales people  and  their 
  494.         current  monthly  sales and sales year-to-date.  He wanted to  be 
  495.         able to enter the monthly figures and update the year-to- date.
  496.  
  497.                        Salesperson       Year-to-date       Current
  498.                        DiAngelo               $83,000        $6,000
  499.                        Gottfried              $56,000        $8,000
  500.                        Jones                  $48,000        $5,000
  501.                        Washington             $77,000        $9,000
  502.  
  503.         These were the figures after the previous month's  entries.  They 
  504.         are numbers, not formulas.
  505.  
  506.         Solution: The accumulate Macro (\A).
  507.  
  508.         This  Macro  takes  advantage of the fact that  while  editing  a 
  509.         formula,  you  can  point to cells,  just as when you  are  first 
  510.         entering  formulas.  You must be at the end of the edit line  and 
  511.         the  last character must be one that could be followed by a  cell 
  512.         or  range  such as an operator (e.g.  +,  -,  #AND#) or  an  open 
  513.         parenthesis.  To start pointing to cells,  rather than move along 
  514.         the  edit  line,  press the {edit} key again to put you in  VALUE 
  515.         mode. When you then press the pointer-movement key you will be in 
  516.         POINT mode, as when entering a formula.
  517.  
  518.         Place the cell pointer on the first "current" cell.  Press ALT-A. 
  519.         Type the new current value and press [Return].  Press ALT-A again 
  520.         to enter the value for the next salesperson.
  521.  
  522.  
  523.                                         8
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.         Version 1:
  533.  
  534.             \A   /re~            Erase the old current value.
  535.                  {?}~            Wait for user to put in new value.
  536.                  {left}          Go to the year-to-date cell.
  537.                  {edit}          Edit it.
  538.                  +               Adding the plus turns it into a formula.
  539.                  {edit}          The {edit} key puts you in VALUE Mode.
  540.                  {right}~        Add the value in the "Current" cell.
  541.                  {edit}{calc}~   Turn the formula back into a number.
  542.                  {right}{down}   Move to next current cell.
  543.  
  544.         Remember  that when the Macro is waiting for input ({?}) the  CMD 
  545.         indicator is next to the READY Mode indicator.
  546.  
  547.         Next,  let's put the Macro in a loop, so that it will keep asking 
  548.         for this month's figures, and stop when it reaches the end of the 
  549.         column.  The  only requirement is that there be no empty cells in 
  550.         the year-to-date column (except at the end),  so put zeros in any 
  551.         empty cells.
  552.  
  553.         This version uses a different technique to stop at the end of the 
  554.         column; it checks to see if the next cell is blank, and if it is, 
  555.         it stops.
  556.  
  557.         Actually,  there  is  a problem finding out if a single  cell  is 
  558.         blank.  Labels, blank cells and zeros all have the value of zero, 
  559.         so  you can't use that.  And @count always has a value of one  if 
  560.         its' argument is a one-cell range.
  561.  
  562.         This  Macro uses @count and a two-cell  range,  named  TEST.  The 
  563.         range  consists of the potential next "Current" cell and the  one 
  564.         cell above it. The value of @count(TEST) will be 2, until it hits 
  565.         the end of the column, when it will be 1.
  566.  
  567.         Version 2:
  568.  
  569.                \A    /re~            |
  570.                      {?}~            |
  571.                      {left}          |
  572.                      {edit}          |
  573.                      +               |  This is Version 1.
  574.                      {edit}          |
  575.                      {right}~        |
  576.                      {edit}{calc}~   |
  577.                      {right}{down}   |
  578.                      /rncTEST~{up}~
  579.                      /xi(@count(TEST)=2)~/rndTEST~/xg\A~
  580.                      /rndTEST~
  581.  
  582.         It's  hard  to put comments next to those long  Macro  lines,  so 
  583.         let's take the last three lines one at a time:
  584.  
  585.                      /rncTEST~{up}~
  586.  
  587.  
  588.  
  589.                                         9
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.         Creates  a  two-cell  range  consisting  of  the  potential  next 
  599.         "Current" cell and the one above it.
  600.  
  601.                      /xi(@count(TEST)=2)~/rndTEST~/xg\A~
  602.  
  603.         This checks to see if the value of @count(TEST) is still 2. If it 
  604.         is,  it  deletes  TEST (important!) and tells the Macro to  start 
  605.         again from the beginning.
  606.  
  607.         This  Macro label had to be long,  because the /xi command  tells 
  608.         the Macro to do the rest of the Macro label,  if the condition is 
  609.         true.
  610.  
  611.                     /rndTEST~
  612.  
  613.         And finally, to clean things up, we delete TEST at the end of the 
  614.         whole Macro.  We had to do this because when @count(TEST) is  NOT 
  615.         2,  the  rest of that line doesn't get executed,  and TEST  still 
  616.         exists.
  617.  
  618.         Well,  that should be enough to help you get started with Macros. 
  619.         Give them a try, and write some of your own.
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.                                        10
  656.  
  657.  
  658.  
  659.  
  660.  
  661.