· Getting Started · 18 min read

5 Excel Functions Every Tax Preparer Should Know — With Real Workpaper Examples

SUMIFS, XLOOKUP, EOMONTH, IFERROR, and TEXT — five functions that replace the most common manual work in tax workpapers. Each one explained with a real tax scenario you'll recognize from your own engagements.

Share:

TL;DR: You know SUM. You know VLOOKUP. But you’re still doing things manually that Excel can do in one formula — rolling up trial balance categories, mapping accounts across years, computing period-end dates, wrapping errors so your workpaper doesn’t light up with #N/A, and formatting account codes that lose their leading zeros. These five functions each solve one of those problems. Learn them once, use them every day.

The Problem

You’re prepping the Henderson S-Corp return. The trial balance has 487 rows. You need to roll up revenue by department (three departments × one SUMIFS column), map 2025 account codes to 2026 codes (XLOOKUP), calculate MACRS mid-quarter convention dates (EOMONTH), wrap every lookup in IFERROR so the partner doesn’t reject the file for #N/A errors, and present account codes as five-digit strings with leading zeros so the ERP import doesn’t fail (TEXT).

Without these five functions, you’re doing each of these manually: filtering, copying, pasting, typing, squinting at date math. With them, you write the formula once and it handles every row, every year, every file. The difference is 45 minutes vs. 4 minutes — per engagement.

#How This Post Works

Each section covers one function:

  • The syntax — with a plain-English translation, not Microsoft documentation
  • A tax workpaper example — a specific scenario you’ll recognize
  • Common mistakes — the things that go wrong and how to fix them
  • When to use it vs. an alternative — because every function has trade-offs

These aren’t generic “Excel function guides.” They’re written for someone staring at a trial balance, a depreciation schedule, or an account mapping table — with a deadline.


#1. SUMIFS — Multi-Condition Summing

#The Syntax

=SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)

Plain English: “Add up everything in column D where column A equals X AND column B equals Y AND column C is greater than Z.”

SUMIFS is SUMIF with multiple conditions. The order matters: the first argument is the column you’re summing, then pairs of (range, criteria). You can chain as many condition pairs as you need.

#Tax Workpaper Example: Department-Level Trial Balance Roll-Up

You have a trial balance with columns A–D:

AccountDepartmentAccount NameCY Balance
40010AuditAudit Revenue$425,000
40020TaxTax Revenue$612,000
40030ConsultingConsulting Revenue$198,000
50010AuditSalaries-Audit$287,000
50020TaxSalaries-Tax$341,000
50030ConsultingSalaries-Consult$142,000

The partner wants a one-page summary: revenue and salaries by department. You could filter, copy, paste three times. Or:

Revenue by department:
=SUMIFS(D:D, B:B, "Audit", A:A, ">=40000", A:A, "<=49999")
=SUMIFS(D:D, B:B, "Tax", A:A, ">=40000", A:A, "<=49999")
=SUMIFS(D:D, B:B, "Consulting", A:A, ">=40000", A:A, "<=49999")

Now replace the department name with a cell reference ($F2 instead of "Audit") and you can drag the formula across all three departments. One formula, no filtering, no manual summing, no copy-paste mistakes.

Account-range trick: Instead of hard-coding >=40000 and <=49999, put a mapping table on a separate sheet:

DeptAcct StartAcct End
Audit4000049999
Tax5000059999
Consulting6000069999

Then your formula becomes:

=SUMIFS(D:D, B:B, $F2, A:A, ">="&G2, A:A, "<="&H2)

Now when the firm reorganizes account codes next year, you change the mapping table — not 47 formulas.

#Common Mistakes

Criteria order. =SUMIFS(D:D, "Audit", B:B) — wrong. The sum range comes first in SUMIFS (unlike SUMIF, where it comes last). If your formula returns zero and you know there’s data, swap the first argument.

Text vs. numbers. If your account codes are stored as text (left-aligned, green triangle), >=40000 won’t match them because Excel compares text alphabetically, not numerically. Convert text-numbers to actual numbers first (Text to Columns, or the Text-to-Numbers macro).

Blank criteria cells. If your criteria cell is blank, SUMIFS matches every row. This is useful for “show all departments” — leave the department cell blank. But it’s dangerous if you accidentally clear a criteria cell and suddenly your revenue roll-up includes tax, audit, consulting, and the mailroom budget.

#When to Use SUMIFS vs. PivotTable

SUMIFSPivotTable
Formula updates instantlyMust refresh manually
Survives row insertions (with Tables)Range can shrink after refresh
Auditable — you can trace precedentsHard to audit — “where did this number come from?”
One formula per cellOne PivotTable does it all
Gets unwieldy with 5+ criteriaHandles 5+ criteria easily

Rule of thumb: Use SUMIFS for dashboards and summary schedules that the partner will review. Use PivotTables for exploratory analysis. Most tax workpapers benefit from both — the PivotTable to find the pattern, the SUMIFS to lock it into the deliverable.


#2. XLOOKUP — The VLOOKUP Replacement You Should Have Switched to in 2020

#The Syntax

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

Plain English: “Find this value in column A. Give me what’s in the same row in column D. If you don’t find it, show this instead.”

XLOOKUP replaces VLOOKUP, HLOOKUP, and INDEX-MATCH in a single function. It looks left, right, up, or down — no column-index counting required. It handles errors with a built-in if_not_found argument instead of forcing you to wrap everything in IFERROR.

#Tax Workpaper Example: Account Code Mapping Across Years

Your firm changed the chart of accounts between 2025 and 2026. Account 40010 (“Audit Revenue”) became 41010 (“Professional Services — Audit”). You need to map every 2025 account to its 2026 equivalent for the carryforward schedule.

You have a mapping table:

Old CodeNew CodeOld NameNew Name
4001041010Audit RevenueProf Svcs-Audit
4002041020Tax RevenueProf Svcs-Tax
5001051010Salaries-AuditCompensation-Audit

VLOOKUP approach:

=VLOOKUP(A2, Mapping!A:D, 2, FALSE)

Problems: (1) the lookup column must be the first column in the range, (2) you count column numbers (which break when someone inserts a column in the mapping table), (3) if the account code isn’t found, you get #N/A and need to wrap in IFERROR.

XLOOKUP approach:

=XLOOKUP(A2, Mapping!A:A, Mapping!B:B, "Not mapped")

The lookup column (A) and return column (B) are separate — no column counting. The "Not mapped" argument handles missing accounts without a separate IFERROR wrapper. If someone inserts a column in the mapping table, the formula still works because it references specific columns, not an index number.

#Why Left-Lookup Matters for Tax Work

VLOOKUP can only look to the right — the return column must be to the right of the lookup column. XLOOKUP can look in any direction.

Tax scenario: you have a list of vendor EINs in column C and need the vendor name from column A. With VLOOKUP, you’d need to rearrange the columns or use INDEX-MATCH. With XLOOKUP:

=XLOOKUP(C2, C:C, A:A)

One formula. No column rearrangement. Works instantly.

#Common Mistakes

XLOOKUP returning the wrong row. This happens when lookup_array and return_array have different sizes. If lookup_array is A1:A100 but return_array is B1:B50, XLOOKUP matches row 60 in column A against row 60 in column B — which is empty. Always use whole-column references (A:A, B:B) or matched-size ranges.

Default match mode is exact match. Unlike VLOOKUP (where you must specify FALSE for exact match), XLOOKUP defaults to exact match. Omitting the match_mode argument works the way you expect. But if you want approximate match (for tiered tax rates, for example), set match_mode to -1 or 1.

Not available in older Excel. XLOOKUP requires Excel 2021 or Microsoft 365. If you’re sharing workbooks with preparers on Excel 2019 or earlier, use INDEX-MATCH instead — it works in every version since 2007.

#When to Use XLOOKUP vs. INDEX-MATCH

XLOOKUPINDEX-MATCH
Excel 2021+ / Microsoft 365All Excel versions
One function, simple syntaxTwo functions, more typing
Built-in if-not-foundMust wrap in IFERROR/IFNA
Cannot do two-way lookup (row + column)Two-way lookup with MATCH on both axes
Vertical OR horizontalVertical AND horizontal combined

Rule of thumb: If everyone at your firm is on Microsoft 365 or Excel 2021+, use XLOOKUP for all single-axis lookups. Keep INDEX-MATCH for two-way lookups (matrix-style tax rate tables, depreciation convention lookups). If your firm has mixed Excel versions, INDEX-MATCH is the safer choice.


#3. EOMONTH — Period-End Dates Without the Mental Math

#The Syntax

=EOMONTH(start_date, months)

Plain English: “Give me the last day of the month that’s X months after this date.”

months can be positive (future), negative (past), or zero (end of the current month). =EOMONTH("6/15/2026", 0) returns 6/30/2026. =EOMONTH("6/15/2026", 6) returns 12/31/2026. =EOMONTH("6/15/2026", -1) returns 5/31/2026.

#Tax Workpaper Example 1: MACRS Mid-Quarter Convention Dates

You’re building a fixed asset depreciation schedule. A machine was placed in service on March 12, 2026. Under MACRS mid-quarter convention (asset placed in service in Q1), depreciation starts at the midpoint of Q1 — February 15. But you need the period-end dates for each year’s depreciation calculation.

Instead of mentally calculating “March plus 9 months is December… no, wait, mid-quarter… February 15 plus…”:

FormulaResultWhat It Means
=EOMONTH(DATE(2026,2,15), 0)2/28/2026Year 1 through end of Q1
=EOMONTH(DATE(2026,2,15), 10)12/31/2026Year 1 through year-end
=EOMONTH(DATE(2026,2,15), 22)12/31/2027Year 2 through year-end
=EOMONTH(DATE(2026,2,15), 34)12/31/2028Year 3 through year-end

Each formula computes the exact number of months in the depreciation period without you touching a calendar. For a 50-asset schedule, this replaces 50 manual date calculations.

#Tax Workpaper Example 2: Accrual Cutoff Dates

A client’s fiscal year ends January 31. You need to accrue December revenue (for the FYE 1/31/2027 tax return) and test that accrual against January cash receipts.

December accrual period-end: =EOMONTH(DATE(2026,12,1), 0)  → 12/31/2026
Fiscal year-end:             =EOMONTH(DATE(2027,1,1), 0)  → 1/31/2027
Prior fiscal year-end:       =EOMONTH(DATE(2027,1,1), -12) → 1/31/2026

Now your accrual workpaper auto-generates all period-end dates from a single fiscal-year-end input. Change one cell (the FYE date), and every date in the workpaper updates.

#Tax Workpaper Example 3: Quarterly Estimate Due Dates

Estimated tax payment due dates follow a pattern: 4/15, 6/15, 9/15, 1/15 (following year). With EOMONTH, you can generate the full year from the calendar year:

QuarterFormulaDue Date
Q1=DATE(A1,4,15)4/15/2026
Q2=DATE(A1,6,15)6/15/2026
Q3=DATE(A1,9,15)9/15/2026
Q4=DATE(A1+1,1,15)1/15/2027

Where A1 contains the tax year (2026). Now the partner can change A1 and every estimate due date in the workpaper shifts to the new year.

#Common Mistakes

Forgetting that EOMONTH returns the END of the month. =EOMONTH("1/15/2026", 1) returns 2/28/2026, not 2/15/2026. If you need the same day of the month, use EDATE instead: =EDATE("1/15/2026", 1) returns 2/15/2026.

Using text dates instead of date serial numbers. =EOMONTH("January 15 2026", 0) works in most cases, but =EOMONTH(A2, 0) where A2 contains text (not a date value) returns #VALUE!. Always verify that your date column is formatted as Date, not Text.

Fiscal years that don’t align with calendar months. If a client’s fiscal year ends on a non-month-end date (e.g., the last Friday in January), EOMONTH won’t compute it directly. Use WORKDAY.INTL or a lookup table instead.


#4. IFERROR — Catch Errors Without Killing Your Workpaper

#The Syntax

=IFERROR(formula, value_if_error)

Plain English: “Try this formula. If it produces an error, show this instead. If it works, show the result.”

IFERROR wraps any formula and catches ALL errors: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, #NULL!. For better or worse — it catches everything.

#Tax Workpaper Example 1: Clean Lookups in a Summary Schedule

You have a trial balance with 487 rows and a summary schedule that pulls totals via XLOOKUP for 20 line items. Some line items don’t exist for this client (e.g., no Cost of Goods Sold for a service business). Without error handling, those cells show #N/A — and the partner won’t sign a workpaper with visible errors, even if they’re “expected.”

With IFERROR:

=IFERROR(XLOOKUP(A2, TB!A:A, TB!D:D), 0)

Line items with no TB entries show $0 instead of #N/A. The partner sees zeros where there’s no activity — which is correct. The workpaper looks clean because the output accurately represents the data: no entry = no balance.

#Tax Workpaper Example 2: Ratio Analysis with Potential Zero Denominators

You’re computing the debt-to-equity ratio for five related entities. One entity has negative equity (accumulated losses exceed contributed capital). Without error handling:

=C12/D12     → #DIV/0! (when D12 = 0)

With IFERROR:

=IFERROR(C12/D12, "N/M")

The cell shows “N/M” (not meaningful) instead of #DIV/0!. More importantly, it doesn’t break downstream formulas that reference this cell (a #DIV/0! cascades through every formula that depends on it).

#The IFERROR Trap (Read This Before You Wrap Everything)

IFERROR catches ALL errors. This is its strength and its danger.

Good use of IFERROR: Wrapping a VLOOKUP or XLOOKUP where you know the expected error is #N/A (value not found). You want to replace it with 0, "Not found", or "".

Bad use of IFERROR: Wrapping a formula that references another sheet and getting "" instead of #REF!. A #REF! means someone deleted the sheet your formula references. IFERROR hiding that #REF! means your workpaper shows "" (blank) where the number should be — and you’ll never know the data is missing.

The safe alternative: IFNA

=IFNA(XLOOKUP(A2, TB!A:A, TB!D:D), 0)

IFNA ONLY catches #N/A errors. If your XLOOKUP returns #REF! because the lookup array was deleted, IFNA lets that error through — which is what you want. You NEED to see #REF! errors. You DON’T need to see #N/A from missing lookups.

Rule of thumb: Use IFNA for lookup formulas. Use IFERROR for division (formulas that might legitimately divide by zero). Never use IFERROR to wrap an entire workpaper formula without understanding what errors it could produce.

#Common Mistakes

IFERROR(0/0, 0) hides data integrity issues. If your formula references a cell that contains #REF!, wrapping it in IFERROR doesn’t fix the #REF! — it hides it. The workpaper looks clean. The numbers are wrong. This is the #1 cause of “I don’t understand why the return doesn’t foot” during review.

Wrapping too much. =IFERROR(VLOOKUP(A2,Data!A:Z,3,FALSE)+VLOOKUP(A2,Data!A:Z,4,FALSE), 0) hides errors from BOTH lookups. If the first lookup fails and the second succeeds, you get zero instead of the second lookup’s result. Wrap EACH lookup individually:

=IFERROR(VLOOKUP(A2,Data!A:Z,3,FALSE),0) + IFERROR(VLOOKUP(A2,Data!A:Z,4,FALSE),0)

Now each lookup fails independently and you get the correct sum for the ones that succeed.


#5. TEXT — Format Numbers Without Changing Their Values

#The Syntax

=TEXT(value, format_text)

Plain English: “Take this number and show it with this format — as a text string, not a number.”

The format_text argument uses the same codes as Excel’s Format Cells dialog: "00000" = five digits with leading zeros, "$#,##0.00" = currency, "mm/dd/yyyy" = date, "0.0%" = percentage with one decimal.

#Tax Workpaper Example 1: Five-Digit Account Codes with Leading Zeros

Your ERP exports account codes as numbers. Account 04010 (a balance sheet account) exports as 4010 — Excel drops the leading zero because it treats the value as a number. When you upload the workpaper back to the ERP or use the account code as a lookup key, 4010 doesn’t match 04010.

=TEXT(A2, "00000")
  • 4010"04010"
  • 50010"50010"
  • 100"00100"

Now your account codes match the ERP and your lookups work. This is the difference between a VLOOKUP that returns #N/A on 40% of rows and one that works on 100%.

#Tax Workpaper Example 2: Date Labels for Period-Over-Period Headers

You have a column of dates (months) and need to create a header that reads “January 2026 vs. January 2025.”

="CY "&TEXT(A2, "mmmm yyyy")&" vs. PY "&TEXT(EDATE(A2,-12), "mmmm yyyy")

Result: "CY January 2026 vs. PY January 2025". Change A2 and the entire header updates — no manual text editing across 12 columns.

#Tax Workpaper Example 3: Formatted Amounts in Narrative Footnotes

The tax return requires a footnote: “The corporation recognized $247,500 of §179 expense on qualified improvement property placed in service during 2026.”

The $247,500 comes from cell C47 on the fixed asset schedule. You want the footnote to update when the number changes:

="The corporation recognized "&TEXT(C47,"$#,##0")&" of §179 expense on qualified improvement property placed in service during "&TEXT(A1,"yyyy")&"."

When C47 changes from $247,500 to $312,800, the footnote updates. When A1 changes from 2026 to 2027, the year updates. One linked footnote replaces manual text editing across a 40-page return.

#Tax Workpaper Example 4: Concatenating Account Code + Name for Unique Keys

You need a unique identifier for each TB row that combines the account code and department:

=TEXT(A2, "00000")&"-"&B2

Result: "04010-Audit", "50010-Consulting". This creates a key you can use for lookups, deduplication, and cross-referencing between sheets.

#Common Mistakes

TEXT converts numbers to text. After =TEXT(1234, "00000"), the cell contains the text string "01234", not the number 1234. If you reference this cell in a SUM formula, it returns zero because SUM ignores text. Use TEXT for display and key-building, not for cells you plan to sum or average.

Format codes are case-sensitive in some contexts. "MM/DD/YYYY" and "mm/dd/yyyy" both produce month/day/year, but "MMMM" produces “January” while "mmmm" also produces “January.” However, "DDDD" produces the full day name (“Monday”) while "dddd" does the same. In practice, case doesn’t matter for date formatting in Excel’s TEXT function, but "M" (month) and "m" (minute) conflict in time formatting — use "M" for month and "m" for minutes to avoid ambiguity.

Forgetting TEXT when building formula-driven strings. ="FYE "&A2 where A2 contains a date returns "FYE 45658" (the date serial number) instead of "FYE 1/31/2026". Always wrap dates in TEXT: ="FYE "&TEXT(A2,"m/d/yyyy").


#Putting Them Together: A Real Workpaper Dashboard

Here’s what the five functions look like in a single summary dashboard — the kind you’d build for the partner to review in 30 seconds instead of drilling into 487 TB rows.

FormulaFunctionWhat It Does
=SUMIFS(TB!D:D, TB!B:B, $A2, TB!A:A, ">=40000", TB!A:A, "<=49999")SUMIFSRolls up revenue by department
=XLOOKUP($A2, Mapping!A:A, Mapping!C:C, "New code needed")XLOOKUPMaps old account to new account name
=EOMONTH($B$1, 0)EOMONTHComputes period-end from a single date input
=IFNA(XLOOKUP($A2, PY!A:A, PY!D:D), 0)IFNARetrieves PY balance, returns zero if new account
=TEXT($A2, "00000")&"-"&$B2TEXTBuilds unique key for cross-referencing

Cell $B$1 contains the period-end date (12/31/2026). Cell $A2 contains the account code. Change B1 and every date-based formula updates. Drag the formulas down 100 rows and the dashboard covers every account in the TB. This is the difference between “I updated the workpaper” and “the workpaper updates itself.”

#Adapt It for Your Firm

Get the next macro in your inbox

One copy-paste-ready macro recipe every two weeks. No spam, no VBA theory — just automation that saves you time.

One macro recipe every two weeks. Unsubscribe anytime.

E

Excel Macro Guy

Excel enthusiast · married to an accountant

I love Excel. My wife is an accountant. Every busy season, I watch her wrestle with workpapers and think "a macro could do that in half a second." So I build them. She tests them on real client data. What survives gets published here.

More about me →