CHOOSECOLS & CHOOSEROWS: Extract Specific Columns/Rows from Arrays

CHOOSECOLS and CHOOSEROWS functions in Excel 365 — showing a 4-column source table where CHOOSECOLS(A2:D20, 1, 3) extracts only the Name and Score columns, with key formula examples for reversing columns, selecting by header name with MATCH, a dynamic dropdown column picker, and removing a column using SEQUENCE and FILTER.
INDEX retrieves values from a table by row and column number. CHOOSECOLS and CHOOSEROWS do the same for entire columns and rows — and they do it in a single readable call. Pass the array and a list of column or row numbers, and the function returns exactly those columns or rows in the order you specify. Negative numbers count from the end, so you never need to know the total width. This guide covers eight examples: selecting named columns by position, reversing and duplicating columns, CHOOSECOLS on FILTER output, a dynamic column picker driven by a dropdown, CHOOSEROWS for specific and alternating rows, combining both functions for rectangular sub-table extraction, removing a column with SEQUENCE+FILTER, and selecting columns by header name using MATCH for reorder-proof formulas.

INDEX and CHOOSE have long been the go-to tools for pulling specific columns from a table. Both work, but both require knowing the column number and both produce verbose formulas. CHOOSECOLS and CHOOSEROWS replace that complexity with a single, readable function call. Pass the array and one or more column or row numbers. The function returns exactly those columns or rows in that order. Negative numbers count from the right or bottom. You can even reorder columns, repeat them, or reverse the entire array — all without a helper column.

This guide covers both functions fully, with eight practical examples. You will learn how to extract named columns from a FILTER result, reorder and reverse a table, build a dynamic column picker, and combine CHOOSECOLS with SORT and UNIQUE. Each example also shows the pre-365 equivalent so you understand what these functions replace.

Availability: CHOOSECOLS and CHOOSEROWS are available in Excel 365 only (August 2022 channel release or later). They are not available in Excel 2021, 2019, Google Sheets, or earlier versions. Both spill automatically. Neither requires Ctrl+Shift+Enter.

What Do CHOOSECOLS and CHOOSEROWS Do?

CHOOSECOLS returns selected columns from an array in the order you specify. CHOOSEROWS does the same for rows. Both accept multiple column or row numbers as separate arguments. Negative numbers count from the end. Column -1 is the last column; -2 is second-to-last. Consequently, you can write clean formulas without knowing the total column count.

Additionally, both accept repeated arguments. Passing the same column number twice returns that column twice. This makes it easy to duplicate a column or reverse the column order. Together, these make CHOOSECOLS and CHOOSEROWS the most flexible column-selection tools in Excel 365.

What Is the CHOOSECOLS and CHOOSEROWS Syntax?

=CHOOSECOLS(array, col_num1, [col_num2], ...) =CHOOSEROWS(array, row_num1, [row_num2], ...)
ArgumentRequired?Description
arrayRequiredThe source array or range. Can be a cell range, named range, or any dynamic array expression (FILTER, SORT, UNIQUE, etc.).
col_num / row_numRequired (at least one)The column or row number to extract. Positive = count from the left/top. Negative = count from the right/bottom. Multiple numbers return multiple columns/rows in that order. Repeated numbers duplicate a column/row.
Negative-index shortcut: CHOOSECOLS(A2:D20, -1) returns the last column (column D) without knowing the total column count. CHOOSECOLS(A2:D20, -1, -2) returns the last two columns in reverse order. This is especially useful when working with dynamic array outputs from FILTER or SORT where the number of columns may vary.

Examples 1–8: CHOOSECOLS and CHOOSEROWS in Practice

1
Basic column selection — pick columns by number

The simplest use is selecting one or more columns from a table by their position. The result spills into as many columns as you specified. Columns appear in the order you list the numbers — not necessarily the source order.

Col 1: Name
Col 2: Dept
Col 3: Score
Col 4: Date
CHOOSECOLS(A,1,3) result
Alice
Eng
87
Jan
Alice / 87
Bob
HR
72
Feb
Bob / 72
A2:D20 = 4-column table (Name, Dept, Score, Date). Return only Name (col 1) and Score (col 3): =CHOOSECOLS(A2:D20, 1, 3) → Spills Name and Score columns side by side Return Dept and Name (reversed order): =CHOOSECOLS(A2:D20, 2, 1) → Dept first, then Name — order of arguments = order of output columns Return last column without knowing total count: =CHOOSECOLS(A2:D20, -1) → Returns column D (the 4th/last column) Pre-365 equivalent (INDEX + MATCH for column number): =INDEX(A2:D20, 0, {1, 3}) → Same result, but required Ctrl+Shift+Enter in Excel 2019
2
Reverse, duplicate, and reorder columns

CHOOSECOLS supports repeated column numbers and reverse ordering. You can reverse a table’s column order by listing the numbers in descending sequence, or duplicate a column by referencing the same number twice. These operations previously required SORT with a custom sort array or multiple INDEX calls.

A2:D20 = 4-column table. Reverse all columns (D, C, B, A order): =CHOOSECOLS(A2:D20, -1, -2, -3, -4) → Returns columns in order 4,3,2,1 (rightmost first) Duplicate column 1 (Name) for side-by-side comparison: =CHOOSECOLS(A2:D20, 1, 1, 2, 3, 4) → Returns Name, Name, Dept, Score, Date (Name appears twice) Dynamic column reversal without knowing column count: COLUMNS() returns the total column count; SEQUENCE generates reverse order. =CHOOSECOLS( A2:D20, SEQUENCE(1, COLUMNS(A2:D20), -1, -1) ) → Reverses all columns regardless of how many columns the table has
3
CHOOSECOLS on FILTER output — select specific columns from filtered results

FILTER returns all columns of a table, but you often only need a subset. Specifically, wrapping CHOOSECOLS around FILTER selects exactly the columns you want. This is cleaner than pre-selecting column ranges inside FILTER.

A2:E100 = full table (Name, Dept, Score, Date, Status). Filter for Engineering AND return only Name (col 1) and Score (col 3). Without CHOOSECOLS — you must reference specific column ranges in FILTER: This is fragile if columns are inserted or reordered. =FILTER(CHOOSE({1,2}, A2:A100, C2:C100), B2:B100="Eng") With CHOOSECOLS — filter the full table, then select the columns you want: =CHOOSECOLS( FILTER(A2:E100, B2:B100="Engineering"), 1, 3 ) → Returns Name and Score for Engineering employees only Sort the filtered result by Score descending, then pick columns: =CHOOSECOLS( SORT(FILTER(A2:E100, B2:B100="Engineering"), 3, -1), 1, 3 ) → Engineering employees, sorted by Score descending, Name and Score only
4
Dynamic column picker — let a dropdown control which column shows

A dropdown that controls which columns appear in a report is a powerful dashboard pattern. When a user selects "Score", the report shows Name and Score. When they select "Date", it shows Name and Date. CHOOSECOLS with MATCH makes this possible without any VBA.

A1:E1 = header row {"Name","Dept","Score","Date","Status"}. A2:E100 = data. G1 = user dropdown (Data Validation list of column headers). Find the column number of the dropdown selection: =MATCH(G1, A1:E1, 0) → Returns the column position of the selected header (e.g. 3 for "Score") Show Name + the selected column dynamically: =CHOOSECOLS( A2:E100, 1, MATCH($G$1, $A$1:$E$1, 0) ) → Changes dynamically when the dropdown selection changes Multiple dynamic selections — G1 and H1 each hold a column name: =CHOOSECOLS( A2:E100, MATCH($G$1, $A$1:$E$1, 0), MATCH($H$1, $A$1:$E$1, 0) ) → Shows whichever two columns the user selects from the dropdowns

Examples 5–8: Rows, Combinations, and Advanced Patterns

5
CHOOSEROWS — extract specific rows by number

CHOOSEROWS works identically to CHOOSECOLS but selects rows instead of columns. It is useful for extracting specific records by position, building a top-and-bottom comparison (first row and last row), or selecting alternating rows from a table. Negative row numbers count from the bottom.

A2:D20 = 19 rows of data. Return rows 1, 5, and 10 (by position in the array): =CHOOSEROWS(A2:D20, 1, 5, 10) → Returns the 1st, 5th, and 10th rows of the array (rows A2, A6, A11) Return the first and last rows (header-and-footer comparison): =CHOOSEROWS(A2:D20, 1, -1) → Returns row A2 and row A20 (first and last) Return every other row (alternating rows 1, 3, 5, 7...): SEQUENCE(CEILING(ROWS(A2:A20)/2,1),,1,2) generates {1,3,5,7,...} =CHOOSEROWS( A2:D20, SEQUENCE(CEILING(ROWS(A2:A20)/2, 1), 1, 1, 2) ) → Returns odd-position rows (1st, 3rd, 5th...) from the table Reverse all rows (bottom to top): SEQUENCE with negative step generates {19,18,17,...,1}. =CHOOSEROWS( A2:D20, SEQUENCE(ROWS(A2:D20), 1, ROWS(A2:D20), -1) ) → Entire table reversed vertically (last row first)
6
Combine CHOOSECOLS and CHOOSEROWS — extract a rectangular sub-table

Combining CHOOSECOLS and CHOOSEROWS extracts a rectangular sub-table from a larger range. For example, you can extract columns 1, 3, and 5 from rows 1, 10, and 20 in one nested formula. This is cleaner than INDEX with row and column arrays.

A2:J100 = 10-column, 99-row dataset. Goal: extract columns 2, 5, 8 from rows 1, 25, 50, 75. Step 1: CHOOSEROWS selects the four specific rows: =CHOOSEROWS(A2:J100, 1, 25, 50, 75) Step 2: Wrap CHOOSECOLS to also select specific columns: The result is a 4-row × 3-column sub-table. =CHOOSECOLS( =CHOOSEROWS(A2:J100, 1, 25, 50, 75), 2, 5, 8 ) → A 4×3 array: rows {1,25,50,75} × columns {2,5,8} Old equivalent (INDEX with row and column arrays — required CSE): {=INDEX(A2:J100, {1;25;50;75}, {2,5,8})} → CHOOSECOLS+CHOOSEROWS is far more readable
7
Remove a column — return all columns except one

CHOOSECOLS has no "exclude column" argument. However, combining it with SEQUENCE returns all columns except a specified one. This replaces a common FILTER workaround for dropping unwanted columns.

A2:E100 = 5-column table. Goal: return all columns EXCEPT column 3 (Score). SEQUENCE(1,5) = {1,2,3,4,5}. We want {1,2,4,5} — skipping 3. Using FILTER on a SEQUENCE to exclude a column number: This generates all column numbers except the one to drop. =CHOOSECOLS( A2:E100, FILTER( SEQUENCE(1, COLUMNS(A2:E100)), SEQUENCE(1, COLUMNS(A2:E100)) <> 3 ) ) → Returns all columns except column 3 (Score dropped) Dynamic version — G1 = column number to exclude: Change G1 to drop a different column without editing the formula. =CHOOSECOLS( A2:E100, FILTER( SEQUENCE(1, COLUMNS(A2:E100)), SEQUENCE(1, COLUMNS(A2:E100)) <> $G$1 ) )
8
Named column selection — select columns by header name, not number

Hard-coded column numbers break when columns move. Using MATCH to convert a header name to a column number makes CHOOSECOLS robust to changes. This is particularly useful in team workbooks where columns may shift.

A1:E1 = header row {"Name","Dept","Score","Date","Status"}. A2:E100 = data rows. Select columns by name — robust to column reordering: MATCH finds the column number from the header name. =CHOOSECOLS( A2:E100, MATCH("Name", $A$1:$E$1, 0), MATCH("Score", $A$1:$E$1, 0) ) → Returns Name and Score columns even if columns are reordered Include the header row in the output: Stack the header selection and data selection with VSTACK. VSTACK( =CHOOSECOLS($A$1:$E$1, MATCH("Name",$A$1:$E$1,0), MATCH("Score",$A$1:$E$1,0)), =CHOOSECOLS($A$2:$E$100, MATCH("Name",$A$1:$E$1,0), MATCH("Score",$A$1:$E$1,0)) ) → Header + data rows, Name and Score columns only

Common Issues and How to Fix Them

CHOOSECOLS returns #VALUE!

#VALUE! usually means a column number is out of range. Referencing column 5 in a 4-column array causes an error. Always match the column numbers to the array width. Also verify the col_num is a number, not text — a header name without MATCH causes the same error.

The function is not available in my version

CHOOSECOLS and CHOOSEROWS require Excel 365. They are not available in Excel 2021, 2019, or Google Sheets. For compatibility, use INDEX with an array of column numbers: =INDEX(A2:D20, 0, {1, 3}) returns columns 1 and 3 in Excel 2019 and later (with Ctrl+Shift+Enter in 2019). In Excel 365 without CHOOSECOLS, HSTACK can stack individual column ranges side by side as an alternative.

Frequently Asked Questions

  • What does CHOOSECOLS do in Excel?+
    CHOOSECOLS selects and returns specific columns from an array in the order you specify. Pass the source array and one or more column position numbers. Positive numbers count from the left. Negative numbers count from the right — so -1 means the last column regardless of how wide the array is. You can reorder columns, duplicate columns, or reverse the array by listing the column numbers in any order. Multiple numbers return multiple columns as a spilled result. The function is available in Excel 365 only.
  • What is the difference between CHOOSECOLS and INDEX?+
    Both can return specific columns. INDEX(A:D, 0, {1,3}) selects columns but requires Ctrl+Shift+Enter in older Excel and is less readable. CHOOSECOLS is purpose-built for column selection, requires no array entry in Excel 365, supports negative indexing naturally, and accepts the column numbers as simple comma-separated arguments rather than an array constant. CHOOSECOLS is also easier to combine with MATCH for name-based selection.
  • Can CHOOSECOLS and CHOOSEROWS work with FILTER?+
    Yes — this is one of their most powerful uses. Wrap CHOOSECOLS around FILTER to select specific columns from the filtered result: =CHOOSECOLS(FILTER(A2:E100, B2:B100="Engineering"), 1, 3) returns the Name and Score columns for Engineering employees only. Similarly, combine CHOOSEROWS with FILTER to select specific rows from a filtered output. Both functions accept any array expression as input, so any dynamic array result can be passed directly as the first argument.
  • How do I select columns by name instead of number?+
    Use MATCH to convert a column header name into a column number, then pass that to CHOOSECOLS: =CHOOSECOLS(A2:E100, MATCH("Score", A1:E1, 0)). This makes the formula robust to column reordering because MATCH always finds the correct position regardless of where the column is. For multiple named columns, use separate MATCH calls as separate arguments: =CHOOSECOLS(A2:E100, MATCH("Name", A1:E1, 0), MATCH("Score", A1:E1, 0)).