12.4. Tutorial: Quickly Generating Invoices from a Product Catalog
The reference, lookup, and information functions really shine when you want to build worksheets that automatically carry out a series of boredom-inducing tasks . And they let you tie your information together in interesting ways. Maybe you want to determine monthly wages based on billing rates, build a parts list for an order, or create an invoice based on items that have been ordered from a product catalog. This last task, which is demonstrated in the next example, is sometimes called a dynamic invoicer . It allows sales representatives to quickly create an invoice by choosing from a catalog of company products.
The dynamic invoicer employs the following techniques:
First you build the table filled with your company's products. Figure 12-12 shows you the list for this example.
Next, you build a worksheet that actually creates the invoices. You should probably include space for entering customer information, followed by a large area for the list of items that have been ordered, as shown in Figure 12-13.
Here, your best approach is to retrieve an item from the product catalog based on the product ID; this prevents people using spreadsheet having to type out full product names . Therefore, a lookup function needs to be written to scan the product table for a matching ID. And since the invoice needs to record the product name and its price, you need two lookup functions. Here's the lookup that retrieves the price for the first item in the invoice:
=VLOOKUP(A12, Products!$A:$D, 3, FALSE)
The lookup for the model name is the same, but the column offset is 2 instead of 3:
=VLOOKUP(A12, Products!$A:$D, 2, FALSE)
The reference to the table of products is preceded by the word Products and an exclamation mark. That's because the products table isn't on the invoice worksheet. Instead, it's in a different worksheet in the same workbook named Products. (Remember, in order to perform a calculation with data in another worksheet, you just need to preface your cell reference with the name of the worksheet, followed by the exclamation mark. For a refresher on how functions interact across worksheets and workbooks, see Section 8.3.3.)
You'll also notice that this function uses a mix of absolute and relative references. The reference for the product ID is relative (A12) because each line item in the invoice has its own product ID, which is what the sales rep enters to start filling up the purchase order. The product table is a range made up of two absolute references ($A$2:$D$42) . This range ensures that as you copy the formula down to subsequent rows on the invoice table, each copy refers to the same product catalog.
As written, the function still suffers from one problem. If you copy the formula to all the available rows in the invoice, you'll notice that the value #N/A appears in each row where you haven't entered a product ID. This error message occurs because the VLOOKUP( ) function attempts to perform a lookup for a product with a product ID of 0, which doesn't exist. The #N/A error message is a significant problem because it prevents you from calculating the total cost of the order with the SUM( ) function. If the SUM( ) function attempts to add together a range of cells that includes an #N/A value, it simply returns the #N/A error code.
To solve this problem, you must use conditional logic to test if a product ID has been entered. If it hasn't, you can simply put a blank value in the price column. Here's the corrected formula:
=IF(ISBLANK(A12), 0, VLOOKUP(A12, Products!$A:$D, 3, FALSE))
You can now build an invoice in seconds, just by typing in a few product ID numbers in the leftmost column. The products appear automatically, and you can calculate the overall total with a simple formula that uses the SUM( ) function:
Note: This dynamic invoicer's only limitation is that the sales rep must know which product ID codes to use (or must look them up on the first worksheet). An even more impressive worksheet could automate this process with some sort of list box control. You'll see how to take this step in Section 22.2.5.