Available in:All versions (Works in Excel 2007, every later version, Microsoft 365 and Excel for the web)Examples need Excel 2021 or laterCategory:Lookup & referenceUnder review

CHOOSE

KIEZEN in Dutch Excel

Picks the value at a given position from a list of values you type or point to, counting from 1.

Difficulty rating 2 of 5. The idea is small, but the index must be a whole position from 1 to the number of values, and a fraction is cut off rather than rounded.

Last updated: 13 October 2026

See the worked examples

Sheet excerpt: C2 holds the formula
RowABC
1TaskPhase no.Phase
2Debtor confirmations33Year-end audit=CHOOSE(B2, "Planning", "Interim audit", "Year-end audit", "Reporting")=CHOOSE(B2; "Planning"; "Interim audit"; "Year-end audit"; "Reporting")
3Risk assessment11
4Walkthroughs22
5Review of annual report44
Formula cell (C2)Input

Result: Year-end audit

=CHOOSE(B2, "Planning", "Interim audit", "Year-end audit", "Reporting")
=CHOOSE(B2; "Planning"; "Interim audit"; "Year-end audit"; "Reporting")

What CHOOSE does and when to use it

What it does: it returns the item at a given position in a list you type into the formula, so audit phase 3 becomes the text "year-end audit".

When to use it: when you hold a number from 1 upward and a short, fixed list gives it meaning, such as a phase number or a month mapped to a fiscal quarter. For a long list that changes, keep it in a table and use XLOOKUP.

How Excel evaluates it

Excel first works out index_num and cuts off the decimals: 2.9 becomes 2, not 3. It then counts through the value arguments, with value1 as position 1, and returns the one at that position. Only that one is used; the others are ignored.

When the position is below 1 or higher than the number of values you gave, the result is #VALUE!. A value can also be a range: CHOOSE then returns the range itself, and a function around it, such as SUM, works on those cells.

Watch out: CHOOSE cuts a calculated index such as 2.9 off to 2 instead of rounding it, and returns the wrong item without any error.

Mental model

Picture a rack of numbered hooks with a different item on each one. The index is the number of the hook, and you get what hangs there. A hook number that does not exist gives you nothing but an error.

Terms used on this page: argument, range, cell

CHOOSE(index_num, value1, [value2], ...)
CHOOSE(index_num; value1; [value2]; ...)
Arguments
ArgumentTypeMeaning
index_numRequiredWhich value to pick, counting from 1.
value1RequiredThe first value to choose from, at position 1.
value2OptionalFurther values, in the order of their position.

Return value:The index_num-th value of the list, or #VALUE! when that position does not exist

Formulas use commas (,) between arguments, as in English Excel. Formulas use semicolons (;) between arguments, as in Dutch Excel. Formulas use commas (,) between arguments, as in English Excel; Dutch Excel uses semicolons (;).

Worked examples

Beginner

Name the audit phase from its number

Your audit plan tags each task with a phase number:

  • 1: planning
  • 2: interim audit
  • 3: year-end audit
  • 4: reporting

A reviewer who opens the plan prefers names over numbers, so you want a column that shows the phase name for each task.

Sheet excerpt: C2 holds the formula
RowABCD
1TaskPhase no.Phase
2Debtor confirmations33Year-end audit=CHOOSE(B2, "Planning", "Interim audit", "Year-end audit", "Reporting")=CHOOSE(B2; "Planning"; "Interim audit"; "Year-end audit"; "Reporting")
3Risk assessment11
4Walkthroughs22
5Review of annual report44
6
Formula cell (C2)Input

Formula in C2

=CHOOSE(B2, "Planning", "Interim audit", "Year-end audit", "Reporting")
=CHOOSE(B2; "Planning"; "Interim audit"; "Year-end audit"; "Reporting")

Result: Year-end audit

Step by step
  1. B2 holds 3. That is the index_num: the position Excel has to pick.
  2. Excel counts through the four values: position 1 is Planning, position 2 is Interim audit, position 3 is Year-end audit.
  3. Position 3 is the one it wanted, so it returns Year-end audit. Reporting, the fourth value, is not used.
  4. Fill the formula down to C3: B3 holds 1, so the first value comes back: Planning.
  5. Type 5 in B2 and the result is #VALUE!, because the list has only four values.

Watch out: A phase number of 0 or 5 gives #VALUE!, because positions run from 1 to 4. A typing slip in column B spreads as an error into column C.

More on this example: why it works, 1 more pitfall, 1 variation

Why it works

CHOOSE does not search for anything. The number in B2 is a position, and the position decides which of the four values is returned. That is why the phase numbers must follow the order of the list in the formula.

More to watch out for

  • Put the names in a different order than the numbers and every task shows the wrong phase without any error. Number the phases in the same order as the values in the formula.

Variations

=IFERROR(CHOOSE(B2, "Planning", "Interim audit", "Year-end audit", "Reporting"), "Unknown phase")
=IFERROR(CHOOSE(B2; "Planning"; "Interim audit"; "Year-end audit"; "Reporting"); "Unknown phase")

Shows a message for a phase number outside 1 to 4. IFERROR also hides every other error, so use it only when the number is the only thing that can go wrong.

Intermediate

Map invoice dates to the fiscal quarter of a March year-end

Your client's financial year ends on 31 March, so the first quarter runs from April to June. For the cut-off test you want the fiscal quarter next to each invoice date.

A division by 3 would give calendar quarters, so you list the quarter for each month yourself, and CHOOSE picks the one that belongs to the month number.

Sheet excerpt: C2 holds the formula
RowABCD
1Invoice no.Invoice dateFiscal quarter
2F-25-039114 Nov 2025Q3=CHOOSE(MONTH(B2), "Q4", "Q4", "Q4", "Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q3", "Q3", "Q3")=CHOOSE(MONTH(B2); "Q4"; "Q4"; "Q4"; "Q1"; "Q1"; "Q1"; "Q2"; "Q2"; "Q2"; "Q3"; "Q3"; "Q3")
3F-26-005827 Feb 2026
4F-25-029430 Jun 2025
5F-25-0395
6F-25-03445 Aug 2025
7
Formula cell (C2)InputNote: B5 is empty on purpose: an invoice whose date was not filled in.

Formula in C2

=CHOOSE(MONTH(B2), "Q4", "Q4", "Q4", "Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q3", "Q3", "Q3")
=CHOOSE(MONTH(B2); "Q4"; "Q4"; "Q4"; "Q1"; "Q1"; "Q1"; "Q2"; "Q2"; "Q2"; "Q3"; "Q3"; "Q3")

Result: Q3

Step by step
  1. Excel works out the inside first. B2 holds 14 Nov 2025, and MONTH returns 11. That is the index_num.
  2. CHOOSE counts through its twelve values:

    • positions 1 to 3 (January to March) are Q4
    • positions 4 to 6 (April to June) are Q1
    • positions 7 to 9 are Q2
    • positions 10 to 12 are Q3
  3. Position 11 is Q3, so that is the result. The other eleven values are not used.
  4. In C3, 27 Feb 2026 gives month 2. The second value is Q4: the last quarter of the year that ends on 31 March 2026.
  5. B5 is empty. Excel reads an empty cell as 0, which MONTH turns into 1 (January), so C5 shows Q4. There is no error, and the answer is wrong.

Watch out: An empty date gives month 1 and the quarter Q4, silently. Test the date column for blanks before you rely on the quarters, or use the IF variation below.

More on this example: why it works, 1 more pitfall, 1 variation

Why it works

MONTH turns any date into a position from 1 to 12, and the list in the formula is ordered by month, so the position is exactly the month number. The fiscal year starts in April, which is why a list works where arithmetic on the month would need a correction.

More to watch out for

  • List only eleven quarters and December gives #VALUE!, but only for December invoices, so the mistake can hide until year-end. Count the values: twelve.

Variations

=IF(B2 = "", "", CHOOSE(MONTH(B2), "Q4", "Q4", "Q4", "Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q3", "Q3", "Q3"))
=IF(B2 = ""; ""; CHOOSE(MONTH(B2); "Q4"; "Q4"; "Q4"; "Q1"; "Q1"; "Q1"; "Q2"; "Q2"; "Q2"; "Q3"; "Q3"; "Q3"))

Leaves the cell empty for an invoice without a date instead of showing Q4. It adds a second function, so use it when blanks are likely.

Advanced

Total the quarter that belongs to the reporting month

A group reporting pack lists revenue per country with one column for each quarter. The reviewer types a month number (8 for August) and expects the total of the quarter that contains it.

The sheet should not need a separate formula for each quarter, so CHOOSE picks the right column and SUM adds it.

Sheet excerpt: H2 holds the formula
RowABCDEFGHI
1CountryQ1Q2Q3Q4Month88
2Netherlands€412,500.00€ 412.500,00€438,200.00€ 438.200,00€455,900.00€ 455.900,00€501,300.00€ 501.300,00Quarter total€776,950.00€ 776.950,00=SUM(CHOOSE(ROUNDUP(H1 / 3, 0), B2:B5, C2:C5, D2:D5, E2:E5))=SUM(CHOOSE(ROUNDUP(H1 / 3; 0); B2:B5; C2:C5; D2:D5; E2:E5))
3Belgium€128,400.00€ 128.400,00€131,750.00€ 131.750,00€140,200.00€ 140.200,00€152,600.00€ 152.600,00
4Germany€96,300.00€ 96.300,00€104,800.00€ 104.800,00€99,550.00€ 99.550,00€118,400.00€ 118.400,00
5France€74,200.00€ 74.200,00€69,850.00€ 69.850,00€81,300.00€ 81.300,00€90,100.00€ 90.100,00
6
Formula cell (H2)Input

Formula in H2

=SUM(CHOOSE(ROUNDUP(H1 / 3, 0), B2:B5, C2:C5, D2:D5, E2:E5))
=SUM(CHOOSE(ROUNDUP(H1 / 3; 0); B2:B5; C2:C5; D2:D5; E2:E5))

Result: €776,950.00€ 776.950,00

Step by step
  1. Excel works from the inside out. H1 holds 8, and 8 / 3 = 2.6667.
  2. ROUNDUP rounds 2.6667 away from zero to 3. Months 7, 8 and 9 all give 3, and month 10 gives 4, so the result is the number of the quarter.
  3. CHOOSE takes position 3 from its four values and returns D2:D5, the Q3 column. It returns the range itself, not a single number: it counts the arguments and never reads the cells.
  4. SUM adds the cells of D2:D5: 455,900455.900 + 140,200140.200 + 99,55099.550 + 81,30081.300 = 776,950776.950.
  5. Change H1 to 11. 11 / 3 = 3.6667, ROUNDUP gives 4, CHOOSE returns E2:E5 and the total becomes 862,400862.400.

Watch out: Use INT instead of ROUNDUP and most months land in the wrong quarter: INT(8 / 3) is 2, so August is totaled as Q2. Months 1 and 2 give position 0 and #VALUE!.

More on this example: why it works, 2 more pitfalls, 1 variation

Why it works

CHOOSE can return a reference, so what comes out of it is a live range that SUM can work on. ROUNDUP turns the month into a quarter number because a part of a quarter belongs to the whole quarter, and it never produces 0 for months 1 to 12.

Watch out for

  • Use INT instead of ROUNDUP and most months land in the wrong quarter: INT(8 / 3) is 2, so August is totaled as Q2. Months 1 and 2 give position 0 and #VALUE!.

    ROUND fails too: INT and ROUND both break on a month such as 7 or 10. Always test with the first and the middle month of a quarter.

  • Month 0 or month 13 gives position 0 or 5, and CHOOSE returns #VALUE!. Limit the input with data validation to whole numbers from 1 to 12.

Variations

=SUM(INDEX(B2:E5, 0, ROUNDUP(H1 / 3, 0)))
=SUM(INDEX(B2:E5; 0; ROUNDUP(H1 / 3; 0)))

INDEX with row_num 0 returns a whole column of the block. Prefer it when there are more columns than you want to list one by one in CHOOSE.

MasterExcel 2021 or later (This example needs Excel 2021 or later)

Aging buckets from a day count, without a band table

For the aging analysis of the debtors you place every open invoice in a bucket:

  • not yet due
  • 1 to 30 days overdue
  • 31 to 60 days overdue
  • 61 to 90 days overdue
  • over 90 days overdue

The buckets are 30 days wide, so you can compute the bucket number from the day count and let CHOOSE pick the label. That avoids a separate band table, and the formula has to be correct at the edges: day 30, day 31, day 90 and day 91.

Sheet excerpt: D2 holds the formula
RowABCDEFG
1Invoice no.Due dateOpen amountBucketBalance sheet date31 Dec 2025
2F-25-039117 Oct 2025€18,400.00€ 18.400,0061 to 90 days=LET( days, $F$1 - B2, position, MIN(5, MAX(1, (days - 1) / 30 + 2)), CHOOSE(position, "Not yet due", "1 to 30 days", "31 to 60 days", "61 to 90 days", "Over 90 days") )=LET( days; $F$1 - B2; position; MIN(5; MAX(1; (days - 1) / 30 + 2)); CHOOSE(position; "Not yet due"; "1 to 30 days"; "31 to 60 days"; "61 to 90 days"; "Over 90 days") )
3F-25-039220 Dec 2025€4,235.50€ 4.235,50
4F-26-000315 Jan 2026€8,750.00€ 8.750,00
5F-25-02952 Jul 2025€3,025.00€ 3.025,00
6
Formula cell (D2)Input

Formula in D2

=LET(
  days, $F$1 - B2,
  position, MIN(5, MAX(1, (days - 1) / 30 + 2)),
  CHOOSE(position, "Not yet due", "1 to 30 days", "31 to 60 days", "61 to 90 days", "Over 90 days")
)
=LET(
  days; $F$1 - B2;
  position; MIN(5; MAX(1; (days - 1) / 30 + 2));
  CHOOSE(position; "Not yet due"; "1 to 30 days"; "31 to 60 days"; "61 to 90 days"; "Over 90 days")
)

Result: 61 to 90 days

Step by step
  1. days is the balance sheet date minus the due date. Dates are serial numbers, so 31 Dec 2025 - 17 Oct 2025 = 75 days overdue.
  2. position is (75 - 1) / 30 + 2 = 4.4667. Day 1 to day 30 give a value from 2 up to 2.9667, day 31 to day 60 from 3 up to 3.9667, and so on, so the whole part is the bucket number.
  3. MAX(1, ...) keeps the number from dropping below 1 for invoices not yet due, and MIN(5, ...) caps it at 5 for anything older than 90 days. 4.4667 passes both unchanged.
  4. CHOOSE cuts 4.4667 off to 4 and returns the fourth label: 61 to 90 days. It does not round, which is what the formula relies on.
  5. The edges work:

    • 90 days gives 89 / 30 + 2 = 4.9667, which is bucket 4
    • 91 days gives 90 / 30 + 2 = 5, bucket 5
    • 30 days gives 2.9667, bucket 2
    • 31 days gives 3, bucket 3
  6. Fill the formula down. D4 is due on 15 Jan 2026, so days = -15 and position = -16 / 30 + 2 = 1.4667, which gives Not yet due. D5 is 182 days late: 181 / 30 + 2 = 8.03, capped at 5 by MIN, so Over 90 days.

Watch out: The mirror-image mistake: wrapping the position in ROUND to make it a whole number. It looks careful, but 76 days gives 4.5, ROUND turns that into 5, and an invoice 76 days late is reported as Over 90 days. Let CHOOSE cut it off.

More on this example: why it works, 2 more pitfalls, 1 variation

Why it works

CHOOSE cuts a fractional index off instead of rounding it, so a continuous value such as 4.4667 falls into exactly one bucket. LET names the day count and the position, so the final line reads like the aging rule.

Do not use this construction when the bands are uneven (0, 30, 60, 120, 365) or maintained by the client: put the bands in a table and use XLOOKUP with match_mode -1, as in the XLOOKUP page, so the band edges are visible cells.

More to watch out for

  • Without MAX(1, ...), an invoice due 60 days from now gives -61 / 30 + 2 = -0.0333, CHOOSE cuts that to 0 and the cell shows #VALUE!. The error appears only when such an invoice exists.
  • Use TODAY() instead of a fixed balance sheet date and the buckets change every day. For a year-end analysis, type the balance sheet date in a cell.

Variations

=LET(
  days, $F$1 - B2,
  position, MIN(5, MAX(1, INT((days - 1) / 30) + 2)),
  CHOOSE(position, "Not yet due", "1 to 30 days", "31 to 60 days", "61 to 90 days", "Over 90 days")
)
=LET(
  days; $F$1 - B2;
  position; MIN(5; MAX(1; INT((days - 1) / 30) + 2));
  CHOOSE(position; "Not yet due"; "1 to 30 days"; "31 to 60 days"; "61 to 90 days"; "Over 90 days")
)

The same result with INT written out, for reviewers who do not want to rely on CHOOSE cutting off the decimals. INT rounds down, which differs from cutting off only for negative values; MAX(1, ...) clamps those to the first bucket anyway, so the result is identical.

Common mistakes

Common mistakes
SymptomCauseFix
#VALUE! when the index is 0The index is 0, or one more than the number of values, and the result is #VALUE!. People count from 0, but CHOOSE starts at 1.Check that the index can only take values from 1 to the number of values. Cap a calculated index with MIN and MAX.
The wrong item, with no errorYou expect a calculated index such as 2.9 to count as 3.Round on purpose before CHOOSE: ROUNDUP when a part of a step counts as a full step, ROUND for the nearest, INT or no rounding for cutting off.
Stored numbers point at the wrong itemsSomeone adds an item in the middle of the list. Every position after it moves up, and numbers stored elsewhere now point at the wrong items.Keep a list that changes in a table with a code column and look it up with XLOOKUP, so each item keeps its own key.