Available in:Excel 2019 or later (Works in Excel 2019, every later version, Microsoft 365 and Excel for the web)Examples need Excel 2021 or laterCategory:Logical

IFS

ALS.VOORWAARDEN in Dutch Excel

Tests conditions one after another and returns the value that belongs to the first condition that is TRUE.

Difficulty rating 3 of 5. The pairs read cleanly, but the order of the conditions decides the result, and a missing catch-all gives #N/A.

Last updated: 13 October 2026

See the worked examples

Sheet excerpt: D2 holds the formula
RowABCD
1ControlDeviation rateConclusion
2Credit note authorization8%8%Extend sample=IFS(B2<=0.05, "Rely on control", B2<=0.1, "Extend sample", B2>0.1, "Do not rely")=IFS(B2<=0,05; "Rely on control"; B2<=0,1; "Extend sample"; B2>0,1; "Do not rely")
3Purchase order approval2%2%
4Goods receipt matching5%5%
5Payroll changes review10%10%
6Bank reconciliation review14%14%
Formula cell (D2)Input

Result: Extend sample

=IFS(B2<=0.05, "Rely on control", B2<=0.1, "Extend sample", B2>0.1, "Do not rely")
=IFS(B2<=0,05; "Rely on control"; B2<=0,1; "Extend sample"; B2>0,1; "Do not rely")

What IFS does and when to use it

What it does: it works through condition and value pairs and returns the value of the first condition that is TRUE, for example a conclusion per deviation rate in a control test.

When to use it: when one cell has three or more outcomes, each with its own test: materiality bands, risk classes, aging labels. It replaces nested IFs. For many bands, or bands that change, a table of limits with XLOOKUP is better.

Two main gains:

  • No nesting: the pairs stand side by side, with no extra layer and closing bracket for every outcome.
  • Rules in reading order: a reviewer reads the conditions in the order in which they apply.

How Excel evaluates it

Excel works down the list of pairs:

  • it evaluates logical_test1; if that is TRUE, Excel returns value_if_true1 and stops: later pairs do not influence the result
  • if it is FALSE, Excel moves to logical_test2, and so on down the list
  • when every condition is FALSE, there is nothing to return and the cell shows #N/A

That is why a last pair with the condition TRUE is the standard catch-all: TRUE is always TRUE, so it catches everything the earlier conditions let through.

Watch out: The first TRUE condition wins, so the order of the pairs is part of the logic. With the wrong order no error appears: the cell shows the wrong label.

Mental model

Think of a sieve stack with the coarsest mesh on top: a value falls through each layer until it meets the first layer that holds it. Put the fine mesh on top and everything stops there.

Terms used on this page: cell

IFS(logical_test1, value_if_true1, [logical_test2, value_if_true2], ...)
IFS(logical_test1; value_if_true1; [logical_test2; value_if_true2]; ...)
Arguments
ArgumentTypeMeaning
logical_test1RequiredThe first condition; it must come out as TRUE or FALSE.
value_if_true1RequiredWhat the cell shows when the first condition is TRUE.
logical_test2OptionalThe next condition, tested only when all earlier ones are FALSE.
value_if_true2OptionalWhat the cell shows when the second condition is the first TRUE one.

Return value:The value_if_true of the first TRUE condition, or #N/A if none is TRUE

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

Classify control test results by deviation rate

You have tested five controls at Veldhuis Installatie BV and noted the deviation rate per control. The audit approach says:

  • up to and including 5%: you rely on the control
  • above 5% up to and including 10%: you extend the sample
  • above 10%: you do not rely on it

You want one formula that gives each control its conclusion.

Sheet excerpt: D2 holds the formula
RowABCDE
1ControlDeviation rateConclusion
2Credit note authorization8%8%Extend sample=IFS(B2<=0.05, "Rely on control", B2<=0.1, "Extend sample", B2>0.1, "Do not rely")=IFS(B2<=0,05; "Rely on control"; B2<=0,1; "Extend sample"; B2>0,1; "Do not rely")
3Purchase order approval2%2%
4Goods receipt matching5%5%
5Payroll changes review10%10%
6Bank reconciliation review14%14%
7
Formula cell (D2)Input

Formula in D2

=IFS(B2<=0.05, "Rely on control", B2<=0.1, "Extend sample", B2>0.1, "Do not rely")
=IFS(B2<=0,05; "Rely on control"; B2<=0,1; "Extend sample"; B2>0,1; "Do not rely")

Result: Extend sample

Step by step
  1. In B2 the deviation rate is 8%. That is the number every condition compares.
  2. The first pair is tested: B2<=0.05 means 8% <= 5%, which is FALSE. Excel skips Rely on control and moves on.
  3. The second pair is tested: B2<=0.1 means 8% <= 10%, which is TRUE. Excel returns the value of this pair, Extend sample.
  4. The third pair is never reached for this row, because the first TRUE condition decides.
  5. Copy the formula down. B4 holds exactly 5%: B4<=0.05 is TRUE, so Rely on control. B6 holds 14%: the first two conditions are FALSE, the third (14% > 10%) is TRUE, so Do not rely.

Watch out: Delete the third pair and row 6 (14%) shows #N/A: no condition is TRUE, so there is nothing to return. The Intermediate example shows a catch-all that rules this out.

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

Why it works

The three conditions together cover every possible rate: up to 5%, above 5% up to 10%, and above 10%. Writing the limits with <= makes a rate of exactly 5% or 10% fall into the lower class, which is what the audit approach states.

More to watch out for

  • Put B2<=0.1 first and the 2% control is labeled Extend sample, because 2% is also at most 10% and the first TRUE wins.

Variations

=IFS(B2<=0.05, "Rely on control", B2<=0.1, "Extend sample", TRUE, "Do not rely")
=IFS(B2<=0,05; "Rely on control"; B2<=0,1; "Extend sample"; TRUE; "Do not rely")

Use TRUE as the last condition when the last class is whatever remains; you then no longer need to write the limit twice.

Intermediate

Classify unadjusted differences against the materiality limits

On the summary of unadjusted differences for Veldhuis Installatie BV you list five items. A negative amount means the ledger is lower than it should be. In this example the firm's approach is, by size of the difference:

  • from overall materiality (F1) upward: needs an adjustment
  • from performance materiality (F2) upward: is discussed with management
  • from the clearly inconsequential threshold (F3) upward: goes on the summary
  • anything below that: is clearly inconsequential

Every misstatement above the clearly inconsequential threshold is communicated with a request to correct it; the tiers here only set how it is followed up. The size counts, not the sign.

Sheet excerpt: C2 holds the formula
RowABCDEFG
1ItemDifferenceTreatmentOverall materiality€120,000.00€ 120.000,00
2Inventory valuation-€88,000.00€ -88.000,00Discuss with management=IFS(ABS(B2)>=$F$1, "Request adjustment", ABS(B2)>=$F$2, "Discuss with management", ABS(B2)>=$F$3, "Record on summary", TRUE, "Clearly inconsequential")=IFS(ABS(B2)>=$F$1; "Request adjustment"; ABS(B2)>=$F$2; "Discuss with management"; ABS(B2)>=$F$3; "Record on summary"; TRUE; "Clearly inconsequential")Performance materiality€84,000.00€ 84.000,00
3Cut-off December sales€135,000.00€ 135.000,00Clearly inconsequential threshold€6,000.00€ 6.000,00
4Prepaid insurance€12,400.00€ 12.400,00
5Accrued energy costs-€4,200.00€ -4.200,00
6Unprocessed bank charges€6,000.00€ 6.000,00
7
Formula cell (C2)InputNote: The limits sit in F1:F3 so the formula can refer to them and a change of materiality needs no formula edit.

Formula in C2

=IFS(ABS(B2)>=$F$1, "Request adjustment", ABS(B2)>=$F$2, "Discuss with management", ABS(B2)>=$F$3, "Record on summary", TRUE, "Clearly inconsequential")
=IFS(ABS(B2)>=$F$1; "Request adjustment"; ABS(B2)>=$F$2; "Discuss with management"; ABS(B2)>=$F$3; "Record on summary"; TRUE; "Clearly inconsequential")

Result: Discuss with management

Step by step
  1. B2 holds -88,00088.000. ABS removes the sign, so every condition works with 88,00088.000.
  2. Pair 1: 88,00088.000 >= $F$1 (120,000120.000) is FALSE, so the item is not at overall materiality.
  3. Pair 2: 88,00088.000 >= $F$2 (84,00084.000) is TRUE. Excel returns Discuss with management and stops here.
  4. Copied down to C5 (-4,2004.200): 4,2004.200 is below 120,000120.000, below 84,00084.000 and below 6,0006.000, so pairs 1 to 3 are all FALSE. The fourth pair has TRUE as its condition and returns Clearly inconsequential.
  5. C6 holds exactly 6,0006.000: 6,0006.000 >= $F$3 is TRUE because of >=, so the item goes on the summary.
  6. The limits run from high to low. In row 3 (135,000135.000) pair 1 is already TRUE. Swap the order and 135,000135.000 would meet the clearly inconsequential threshold first and be recorded on the summary, never marked for adjustment.

Watch out: Leave out ABS and every negative difference falls through to the catch-all, because -88,00088.000 is not >= 120,000120.000, 84,00084.000 or 6,0006.000. The cell shows no error: Clearly inconsequential looks plausible, which makes this the dangerous mistake.

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

Why it works

Each condition is a lower limit, so a larger difference also satisfies the lower limits. The formula is only correct because the largest limit is tested first. The final TRUE pair turns the 'no match' case into a stated outcome instead of #N/A.

More to watch out for

  • Without the $ signs the limits move when you copy the formula down, and row 3 compares with F2, F3 and F4.

Variations

=LET(size, ABS(B2), IFS(size>=$F$1, "Request adjustment", size>=$F$2, "Discuss with management", size>=$F$3, "Record on summary", TRUE, "Clearly inconsequential"))
=LET(size; ABS(B2); IFS(size>=$F$1; "Request adjustment"; size>=$F$2; "Discuss with management"; size>=$F$3; "Record on summary"; TRUE; "Clearly inconsequential"))

Prefer this when you want to read the formula as size compared with limits; ABS is then written once instead of three times.

Advanced

Test purchase invoices for cut-off at the balance sheet date

At Veldhuis Installatie BV you test whether purchase invoices around 31 December 2025 sit in the right year. The invoice date shows when the cost was booked, the delivery date shows when the goods came in. Three cases matter:

  • a missing delivery date cannot be judged and must be requested
  • delivery on or before the balance sheet date but invoice dated after it: a liability is missing
  • delivery after the balance sheet date but invoice dated on or before it: the cost is booked too early
Sheet excerpt: D2 holds the formula
RowABCDEFG
1InvoiceInvoice dateDelivery dateCut-off resultBalance sheet date31 Dec 2025
2PI-71018 Jan 202629 Dec 2025Liability missing: cost belongs to 2025=IFS(C2="", "Delivery date missing", AND(C2<=$F$1, B2>$F$1), "Liability missing: cost belongs to 2025", AND(C2>$F$1, B2<=$F$1), "Booked too early: delivery in 2026", TRUE, "Correct period")=IFS(C2=""; "Delivery date missing"; AND(C2<=$F$1; B2>$F$1); "Liability missing: cost belongs to 2025"; AND(C2>$F$1; B2<=$F$1); "Booked too early: delivery in 2026"; TRUE; "Correct period")
3PI-710230 Dec 20255 Jan 2026
4PI-710315 Dec 202514 Dec 2025
5PI-710412 Jan 202610 Jan 2026
6PI-710528 Dec 2025
7
Formula cell (D2)InputNote: The delivery date of PI-7105 is deliberately empty. The dates are real date values in Excel, so enter them as dates when you rebuild the sheet.

Formula in D2

=IFS(C2="", "Delivery date missing", AND(C2<=$F$1, B2>$F$1), "Liability missing: cost belongs to 2025", AND(C2>$F$1, B2<=$F$1), "Booked too early: delivery in 2026", TRUE, "Correct period")
=IFS(C2=""; "Delivery date missing"; AND(C2<=$F$1; B2>$F$1); "Liability missing: cost belongs to 2025"; AND(C2>$F$1; B2<=$F$1); "Booked too early: delivery in 2026"; TRUE; "Correct period")

Result: Liability missing: cost belongs to 2025

Step by step
  1. Pair 1, the empty-cell check: C2 holds 29 Dec 2025, so C2="" is FALSE. Excel moves on.
  2. Pair 2, inner part first. C2<=$F$1: 29 Dec 2025 <= 31 Dec 2025 is TRUE. B2>$F$1: 8 Jan 2026 > 31 Dec 2025 is TRUE. AND of two TRUE values is TRUE.
  3. The condition is TRUE, so the result is Liability missing: cost belongs to 2025. Goods arrived in December, the invoice was booked in January.
  4. Row 3 (PI-7102): the delivery date 5 Jan 2026 fails C3<=$F$1, so AND in pair 2 is FALSE. In pair 3, C3>$F$1 is TRUE and B3<=$F$1 (30 Dec 2025) is TRUE: Booked too early.
  5. Row 6 (PI-7105) has an empty C6, so pair 1 is TRUE and the result is Delivery date missing. The date conditions are never looked at.
  6. Rows 4 and 5 (PI-7103, PI-7104) have both dates in the same year. Pairs 2 and 3 are FALSE and the TRUE catch-all returns Correct period.

Watch out: Move the empty-cell check to the end and PI-7105 is shown as Correct period without any error: the empty C6 is read as the date 0, which is before 31 Dec 2025, so neither date condition catches it and the TRUE pair does. The test says an invoice is fine when you have not seen the delivery date.

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

Why it works

Each pair describes one way a purchase can be in the wrong period, and AND lets a pair check two dates at once. The TRUE pair at the end turns the remaining cases into Correct period on purpose. The blank check comes first because an empty cell would otherwise be read as the date 0.

More to watch out for

  • If dates were imported as text, Excel treats text as larger than any number, so C2>$F$1 is TRUE for every row. Every row with a delivery date then reads Correct period, with no error. Check the columns with ISNUMBER before you trust the labels.

Variations

=IFS(C2="", "Delivery date missing", (C2<=$F$1)<>(B2<=$F$1), IF(C2<=$F$1, "Liability missing: cost belongs to 2025", "Booked too early: delivery in 2026"), TRUE, "Correct period")
=IFS(C2=""; "Delivery date missing"; (C2<=$F$1)<>(B2<=$F$1); IF(C2<=$F$1; "Liability missing: cost belongs to 2025"; "Booked too early: delivery in 2026"); TRUE; "Correct period")

Shorter: one condition asks whether the two dates fall on different sides of the balance sheet date, and an IF inside picks the direction. Prefer the long version when a reviewer must read each rule on its own.

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

Classify all journal entries by risk in one spilling formula

In the journal entry testing at Veldhuis Installatie BV you rank seven manual entries by risk:

  • Critical: an entry without approval, whatever its size
  • High: posted on a weekend and at or above performance materiality (G2)
  • Medium: posted on a weekend or at or above performance materiality, but not both
  • Low: everything else

You want a single formula in E2 that classifies all seven entries and whose rules the reviewer can read.

Sheet excerpt: E2 holds the formula
RowABCDEFGHIJK
1EntryAmountPosted on weekendApprovedRisk classPerformance materialityLower limitClass
2JE-0412€125,000.00€ 125.000,00TRUETRUEHigh=LET( amount, B2:B8, weekend, C2:C8, approved, D2:D8, pm, $G$2, IFS( NOT(approved), "Critical", weekend * (amount >= pm) > 0, "High", weekend + (amount >= pm) > 0, "Medium", TRUE, "Low" ) )=LET( amount; B2:B8; weekend; C2:C8; approved; D2:D8; pm; $G$2; IFS( NOT(approved); "Critical"; weekend * (amount >= pm) > 0; "High"; weekend + (amount >= pm) > 0; "Medium"; TRUE; "Low" ) )€84,000.00€ 84.000,00€0.00€ 0,00Low
3JE-0413€9,500.00€ 9.500,00FALSETRUELow€25,000.00€ 25.000,00Medium
4JE-0419€3,200.00€ 3.200,00TRUETRUEMedium€84,000.00€ 84.000,00High
5JE-0420€91,000.00€ 91.000,00FALSETRUEMedium
6JE-0431€15,000.00€ 15.000,00FALSEFALSECritical
7JE-0432€84,000.00€ 84.000,00FALSETRUEMedium
8JE-0440€640.00€ 640,00TRUEFALSECritical
9
Formula cell (E2)InputSpilled resultNote: The small table in I2:J4 belongs to the XLOOKUP variation. The formula in E2 spills down to E8, so E3:E8 must stay empty.

Formula in E2

=LET(
  amount, B2:B8,
  weekend, C2:C8,
  approved, D2:D8,
  pm, $G$2,
  IFS(
    NOT(approved), "Critical",
    weekend * (amount >= pm) > 0, "High",
    weekend + (amount >= pm) > 0, "Medium",
    TRUE, "Low"
  )
)
=LET(
  amount; B2:B8;
  weekend; C2:C8;
  approved; D2:D8;
  pm; $G$2;
  IFS(
    NOT(approved); "Critical";
    weekend * (amount >= pm) > 0; "High";
    weekend + (amount >= pm) > 0; "Medium";
    TRUE; "Low"
  )
)

Result: High / Low / Medium / Medium / Critical / Medium / CriticalHigh / Low / Medium / Medium / Critical / Medium / Critical

Step by step
  1. LET stores four names. amount, weekend and approved each hold seven values (B2:B8, C2:C8, D2:D8); pm holds 84,00084.000 from G2.
  2. Condition 1, NOT(approved), is a list of seven TRUE/FALSE values: FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE. Entries JE-0431 and JE-0440 are not approved.
  3. Condition 2: amount >= pm gives TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE. Multiplied by weekend (TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE) the products are 1, 0, 0, 0, 0, 0, 0, and > 0 leaves only the first entry TRUE.
  4. Condition 3: adding the same two lists gives 2, 0, 1, 1, 0, 1, 1, so > 0 is TRUE when at least one of the two applies: entries 1, 3, 4, 6 and 7.
  5. For each position IFS takes the first TRUE condition. JE-0412: condition 1 FALSE, condition 2 TRUE, so High. JE-0413: only the TRUE pair applies, so Low. JE-0419 and JE-0420: condition 3, so Medium.
  6. JE-0431 and JE-0440 meet condition 1 and return Critical, even though JE-0440 also meets condition 3, because the approval test comes first. JE-0432 is exactly 84,00084.000, so >= makes it Medium.
  7. The seven results spill into E2:E8: High, Low, Medium, Medium, Critical, Medium, Critical. Change G2 to 100,000100.000 and JE-0420 (91,00091.000) drops to Low and JE-0412 stays High.

Watch out: Swap conditions 2 and 3 and JE-0412 (weekend and above materiality) becomes Medium instead of High without any error, because condition 3 is also TRUE for it. The most specific rule must come before the rule that includes it.

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

Why it works

The conditions ask different questions about different columns (approved, weekend, size), so a table of limits cannot express them; IFS can, and LET names make each rule readable. AND and OR would collapse the seven values into a single TRUE or FALSE, so the rules use * for AND and + for OR, which work on every position separately.

For many bands, or bands that change, a table of limits with XLOOKUP is better (see the variation, which is a different rule set). That table shows the limits on the sheet and lets you change them without touching the formula.

More to watch out for

  • In the XLOOKUP variation, match_mode 1 (next larger item) looks right but labels 9,5009.500 as Medium, because the next limit above it is 25,00025.000. For bands you need -1, the next smaller item.
  • LET and the spilled result need Excel 2021 or Microsoft 365; in Excel 2019 the formula shows #NAME?. IFS itself works from Excel 2019, so a version with one formula per row and no LET still runs there.
  • Text such as 'Yes' in the Approved column makes NOT(approved) give #VALUE!. Keep the column as real TRUE/FALSE values.

Variations

=XLOOKUP(B2:B8, $I$2:$I$4, $J$2:$J$4, "No class", -1)
=XLOOKUP(B2:B8; $I$2:$I$4; $J$2:$J$4; "No class"; -1)

This is a different rule set: only the amount counts, with Low below 25,00025.000, Medium from 25,00025.000 and High from 84,00084.000. For the seven entries it gives High, Low, Low, High, Low, High, Low, so it replaces the IFS only when approval and weekend do not matter; a new limit is a new table row.

Common mistakes

Common mistakes
SymptomCauseFix
#N/A on some rows, others fineThe cell shows #N/A for some rows while other rows are fine.No condition was TRUE for those rows. Add a final pair with TRUE as the condition and a fallback value, or widen the last condition so it covers the remaining cases.
Large values get a low-band labelLarge values get the label of a small band, for example 135,000 is labeled as a low band because the first condition is B2>=6000.With conditions of the form greater than or equal, put the highest limit first; with less than or equal, put the lowest first. Test the formula on the boundary values of every band.
Too few arguments, or #VALUE!Excel refuses the formula with a message about too few arguments, or the result is #VALUE!.Each condition needs its own value, so the argument count must be even. Check that every condition is a comparison that gives TRUE or FALSE, not a text such as a label.
#NAME? in Excel 2016The workbook shows #NAME? when a colleague with Excel 2016 opens it.IFS exists from Excel 2019. For a recipient with an older version, build the same logic with nested IF functions, or send the file with the values pasted.