For students · resources

Excel for finance work.

A reference of the 30 Excel functions that come up most often in undergraduate finance — time value of money, investment analysis, lookups, statistics, and dates. Each entry shows the syntax, a one-line description, and a working example with a concrete finance result. Filter by typing, or jump to a category below.

No functions match that filter.

Time Value of Money.

5 functions
PMT(rate, nper, pv, [fv], [type])

Periodic payment for a fixed-rate loan or annuity. Sign convention: a positive PV (money borrowed) returns a negative PMT (money you pay out), and vice versa.

=PMT(0.07/12, 360, -300000) → $1,995.91 monthly mortgage on a $300k loan at 7% over 30 years
FV(rate, nper, pmt, [pv], [type])

Future value of an investment given regular contributions and a constant rate.

=FV(0.06/12, 240, -500, 0) → $231,020 — saving $500/month for 20 years at 6%
PV(rate, nper, pmt, [fv], [type])

Present value of a stream of future cash flows. The discounting workhorse.

=PV(0.05, 30, 0, -100000) → $23,138 — what $100k thirty years from now is worth today at 5%
RATE(nper, pmt, pv, [fv], [type], [guess])

Periodic interest rate implied by the other variables. Multiply by the number of compounding periods to annualize.

=RATE(360, -1995.91, 300000)*12 → 7.0% annual — implied rate from a $1,995.91 monthly payment on $300k over 30 years
NPER(rate, pmt, pv, [fv], [type])

Number of periods to hit a target balance given a constant payment and rate.

=NPER(0.08/12, -200, 0, 50000)/12 → 12.3 years — to reach $50k saving $200/month at 8%

Investment Analysis.

5 functions
NPV(rate, value1, [value2], ...)

Net present value of cash flows that occur at the end of equal-length periods. Important quirk: NPV discounts the first value by one period, so add the initial t=0 outlay separately.

=NPV(0.10, 25000, 30000, 35000, 40000, 45000) - 100000 → $29,078 — five-year project, $100k initial outlay, discounted at 10%
IRR(values, [guess])

Internal rate of return for cash flows at equal intervals. First value should be the negative initial outlay.

=IRR({-100000, 25000, 30000, 35000, 40000, 45000}) → 19.8% — IRR of the same project as the NPV example
XNPV(rate, values, dates)

NPV using actual dates rather than equal periods — the realistic case for real-world projects with irregular cash flows.

=XNPV(0.08, A2:A10, B2:B10) → NPV at 8% using cash flows in column A and the actual dates in column B
XIRR(values, dates, [guess])

IRR using actual dates. In practice, prefer this to plain IRR — real cash flows are rarely on perfect calendar periods.

=XIRR(A2:A10, B2:B10) → annualized return given irregular cash flow dates
MIRR(values, finance_rate, reinvest_rate)

Modified IRR. Addresses IRR's questionable assumption that interim cash flows are reinvested at the IRR itself.

=MIRR(A2:A10, 0.05, 0.08) → MIRR assuming financing at 5% and reinvestment at 8%

Lookup & Reference.

4 functions
XLOOKUP(lookup, lookup_array, return_array, [if_not_found], [match_mode], [search_mode])

The modern, default-exact-match replacement for VLOOKUP, HLOOKUP, and most INDEX/MATCH uses. Use this in new work.

=XLOOKUP("AAPL", A2:A100, F2:F100, "n/a") → returns the column F value where column A equals "AAPL", or "n/a" if not found
INDEX / MATCH(array, MATCH(lookup, lookup_array, 0))

The pre-XLOOKUP standard. Still common in older workbooks you'll inherit — worth recognizing.

=INDEX(F2:F100, MATCH("AAPL", A2:A100, 0)) → same result as the XLOOKUP example above
OFFSET(reference, rows, cols, [height], [width])

Returns a range offset from a starting cell. Useful for dynamic ranges and rolling windows. Volatile — recalculates on every change.

=AVERAGE(OFFSET(B100, -11, 0, 12, 1)) → trailing 12-month average ending at B100
INDIRECT(ref_text)

Converts a text string into a cell reference. Powerful for dynamic sheet/range references — but volatile and slows large workbooks.

=INDIRECT("'" & A1 & "'!B5") → pulls cell B5 from a sheet whose name is the text in A1

Logical & Error Handling.

3 functions
IF(condition, value_if_true, value_if_false)

The classic conditional.

=IF(B2>10, "above target", "below") → returns one of two strings depending on B2
IFS(condition1, value1, [condition2, value2], ...)

Multiple conditions without nested IFs. Much cleaner than IF(IF(IF(...))) chains.

=IFS(B2<0, "loss", B2<10, "low", B2<25, "mid", TRUE, "high") → buckets B2 into one of four categories; final TRUE acts as the fallback
IFERROR(value, value_if_error)

Wraps a formula that might return #DIV/0!, #N/A, or similar, and substitutes a fallback. Essential for clean models.

=IFERROR(A2/B2, 0) → returns 0 rather than #DIV/0! if B2 is zero or empty

Conditional Aggregation.

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

Sum with one or more conditions. Note the argument order: sum range first, then criteria pairs.

=SUMIFS(D:D, A:A, "Tech", B:B, ">=2024") → sum of column D where sector is "Tech" and year is 2024 or later
COUNTIFS(criteria_range1, criteria1, [criteria_range2, criteria2], ...)

Count rows that satisfy multiple conditions.

=COUNTIFS(C:C, ">0", D:D, "<0") → count of rows where C is positive and D is negative
AVERAGEIFS(average_range, criteria_range1, criteria1, ...)

Average values with one or more conditions.

=AVERAGEIFS(R:R, S:S, "Large Cap", T:T, ">=2020") → average return for large-cap stocks from 2020 onward

Statistics.

6 functions
STDEV.S(number1, [number2], ...)

Sample standard deviation. Use STDEV.P only when your data is the entire population, not a sample.

=STDEV.S(R2:R61) → sample standard deviation of 60 monthly returns (a useful risk measure)
CORREL(array1, array2)

Pearson correlation coefficient between two series. Returns a value in [−1, 1].

=CORREL(B2:B61, C2:C61) → correlation between two stocks' monthly returns
COVARIANCE.S(array1, array2)

Sample covariance. The foundation of portfolio variance and the numerator of beta.

=COVARIANCE.S(R2:R61, M2:M61) → covariance between stock returns (column R) and market returns (column M)
SLOPE(known_ys, known_xs)

Slope of the OLS regression line. In finance: this is beta when y = stock excess returns and x = market excess returns.

=SLOPE(B2:B61, C2:C61) → beta of the stock in column B against the market in column C
INTERCEPT(known_ys, known_xs)

Y-intercept of the OLS regression line. In a CAPM regression, this is Jensen's alpha.

=INTERCEPT(B2:B61, C2:C61) → alpha of the stock vs the market (positive = outperformance after adjusting for beta risk)
LINEST(known_ys, [known_xs], [const], [stats])

Full OLS regression results as an array. With stats=TRUE you get standard errors, R², F-statistic, and degrees of freedom. Enter as an array formula or wrap in INDEX to pull individual values.

=LINEST(B2:B61, C2:C61, TRUE, TRUE) → array containing beta, alpha, standard errors, R², F-stat, residual SS

Dates.

4 functions
EDATE(start_date, months)

Date that is a given number of months after (or before, if negative) the start date.

=EDATE(TODAY(), 12) → today's date plus 12 months
EOMONTH(start_date, months)

Last day of the month that is N months from the start date. Useful for month-end pricing and reporting dates.

=EOMONTH(TODAY(), 0) → last day of the current month
YEARFRAC(start_date, end_date, [basis])

Fractional years between two dates. The basis controls day count: 0 = US 30/360, 1 = actual/actual, 2 = actual/360, 3 = actual/365, 4 = European 30/360. Matters for bonds and accrued interest.

=YEARFRAC("2024-01-15", TODAY(), 1) → years held using actual day count
WORKDAY(start_date, days, [holidays])

Adds business days to a date (skips weekends; optionally skips a holiday list). Used for settlement dates.

=WORKDAY(TODAY(), 5, holidays) → settlement date five business days from today, accounting for the named holiday range