Skip to main content
ExcelXLOOKUP Returning Multiple ColumnsLookup & ReferenceCombo RecipeExcel 365ArrayDynamic ArraysSpill Range

The Problem

Have you ever found yourself wrestling with Excel, needing to pull several pieces of information based on a single identifier? Perhaps you're looking up a product ID and need its name, price, and category. Or an employee ID that should return their name, department, and salary. Traditionally, this might involve multiple VLOOKUP or HLOOKUP formulas, each painstakingly adjusted for a different column index. This approach is not only tedious and error-prone but also makes your spreadsheets bloated and harder to maintain. It's a frustrating, manual chore that consumes valuable time and often leads to inconsistencies.

What is XLOOKUP returning multiple columns? XLOOKUP returning multiple columns is an Excel function, primarily available in Excel 365 and later versions, that allows you to fetch an entire row or a selected range of adjacent columns based on a single lookup value. It is commonly used to dynamically extract comprehensive record details with one efficient formula, eliminating the need for repeated lookups and leveraging Excel's dynamic array capabilities. This means you write one formula, and Excel intelligently "spills" the results across the necessary cells.

Business Context & Real-World Use Case

Imagine you're working in the Human Resources department of a mid-sized company. You frequently need to generate reports or populate other worksheets with specific employee details. For instance, a manager might request a list of employees for a project, requiring their Employee ID, Full Name, Department, and current Salary. Your core employee data is stored in a master data table.

Manually retrieving this information by repeatedly copying and pasting or writing separate VLOOKUP formulas for each piece of data (Name, Department, Salary) is incredibly inefficient. In my years as an Excel consultant, I've seen HR teams waste hours on this exact task, leading to frustrating data entry errors, discrepancies between reports, and a general loss of productivity. Each VLOOKUP for a different column requires changing the column index number, a small but critical detail that's easy to get wrong under pressure. Automating this provides immense business value: it ensures data consistency, drastically reduces report generation time, and frees up HR professionals to focus on more strategic tasks. Using XLOOKUP returning multiple columns means you can pull all required information with a single, robust formula, transforming a manual headache into an automated, reliable process. This leads to cleaner data, faster insights, and more confident decision-making across the organization.

The Ingredients: Understanding XLOOKUP Returning Multiple Columns's Setup

The secret to making XLOOKUP return multiple columns lies in its return_array argument. Instead of specifying a single column, you define a range that spans all the columns you wish to retrieve. When XLOOKUP returning multiple columns encounters a multi-column return_array, it intelligently understands that it needs to "spill" the results horizontally.

Here's the standard syntax for the XLOOKUP function:

=XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode])

Let's break down each parameter, with a special focus on return_array:

Parameter Description Required?
lookup_value The value you want to find. This could be an Employee ID, Product Code, or any unique identifier. Yes
lookup_array The range or array where you want to search for the lookup_value. This should typically be a single column. Yes
return_array This is where the magic happens! The range or array from which to return a value. To return multiple columns, this must be a range spanning all desired columns. Yes
[if_not_found] (Optional) The value to return if no match is found. If omitted, XLOOKUP returns #N/A. No
[match_mode] (Optional) Specifies the type of match: 0 for exact match (default), -1 for exact match or next smaller, 1 for exact match or next larger, 2 for wildcard match. No
[search_mode] (Optional) Specifies the search direction: 1 for searching first to last (default), -1 for last to first, 2 for binary search (ascending), -2 for binary search (descending). No

For XLOOKUP returning multiple columns, the return_array is the most crucial parameter. By defining it as a multi-column range (e.g., B2:D100 instead of B2:B100), Excel's dynamic array engine automatically expands the results into adjacent cells, effectively giving you a horizontal array of data with just one formula.

The Recipe: Step-by-Step Instructions

Let's walk through a practical example using employee data. We want to look up an Employee ID and retrieve their Full Name, Department, and Salary all at once using a single XLOOKUP returning multiple columns formula.

Our Employee Data Table (Sheet1):

Employee ID Full Name Department Salary Hire Date
EMP001 Alice Johnson HR $65,000 2020-01-15
EMP002 Bob Williams Sales $72,000 2019-03-22
EMP003 Carol Davis Marketing $68,000 2021-07-01
EMP004 David Brown IT $85,000 2018-11-10
EMP005 Eve Green HR $62,000 2022-04-05

Our Lookup Area (Sheet2 or same sheet):

Lookup ID Full Name Department Salary
EMP003

Now, let's create our XLOOKUP returning multiple columns formula.

  1. Select Your Starting Cell: Click on cell B2 in your Lookup Area where you want the first piece of information (Full Name) to appear. This is the top-left cell of your spill range.

  2. Enter the XLOOKUP Formula: Begin typing your XLOOKUP formula.
    =XLOOKUP(

  3. Specify the Lookup Value: Our lookup_value is the Employee ID we want to find. In our Lookup Area, this is in cell A2.
    =XLOOKUP(A2,

  4. Define the Lookup Array: Where should Excel look for A2? It's in the Employee ID column of our data. Let's assume our data table is in Sheet1, cells A2:A6.
    =XLOOKUP(A2, Sheet1!A2:A6,

  5. Crucially, Define the Multi-Column Return Array: We want to return Full Name, Department, and Salary. These are in columns B, C, and D respectively in our Sheet1 data. So, our return_array will be Sheet1!B2:D6. This contiguous range tells XLOOKUP to fetch data from all three columns.
    =XLOOKUP(A2, Sheet1!A2:A6, Sheet1!B2:D6)

  6. Add Optional Parameters (Recommended for Robustness): For a professional touch, let's add if_not_found and match_mode. We'll use "Not Found" for if_not_found and 0 for an exact match.
    =XLOOKUP(A2, Sheet1!A2:A6, Sheet1!B2:D6, "Not Found", 0)

  7. Complete the Formula and Press Enter: Your final formula should look like this:
    =XLOOKUP(A2, Sheet1!A2:A6, Sheet1!B2:D6, "Not Found", 0)

The Result:

When you press Enter, Excel will place "Carol Davis" in cell B2, "Marketing" in cell C2, and "$68,000" in cell D2. This single formula in B2 has dynamically spilled the results into C2 and D2 without you having to write separate formulas. The XLOOKUP has successfully returned multiple columns.

Lookup ID Full Name Department Salary
EMP003 Carol Davis Marketing $68,000

Notice the blue border around B2:D2 indicating a spilled array. If you select C2 or D2, you'll see the formula grayed out, confirming it's part of the spilled range from B2. This exemplifies the power of XLOOKUP returning multiple columns and dynamic arrays.

Pro Tips: Level Up Your Skills

1. Embrace Excel Tables for Dynamic Ranges: Instead of using static cell references like A2:A6, convert your data into an Excel Table (Ctrl+T). This makes your lookup_array and return_array automatically expand as you add new data. For example, Sheet1!Table1[Employee ID] and Sheet1!Table1[[Full Name]:[Salary]] are far more robust. This is a best practice that experienced Excel users prefer for maintaining data integrity and scalability.

2. Handling Non-Contiguous Columns: What if the columns you want to return are not adjacent? For example, Full Name and Salary but not Department in between. You can wrap your return_array in a CHOOSE function or use INDEX and MATCH with an array constant, but this adds complexity and deviates from the simple elegance of XLOOKUP returning multiple columns directly. Often, it's better to rearrange your source data (if feasible) or use separate XLOOKUP calls if the layout is truly fixed and disparate.

3. Combine with Other Dynamic Array Functions: The spilled output of XLOOKUP can become the input for other dynamic array functions like SORT, FILTER, or UNIQUE. For example, you could SORT(XLOOKUP(...), 3, -1) to sort the spilled results by the third column (Salary) in descending order. This unlocks incredible analytical power.

4. Use Named Ranges for Clarity: Assign meaningful named ranges to your lookup_array and return_array (e.g., Employee_IDs, Employee_Details). This makes your XLOOKUP formulas much more readable and easier to debug, especially in complex workbooks.

Troubleshooting: Common Errors & Fixes

Even the most seasoned Excel chefs occasionally face a culinary catastrophe. Here are some common XLOOKUP errors and how to gracefully fix them.

1. #N/A Error

  • What it looks like: The cell where your XLOOKUP formula resides, and potentially cells intended to receive spilled data, displays #N/A.
  • Why it happens: This is the classic "not found" error. Excel couldn't find your lookup_value within the lookup_array. Common causes include typos in the lookup_value, leading or trailing spaces in either the lookup value or the source data, or the lookup_value simply not existing in the lookup_array. If you didn't specify an [if_not_found] argument, this is the default error.
  • How to fix it:
    1. Check Spelling/Typo: Double-check that your lookup_value (e.g., EMP003) is spelled exactly as it appears in your lookup_array.
    2. Trim Spaces: Use the TRIM function around your lookup_value (e.g., TRIM(A2)) and consider cleaning your source data with TRIM as well to remove any unwanted leading or trailing spaces.
    3. Verify Data Type: Ensure both your lookup_value and the values in your lookup_array are of the same data type (e.g., both text or both numbers). Sometimes numbers stored as text can cause issues.
    4. Confirm Existence: Manually verify that the lookup_value actually exists in the lookup_array range you've specified.

2. #SPILL! Error

  • What it looks like: The XLOOKUP formula returns a #SPILL! error in the starting cell.
  • Why it happens: This error occurs when Excel attempts to spill an array of results into adjacent cells, but those cells are not empty. Something is blocking the "spill."
  • How to fix it:
    1. Clear Obstructions: Select the cell with the #SPILL! error. A dashed border will appear around the intended spill range. Excel will also provide a small error indicator (a green triangle or exclamation mark) that, when clicked, often explains the issue. Identify and clear any data, formulas, or merged cells within this intended spill range.
    2. Check Merged Cells: Merged cells are notorious for causing #SPILL! errors. Unmerge any cells that overlap with your intended spill range.
    3. Ensure Enough Space: If you're trying to spill 3 columns and 10 rows, ensure there are at least 3 columns and 10 rows immediately adjacent and clear for the results.

3. #VALUE! Error (Less common with XLOOKUP, but can appear)

  • What it looks like: The formula returns #VALUE!.
  • Why it happens: While XLOOKUP is generally more robust with array dimensions than older functions, a #VALUE! error can sometimes signify a problem with the return_array if it's not contiguous or if there's a fundamental mismatch in data interpretation. More often, it can be caused by providing an argument that is of the wrong data type or range. For example, if you somehow passed a single cell reference to return_array when the function expected a range for its internal processing (though XLOOKUP typically handles this gracefully). Another common scenario is if the lookup value or lookup array are themselves the result of another formula that generates an error.
  • How to fix it:
    1. Verify Return Array: Ensure your return_array is a valid, contiguous range (e.g., Sheet1!B2:D6). Avoid trying to create a return_array from non-contiguous cells like (Sheet1!B2:B6, Sheet1!D2:D6) directly within XLOOKUP as it will not work as intended for a multi-column spill.
    2. Inspect Dependencies: Check if lookup_value, lookup_array, or return_array are themselves results of other formulas. If those preceding formulas generate errors, XLOOKUP will inherit them.
    3. Simplify and Test: Temporarily simplify your XLOOKUP to its bare minimum (lookup_value, lookup_array, return_array) to isolate the issue. If it works, gradually reintroduce optional parameters.

Quick Reference

Feature Description
Syntax =XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode])
Key for Multi-Column The return_array parameter must be a contiguous range of multiple columns (e.g., B2:D100) to enable the dynamic spill behavior.
Common Use Case Retrieving an entire record or specific adjacent fields (e.g., Employee Name, Department, Salary) from a master data table based on a single identifier (e.g., Employee ID) using one formula, which then "spills" the results into adjacent cells horizontally.

Related Functions

👨‍💻

Written by The Head Chef

Former 10-year Financial Analyst who survived countless month-end closes. I build these recipes to save you from weekend-ruining spreadsheet errors.

Read the full story →

You might also find these useful 💡