Data Analysis

ARRAYFORMULA Function in Google Sheets: FP&A Guide (2026)

Marc SeanJuly 4, 20266 min read

The syntax is =ARRAYFORMULA(formula). Everything interesting - and everything dangerous - lives in knowing which functions respond to it and which ones quietly ignore it.

If you want the "why would I care" version, the existing piece at /blog/what-is-arrayformula-used-for covers that. This one is about how the function actually behaves, where it breaks, and which patterns hold up in real multi-tab models.

How ARRAYFORMULA Evaluates

When you reference a column range inside ARRAYFORMULA - say B2:B - it evaluates that formula once per row and spills results downward. =ARRAYFORMULA(C2:C * D2:D) multiplies every row's values simultaneously, not sequentially.

This matters for the calculation engine. A single ARRAYFORMULA cell registers as one dependency node. Ten thousand individual formulas in column E register as ten thousand. Google Sheets processes the former in a single pass.

According to Google's Sheets documentation (as of July 2026), ARRAYFORMULA is compatible with any function that accepts range inputs: IF, IFS, IFERROR, VLOOKUP, REGEXMATCH, LEN, TRIM, mathematical operators, and text concatenation. Functions that aggregate by design - SUMIFS, COUNTIFS, AVERAGEIFS - behave differently inside it, which is where most FP&A models run into trouble.

What Works and What Doesn't

FunctionWorks in ARRAYFORMULA?Notes
IF / IFSYesEvaluates per row as expected
IFERRORYesEssential - always wrap array lookups
VLOOKUPYesReturns one match per row
INDEX/MATCHPartialMATCH works; INDEX needs careful syntax
SUMIFSNo (as row-expander)Aggregates to a scalar regardless
COUNTIFSNo (as row-expander)Same limitation
TEXTYesUseful for formatting dates across columns
TRIM / CLEANYesGood for normalizing imported GL data
UNIQUE / SORTNoAlready array-aware; don't nest them
QUERYNoQUERY is its own array engine

The SUMIFS issue is the most common source of confusion. ARRAYFORMULA does not make SUMIFS expand row-by-row. It just runs one SUMIFS evaluation and returns a scalar. More on how to work around that below.

Multi-Tab Financial Patterns

Pattern 1: GL classification

You have 18,000 rows of GL entries on a Raw_GL tab. You want to tag each line with a cost category based on account code, pulling from a Chart_of_Accounts mapping tab.

=ARRAYFORMULA(
  IFERROR(
    VLOOKUP(Raw_GL!A2:A, Chart_of_Accounts!$A:$C, 3, FALSE),
    "Unmapped"
  )
)

One formula in Working!C2. When the GL export grows from 18k to 27k rows next month, the formula expands without you touching it.

Pattern 2: Seasonal revenue build

Your revenue model has 36 periods across columns. You need to apply a monthly seasonality index from an Assumptions tab to base revenue:

=ARRAYFORMULA(
  'Revenue_Build'!C4:AK4 * TRANSPOSE(Assumptions!$C$15:$C$50)
)

This works when dimensions align. ARRAYFORMULA is strict: mismatched array sizes return #VALUE!. If you're multiplying a 1x36 row against a 36x1 column, TRANSPOSE is mandatory.

Pattern 3: Actuals vs. budget variance

Budget on Budget tab, actuals on Actuals tab, both with department codes in column A. Variance % across all departments in one formula:

=ARRAYFORMULA(
  IFERROR(
    (VLOOKUP(A2:A, Actuals!$A:$B, 2, FALSE) -
     VLOOKUP(A2:A, Budget!$A:$B, 2, FALSE)) /
     ABS(VLOOKUP(A2:A, Budget!$A:$B, 2, FALSE)),
    "-"
  )
)

Returns variance % for every department in the lookup list. One formula, full column.

The SUMIFS Problem - 3 Real Solutions

You can't use ARRAYFORMULA to expand SUMIFS row-by-row. =ARRAYFORMULA(SUMIFS('P&L'!C:C, 'P&L'!B:B, A2:A50)) looks like it should work. It doesn't. SUMIFS aggregates before ARRAYFORMULA gets involved.

Three options that actually work:

Option 1: QUERY. =QUERY('P&L'!B:C, "SELECT B, SUM(C) WHERE B IS NOT NULL GROUP BY B LABEL SUM(C) ''", 1) does the aggregation natively and is faster on 50k+ rows than any formula-based approach.

Option 2: MMULT. More setup, but MMULT is genuinely array-aware and handles cross-dimensional aggregations that neither SUMIFS nor QUERY can express cleanly. Worth knowing for contribution margin calculations by SKU where you're weighting across multiple cost drivers.

Option 3: Just drag SUMIF. If the list you're summarizing is under 5,000 rows and static, =SUMIF('P&L'!$B:$B, A2, 'P&L'!$C:$C) dragged down is fine. ARRAYFORMULA is a tool, not a religion.

Performance at Scale

ARRAYFORMULA gets faster relative to individual formulas as datasets grow. At 500 rows, the difference is trivial. At 50,000 rows, it's the difference between a model you can work in and one where you're watching a spinner.

Tested in July 2026: a column of 50,000 VLOOKUP formulas took 8.3 seconds to recalculate after a source tab changed. The equivalent =ARRAYFORMULA(VLOOKUP(...)) recalculated in 1.1 seconds. That's not measurement noise - it's the calculation engine handling one dependency instead of 50,000.

The catch: a single broken ARRAYFORMULA poisons the entire column. One bad row reference and you get #N/A from row 2 to row 50,000. Always wrap with IFERROR. Always.

Where ARRAYFORMULA Breaks Down

Unbounded whole-column references. C2:C is convenient but dangerous. If 'Actuals'!C:C has 200,000 rows because someone pasted a raw data dump, your formula runs 200,000 evaluations every time anything changes. Scope your ranges to the actual data window.

Mismatched array dimensions. Multiplying a 12-column array by a 3-column array returns #VALUE!. Dimensions must match exactly, or one dimension must be 1 (which broadcasts across the other).

Functions that aren't range-aware. Some functions simply don't respond to ARRAYFORMULA - they evaluate once and return a scalar regardless. If you're testing a new combination, isolate it in a scratch cell before wiring it into a model tab.

The Non-Obvious Risk: Silent Wrong Answers

ARRAYFORMULA in Google Sheets behaves like a calculated column in a database - but without the schema enforcement. Change the column order on a source tab, and your VLOOKUP column index is now pulling the wrong field. ARRAYFORMULA won't error. It will silently return wrong numbers.

The fix is cheap: add a validation cell per ARRAYFORMULA column. Compare =COUNTA('Raw_GL'!A2:A) against =COUNTA(Working!C2:C). If they diverge, something broke. Fifteen seconds of setup, potentially hours saved in board-pack review.

Most guides on ARRAYFORMULA skip this entirely. But if your EBITDA bridge is feeding off a tab where someone quietly renamed a column, you'll be glad you built it.

If you're working across 8+ linked tabs and want AI to audit the formula logic rather than doing it manually, ModelMonkey can inspect the full model and flag where array output ranges don't match source dimensions.

Frequently Asked Questions