Essential functions
Each one has its own page — what it is, a live demo, common errors, and better alternatives.
Lookups & references
The modern lookup — find a value and return another, in any direction, with a clean not-found fallback.
=XLOOKUP("4100", Codes, Names, "Not found")The everyday lookup — find a value in the first column and return one to its right.
=VLOOKUP("4100", A2:B4, 2, FALSE)The classic two-step lookup — works left or right and across two dimensions.
=INDEX(Revenue, MATCH(A2, Month, 0))The two-way lookup — cross a row label and a column label to pull one cell.
=INDEX(B2:D4, MATCH("East", A2:A4, 0), MATCH("Q2", B1:D1, 0))The horizontal lookup — find a value in the top row and return one below it.
=HLOOKUP("Q2", A1:E3, 2, FALSE)The scenario switch. One cell flips a model between base, upside and downside.
=CHOOSE($B$1, 0.38, 0.41, 0.34) → the gross margin for the chosen scenarioBuilds a reference out of text — which is how one summary tab reads twelve monthly sheets.
=INDIRECT("'"&A5&"'!B12") → B12 from the sheet named in A5Rolling windows — last 3 months, trailing twelve — and it's in every model you'll inherit.
=SUM(OFFSET(A1, COUNT(A:A)-12, 0, 12, 1)) → the last twelve valuesExcel inserts it when you click a pivot cell. Everyone has met it; nobody chose it.
=GETPIVOTDATA("Amount", $A$3, "Dept", A12, "Month", B11)Logic & error handling
The workhorse of logic — return one thing when a test is true, another when it's false.
=IF(B2>=B3, "Hit target", "Missed")Return different results by condition — IFS avoids nested IFs.
=IFS(B2>0,"Profit", B2=0,"Breakeven", TRUE,"Loss")Turn errors into a clean fallback so a model doesn't break.
=IFERROR(A2/B2, 0)Match one value against a list of cases — cleaner than a stack of nested IFs.
=SWITCH(B2, 1,"Open", 2,"Paid", 3,"Void", "Unknown")Combine several conditions into one TRUE/FALSE — the logic that powers a real IF.
=IF(AND(B2>=650, C2>=50000), "Approve", "Review")Ask what kind of thing is in a cell — empty, a number, text, or an error.
=IF(ISNUMBER(B2), B2, 0)Catch only #N/A — so a missing lookup is handled but real errors still surface.
=IFNA(VLOOKUP(B2, Codes, 2, FALSE), "Not found")Text & cleanup
Pull characters off the start, the end, or the middle of a text string by position.
=LEFT("AA-1024-X", 2)Count the characters in a cell — the quiet workhorse behind validation and cleanup.
=LEN(A2)Locate where one piece of text sits inside another — the position to slice at.
=FIND("-", "AA-1024-X")Stitch pieces of text together — a full name, an address, a dynamic label.
=TEXTJOIN(", ", TRUE, A2:A6)Grab everything before a delimiter — first names, street numbers, the local part of an email.
=TEXTBEFORE("Jane Doe", " ")Grab everything after a delimiter — last names, email domains, the tail of a code.
=TEXTAFTER("Jane Doe", " ")Break one messy cell into clean columns — split an address or a full name in a single formula.
=TEXTSPLIT("123 Main St, Austin, TX", ", ")Strip stray spaces and junk characters so lookups match and lists de-duplicate.
=TRIM(" Jane Doe ")Fix inconsistent capitalization — turn jane DOE and ACME llc into clean, uniform case.
=PROPER("jane DOE")Find-and-replace inside a formula — standardize abbreviations and strip unwanted characters.
=SUBSTITUTE("123 Main St", "St", "Street")Numbers that arrive as text don't sum — and the total quietly reads zero.
=NUMBERVALUE("1.234,56", ",", ".") → 1234.56Excel's = ignores case. A reconciliation that treats INV-1 and inv-1 as the same can be quietly wrong.
=EXACT(A2, B2) → FALSE for "INV-1" vs "inv-1", where =A2=B2 says TRUESUBSTITUTE replaces what text says. REPLACE replaces where it sits.
=REPLACE("6100-200-01", 6, 3, "310") → "6100-310-01"In-cell bar charts: one formula turns a variance column into something you can read at a glance.
=REPT("█", ROUND(B2 / MAX($B$2:$B$20) * 20, 0)) → bars scaled to 20 charactersAggregation
Add up a range of numbers — the first function anyone learns and still the most-used.
=SUM(B2:B13)The arithmetic mean of a range — total ÷ count, with blanks left out.
=AVERAGE(B2:B13)Answer 'how many?' — numbers only, anything at all, or the empty ones.
=COUNTA(A2:A100)The smallest or largest number in a range — and a neat way to cap or floor a value.
=MAX(B2:B13)The 2nd, 3rd … nth smallest or largest — the top-N list MIN/MAX can't do.
=LARGE(B2:B13, 2)Sum amounts that match several conditions — the workhorse of P&L roll-ups.
=SUMIFS(Amount, Account, "Revenue", Month, $B$1)Count rows that meet multiple conditions.
=COUNTIFS(Status, "Open", Days, ">30")Average the values that match several conditions — the mean sibling of SUMIFS.
=AVERAGEIFS(Amount, Stage, "Won")The smallest or largest value that meets your conditions.
=MAXIFS(Balance, Customer, "Acme", Status, "Open")Totals that carry on past an #N/A instead of letting one error poison the report.
=AGGREGATE(9, 6, C2:C200) → SUM, skipping error valuesCustomer concentration, top-N lists and ABC analysis — and ties are where it trips.
=RANK.EQ(B2, $B$2:$B$40) → 1 for the biggest customerAverage deal size gets dragged around by one whale. The median describes the business.
=MEDIAN(C2:C200) → the middle deal, ignoring how big the biggest wasPuts a number on how lumpy revenue is — the difference between a bad month and a signal.
=STDEV.S(B2:B13) → how much a typical month variesMultiply arrays element-by-element, then sum — weighted averages and conditional math.
=SUMPRODUCT(Units, Price) / SUM(Units)Aggregate only the visible (filtered) rows, ignoring other subtotals.
=SUBTOTAL(9, D2:D500)Math & rounding
Round a number to a set number of digits — control the pennies before they compound.
=ROUND(B2, 2)Three small math tools that punch above their weight — magnitude, whole part, remainder.
=ABS(B2 - C2)Round to a multiple — price points, pack sizes, round thousands — not to decimal places.
=CEILING.MATH(C2, 12) → 38 units becomes 48, four full packsDates
The current date (or date-and-time) that updates itself every time the sheet recalcs.
=TODAY() - B2Build a real date from three numbers, or pull the year, month, or day back out.
=DATE(2026, 3, 15)The last day of a month N months out — clean period-end dates.
=EOMONTH(TODAY(), 0)The same day, N months out — clean anniversary, renewal, and due dates.
=EDATE(B2, 12)Format a number or date as text — for labels and headers.
="Cash: " & TEXT(B2, "$#,##0")Count working days between two dates — the unit aging, SLAs and close calendars are actually measured in.
=NETWORKDAYS("2026-09-01", "2026-09-30", Holidays)Land a due date on a day someone can actually pay — terms counted in working days, not calendar ones.
=WORKDAY("2026-09-15", 30, Holidays) → net-30 on a working dayThe fraction of a year between two dates — and the basis argument that quietly changes every accrual.
=YEARFRAC("2026-01-15", "2026-04-30", 2) → actual/360, as most bank debt is writtenWhole months and years between two dates — the function Excel hides and never autocompletes.
=DATEDIF(InvoiceDate, TODAY(), "m") & " months old"Two day counts that disagree on purpose — and DSO changes depending on which you use.
=DAYS(TODAY(), InvoiceDate) → calendar days an invoice has been outstandingEvery export arrives with dates as text. This is how they become dates again.
=DATEVALUE("2026-04-03") → the serial number for 3 April 2026Cash timing is a day-of-week question — a Friday payment run clears differently to a Tuesday one.
=WEEKDAY(DueDate, 2) > 5 → TRUE when the due date is a weekendDynamic arrays (Microsoft 365)
Return the rows that meet a condition as a live, spilling result.
=FILTER(GL, Account="Revenue", "None")Spill a distinct list — perfect for dropdowns and clean lists.
=SORT(UNIQUE(Account))Spill a range into sorted order — live, with no manual re-sort.
=SORT(A2:B10, 2, -1)Pile ranges on top of each other into one tall list — combine tabs or blocks before you filter or total.
=VSTACK(Jan!A2:C50, Feb!A2:C50, Mar!A2:C50)Set ranges side by side into one wider block — glue separate columns into a single table.
=HSTACK(Months, Actuals, Budget)The period headers every model starts with, as one formula that stretches.
=EOMONTH(Start, SEQUENCE(1, 12, 0)) → twelve month-end dates acrossA pivot table as a formula — so it refreshes without anyone remembering to refresh it.
=PIVOTBY(Dept, Month, Amount, SUM) → departments down, months acrossTop ten customers, or everything except the header row, without hardcoding a range.
=TAKE(SORT(A2:B200, 2, -1), 10) → the ten biggest, always currentPull specific columns out of an export, in the order your template wants them.
=CHOOSECOLS(Export, 3, 1, 7, -1) → four columns, in your order, last one includedRun a calculation down every row at once — no helper column.
=BYROW(B2:M40, LAMBDA(r, MAX(r))) → each account's best monthSCAN is a running balance in one formula — which is the cash-forecast shape exactly.
=SCAN(Opening, Movements, LAMBDA(acc, v, acc + v)) → the running balanceName a value or calculation once, then reuse it — faster formulas that read like plain English.
=LET(rev, B2, cogs, B3, gp, rev - cogs, gp / rev)Build your own reusable function — no VBA — then name it and call it like any built-in.
=LAMBDA(rev, cogs, (rev - cogs) / rev)(B2, C2)Finance
NPV and IRR for cash flows on real, irregular dates.
=XNPV(0.1, Flows, Dates)Build a full loan payoff schedule — principal vs. interest, month by month.
=IPMT(9%/12, 1, 60, -150000) → the first month's interestSpread an asset's cost over its life — build an asset register and schedule.
=SLN(45000, 5000, 5) → $8,000 of straight-line depreciation a yearFixed-declining-balance depreciation — accelerated, at a single rate Excel works out for you.
=DB(45000, 5000, 5, 1) → the first year's depreciationVariable-declining balance — accelerated depreciation that switches to straight-line so nothing is stranded.
=VDB(45000, 5000, 5, 0, 1) → the first year's depreciationValue an evenly-spaced stream of cash and get its return — with the off-by-one that catches nearly everyone.
=A2 + NPV(10%, B2:F2) → today's outlay in A2, periods 1-5 in B2:F2Split a loan payment into the interest half that hits the P&L and the principal half that pays the balance down.
=IPMT(6%/12, 1, 60, 150000) → the interest inside payment number 1The two ends of time value: what a stream is worth today, and what a balance grows into.
=PV(8%/12, 36, -500) → what 36 monthly payments of $500 are worth todayBack the interest rate out of a deal you've already been quoted — the honest way to compare financing.
=RATE(36, -500, 15000) * 12 → the annual rate behind a 36-month planHow many payments until this is paid off — the runway question, in loan form.
=NPER(9%/12, -1200, 45000) → months to clear $45,000 at $1,200 a monthTotal the interest and principal across a range of periods — how interest expense actually gets budgeted.
=CUMIPMT(6%/12, 60, 150000, 13, 24, 0) → interest paid in year twoConvert a quoted rate into the one you actually pay, and find out what an early-payment discount really costs.
=EFFECT(12%, 12) → 12.68%, the real cost of 12% compounded monthlyIRR's honest cousin — the return when you say what you'd really earn on the cash coming back.
=MIRR(A2:F2, 8%, 3%) → borrowed at 8%, proceeds earning 3%Learn the moves here — or let Wauvel run them on your numbers.
$99/mo, everything included. Free for 14 days, no card.
One CFO-grade Excel tip a week
A short, practical email for finance operators — functions, shortcuts, and the moves that save an afternoon. Free, unsubscribe anytime.