How to Vlookup With Two Client Rates in Excel

Learn multiple Excel methods to vlookup with two client rates with step-by-step examples and practical applications.

excelformulaspreadsheettutorial
13 min read • Last updated: 7/2/2025

How to Vlookup With Two Client Rates in Excel

Why This Task Matters in Excel

Imagine you sell the same products to two different client groups: “Standard” customers who pay your undiscounted list price and “Preferred” customers who qualify for special rates. Your sales team wants to type a product code, pick a client type, and instantly see the correct price. Without a robust lookup method, they might maintain two separate price lists, copy-paste numbers, or re-enter formulas manually—workflows that are slow, error-prone, and almost impossible to audit.

Dual-rate lookups appear in many industries. A freight company may charge one rate to retail customers and a negotiated rate to strategic partners. A SaaS vendor may quote one monthly fee to nonprofits and another to commercial enterprises. Even inside a single organization, departments sometimes keep an “internal transfer” rate alongside an “external billing” rate. Each scenario shares two requirements:

  1. The product or service must be identified correctly.
  2. The proper client-specific rate must be retrieved automatically.

Excel excels (pun intended) at this problem because it can hold a master rate sheet while front-end worksheets reference that sheet dynamically. Functions such as VLOOKUP, INDEX + MATCH, XLOOKUP, FILTER, and CHOOSE mean you never have to maintain duplicate tables. When you master vlookup with two client rates you:

  • Reduce pricing errors that can cost revenue or customer trust.
  • Streamline quoting and invoicing, saving staff time.
  • Centralize data maintenance—you update one cell and every linked worksheet refreshes.
  • Lay the foundation for more sophisticated tasks like multi-tier pricing, time-based rates, or region-specific mark-ups.

Failing to automate dual-rate lookups has real costs. Re-typing prices increases the chance of “fat-finger” mistakes, exposes you to version-control problems, and slows down decision-making. Mastering this task also strengthens your lookup skills for budgets, dashboards, and data analysis workflows across Excel.

Best Excel Approach

The fastest, most flexible method for a two-rate lookup is to combine VLOOKUP with CHOOSE. Instead of storing two separate VLOOKUP formulas—one for each rate—you can let CHOOSE pick which rate column to return based on the client type. This keeps a single clean rate table and one compact formula.

  • Choose this approach when you have a fixed number of rate columns (two in this case) and your sheet is used by people comfortable with standard VLOOKUP syntax.
  • Avoid it if you must lookup dozens of rate columns or if you are on Microsoft 365, where XLOOKUP’s match_mode and return_array options may offer cleaner syntax.

The logic flow:

  1. Identify the product (lookup value).
  2. Identify the client group (“Standard” or “Preferred”).
  3. Tell CHOOSE whether to pull column 2 or column 3 of the price table.
  4. VLOOKUP returns the intersection of row (product) and chosen column (rate).

Recommended formula:

=VLOOKUP(
    A2,                                     /* product code */
    CHOOSE( {1,2},                          /* build 2-col table on the fly */
        RateTable[Product],                 /* always the first column */
        IF(B2="Preferred",
            RateTable[PreferredRate],
            RateTable[StandardRate]
        )
    ),
    2,                                      /* return the second column of the CHOOSE array */
    FALSE
)

Alternative with INDEX + MATCH (more scalable):

=INDEX(
    RateTable[[StandardRate]:[PreferredRate]],
    MATCH(A2,RateTable[Product],0),
    IF(B2="Preferred",2,1)
)

Parameters and Inputs

  • Lookup Value – Typically a product code or service ID in text or numeric form (cell A2 in examples).
  • Client Type – A string such as “Standard” or “Preferred”. Capitalization should match or be normalized with UPPER/LOWER to prevent mismatches.
  • Rate Table – A properly formatted structured range. At a minimum you need columns [Product], [StandardRate], and [PreferredRate]. Each product must be unique; duplicate keys break exact-match lookups.
  • Match Mode – Both VLOOKUP and INDEX + MATCH examples require exact matches, so make sure the final argument in VLOOKUP is FALSE and the MATCH uses 0.
  • Data Types – Rates should be numeric. If they arrive as text (e.g., exported from accounting software), apply VALUE or convert them in place.
  • Error Handling – Wrap formulas in IFERROR to trap “#N/A” results when a product code is missing.
  • Named Ranges or Tables – Converting the rate sheet to an Excel Table called RateTable locks column references and prevents range drift when you add more rows.

Step-by-Step Examples

Example 1: Basic Scenario

Suppose you maintain the following table in [D2:F6]:

ProductStandardRatePreferredRate
P-100125115
P-200175160
P-300225210
P-400275255

In another sheet your sales form has:

  • Cell A2 – dropdown list of product codes
  • Cell B2 – dropdown “Standard” or “Preferred”
  • Cell C2 – empty; will display the correct price

Step-by-step:

  1. Convert the rate sheet to an Excel Table named RateTable (Ctrl + T).
  2. In C2, enter:
=VLOOKUP( A2, 
          CHOOSE( {1,2},
                  RateTable[Product],
                  IF(B2="Preferred",RateTable[PreferredRate],RateTable[StandardRate])
          ),
          2,
          FALSE)
  1. Test: Select P-200 and “Preferred”. Result should be 160. Change client type to “Standard” and the result flips to 175.
  2. Explanation: CHOOSE creates an array with two columns. Column 1 is always RateTable[Product]. Column 2 depends on B2. VLOOKUP searches column 1 for the product and returns the value in column 2.
  3. Troubleshooting: If you see #N/A, confirm that A2 exactly matches a product code and that RateTable actually includes that product. Check for trailing spaces by using LEN or TRIM.

Common variations:

  • Add a third client rate by nesting another IF inside CHOOSE.
  • Replace the dropdown with data validation lists fed by [unique product codes] and [\"Standard\",\"Preferred\"].
  • Use IFERROR to display “Product not found” rather than #N/A.

Example 2: Real-World Application

Scenario: A logistics firm ships parcels domestically and internationally. Domestic shipping has “Retail” and “Corporate” rates, while international shipping has “RetailInt” and “CorporateInt” rates. The quoting tool must pick the correct rate based on destination and client type.

Rate table in [H2:K10]:

ZoneRetailCorporateRetailIntCorporateInt
Z-015.004.509.008.10
Z-026.005.4010.509.45
Z-037.506.7512.0010.80

Quote form columns:

  • D2 – Zone dropdown (Z-01..Z-03)
  • E2 – Domestic/International dropdown
  • F2 – Retail/Corporate dropdown
  • G2 – result (shipping cost)

Walkthrough:

  1. Add a helper column in the rate table called Key that concatenates Zone & ServiceType. In cell K3 (for first data row):
=[@Zone] & "-" & IF($E$2="Domestic",
                   IF($F$2="Retail","Retail","Corporate"),
                   IF($F$2="Retail","RetailInt","CorporateInt"))

Convert the Rate Table to a structured table named ShipTable.
2. In G2, use INDEX + MATCH for flexibility:

=INDEX(
    ShipTable[[Retail]:[CorporateInt]],
    MATCH(D2,ShipTable[Zone],0),
    MATCH(
        IF(E2="Domestic",
            IF(F2="Retail","Retail","Corporate"),
            IF(F2="Retail","RetailInt","CorporateInt")
        ),
        ShipTable[[#Headers],[Retail]:[CorporateInt]],
        0
    )
)

Execution breakdown:

  • MATCH(D2,ShipTable[Zone],0) locates the row.
  • The nested IF expression figures out which header name matches the desired rate column.
  • The second MATCH converts that header name to a column number inside INDEX.
    Advantages: no CHOOSE needed even with four separate rate columns; table headers drive the lookup, making the formula robust against column re-ordering.

Business benefits: A single form now handles domestic and international quotes in one place. The logistics team updates the ShipTable rates quarterly—no need to touch formulas.

Performance considerations: ShipTable is small here, but even with thousands of zones the INDEX + MATCH pattern remains efficient since it only performs two exact searches.

Example 3: Advanced Technique

Scenario: You are on Microsoft 365 and want to feed an entire list of orders, each with product and client type, and spill out the correct rates automatically—no copying formulas down required.

Orders table [A2:C8]:

ProdClientTypeQty
P-100Standard5
P-400Preferred2
P-300Preferred7
P-200Standard1
P-500Preferred3

Goal: Return a dynamic array of rates in D2 that spills over all rows.

With XLOOKUP you can combine a two-way lookup inside the return_array argument.

=LET(
    prodList, A2:A8,
    clientList, B2:B8,
    rateCols,  CHOOSE({1,2,3},
                RateTable[StandardRate],
                RateTable[PreferredRate],
                RateTable[StandardRate] /* placeholder */),
    clientNumber, IF(clientList="Preferred",2,1),
    price, XLOOKUP(
              prodList,
              RateTable[Product],
              INDEX(rateCols,,clientNumber),
              "Not Found"
           ),
    price
)

Explanation:

  • LET assigns readable names (prodList, clientList) and precomputes clientNumber.
  • CHOOSE builds a 3-column helper array, but only columns 1 and 2 are meaningful.
  • INDEX(rateCols,,clientNumber) chooses column 1 or 2 for each row dynamically. Because the third parameter is an array (clientNumber), INDEX returns an array of columns, making XLOOKUP perform a vectorized two-way lookup.
  • The entire result spills starting at D2.

Edge-case management: If a product like P-500 is missing, XLOOKUP returns “Not Found” instead of #N/A. In production you might replace that with 0 or wrap in IFERROR.

Performance tip: Although CHOOSE with a dummy third column looks odd, it prevents a #VALUE error when INDEX receives a column number of 3 by mistake. Alternatively, build rateCols with HSTACK in Excel 365.

Tips and Best Practices

  1. Convert rate sheets to Excel Tables and use structured references (e.g., RateTable[PreferredRate]) to make formulas self-documenting and resilient to row insertions.
  2. Name dropdown lists explicitly (e.g., ClientTypeList) to reduce data-validation errors and make formulas easier to read.
  3. Use EXACT or set VLOOKUP’s last argument to FALSE to enforce case-sensitive or exact matches; approximate matches can silently return wrong rates.
  4. When debugging, evaluate formula parts with F9 to verify that CHOOSE or INDEX is returning the expected array. Immediately press Esc afterward to avoid overwriting formulas.
  5. Wrap lookup formulas in IFERROR once they work correctly so user-facing sheets show friendly messages rather than raw error codes.
  6. Audit performance on larger datasets by turning on “Workbook Statistics” (Review tab) and ensuring calculation mode is set to Automatic except when performing bulk updates.

Common Mistakes to Avoid

  1. Forgetting to lock references—users insert a new column and the range in your VLOOKUP shifts, returning the wrong rate. Solution: Tables or absolute references (e.g., $D$2:$F$6).
  2. Using approximate match (TRUE or omitted) instead of exact match (FALSE). Approximate match sorts ascending data and returns the next smaller value, leading to severe under-billing.
  3. Mixing data types—product codes stored as numbers in the rate sheet but text in the order sheet cause #N/A errors. Standardize with VALUE or TEXT.
  4. Hard-coding column numbers (e.g., 3) then re-ordering columns later. Prefer MATCH on header names or CHOOSE with explicit column arrays.
  5. Failing to maintain unique keys. Duplicate product codes make VLOOKUP return the first instance, hiding data integrity issues. Use Remove Duplicates or conditional formatting to flag duplicates.

Alternative Methods

MethodProsConsBest For
VLOOKUP + CHOOSEFamiliar syntax, single compact formulaHard-coded client logic inside IF, less scalable to many client typesTwo or three client rates, classic Excel versions
INDEX + MATCH ×2Column order can change, easy to scale to many rate columnsSlightly longer formula, needs second MATCHDynamic tables, five+ rate columns
XLOOKUP with array returnNative modern function, handles missing keys gracefully, spillsRequires Microsoft 365, newer concept for some usersDynamic array tasks, dashboards
Power QueryNo formulas, refreshable transformation, good for large dataRequires refresh step, not real-time changes, learning curveMonthly imports, ETL, merging multiple rate sources
VBA / Office ScriptsUltimate flexibility, can include business rulesMaintenance overhead, macro securityComplex pricing models, automated quote generators

Choose VLOOKUP + CHOOSE for quick wins in traditional workbooks. Move to INDEX + MATCH or XLOOKUP when you have more than two rates, expect frequent column re-ordering, or need array outputs. Power Query and scripting excel when rates come from external databases or require sophisticated business logic.

FAQ

When should I use this approach?

Use a dual-rate lookup whenever the same product or service has two distinct price columns that must be selected automatically based on customer type, contract level, or region. Typical scenarios include wholesale vs retail, domestic vs export, and member vs non-member pricing.

Can this work across multiple sheets?

Absolutely. Store RateTable on a hidden sheet like “Rates” and reference it with 'Rates'!RateTable[PreferredRate] (structured references automatically include the sheet name). The lookup formula on your front sheet works the same; just ensure both sheets are in the same workbook or create a link between workbooks and manage external links carefully.

What are the limitations?

VLOOKUP always searches the first column of its lookup range, so you need CHOOSE or a helper column if the lookup key is not in the leftmost position. Both VLOOKUP and INDEX + MATCH require unique keys for consistent results. Excel Tables max out at about one million rows, so extremely large rate sheets may need Power Pivot or databases.

How do I handle errors?

Wrap the base formula in IFERROR. For example:

=IFERROR(
   VLOOKUP(...),
   "Rate Not Found"
)

For nuanced error handling, test separately for missing product (ISNA) versus missing client type (ISNUMBER(MATCH(..))). Use conditional formatting to highlight rows where the rate returns zero or a default fallback.

Does this work in older Excel versions?

The VLOOKUP + CHOOSE and INDEX + MATCH methods work back to Excel 2007. XLOOKUP and dynamic arrays require Microsoft 365 or Excel 2021. If you need compatibility with Excel 2003, stick with VLOOKUP + CHOOSE and avoid structured references.

What about performance with large datasets?

Exact-match lookups are relatively fast, but you can improve speed by:

  • Turning rate tables into sorted arrays and using approximate match when appropriate.
  • Minimizing volatile functions like INDIRECT.
  • Disabling automatic calculation while bulk-editing data.
  • Moving enormous lookup tables into Power Pivot and using DAX if you cross the hundred-thousand-row mark.

Conclusion

Mastering vlookup with two client rates empowers you to deliver instant, error-free pricing throughout your organization. By combining lookup functions with intelligent column selection, you centralize rate maintenance, streamline workflows, and eliminate costly mistakes. Whether you use VLOOKUP + CHOOSE for simplicity, INDEX + MATCH for flexibility, or XLOOKUP for dynamic arrays, the core principles remain the same: keep a clean rate table, use exact matches, and handle errors gracefully. Continue refining these skills by exploring multi-tier pricing, integrating Power Query, and practicing with real-world datasets—your future self (and your finance team) will thank you!

We use tracking cookies to understand how you use the product and help us improve it. Please accept cookies to help us improve.