VBA financial :: IRR
0. Introduction to cash flow functions
All examples are based on the xlf Carrot Washer project link.
1. Internal rate of return (IRR)
The internal rate of return (IRR) for a series of cash flows, is the discount rate that equates to a zero net present value (NPV).
In equation form the NPV of 0 is set equal to the sum of discounted cash flows $$\begin{equation} 0=\sum_{t=0}^{n} \frac{C_t}{(1+IRR)^t} \end{equation}$$ where the cash flows at time \(t\) are denoted \(C_t\) over \(n\) periods. Equation 1 is solved for \(IRR\).
1.1 IRR VBA function
SYNTAX (VBA): IRR(ValueArray() As Double, [Guess]) As Double
Code 1: Sub
DemoIRR returns the NPV for the carrot washer project using the VBA IRR function (VBA.IRR)
Option Explicit
' =================
' IRR VBA function
' =================
Sub DemoIRR()
' procedure declarations
Dim CashFlows(0 To 5) As Double ' << Type [Cashflows array] must be Double
Dim IrrDec As Double
' assignment statements
CashFlows(0) = -80000
CashFlows(1) = 10000
CashFlows(2) = 20000
CashFlows(3) = 15000
CashFlows(4) = 50000
CashFlows(5) = 20000
' calculation
IrrDec = IRR(CashFlows)
Debug.Print Time & ", IRR value (decimal): " & IrrDec & " (15 significant figures)"
Debug.Print Time & ", IRR value (percent): " & Format(IrrDec, "percent")
Debug.Print Time & ", IRR value (percent): " & Format(IrrDec, "0.0000%")
End Sub

Type [Cashflows array] - the array Type, code 1 line 8 must be a Double
Other data types such as Variant or Single return a Compile error: Type mismatch array or user-defined type expected at line 20
1.2 IRR WS function
SYNTAX (WS): IRR(values, [guess])
Pass cash flow values from a VBA array.
Code 2: Sub
DemoIRRws returns the NPV for the carrot washer project using the (WS) IRR function (Application.IRR)
' =================
' IRR WS function
' =================
Sub DemoIRRws()
' procedure declarations
Dim CashFlows(0 To 5) As Double
Dim IrrDec As Double
' assignment statements
CashFlows(0) = -80000
CashFlows(1) = 10000
CashFlows(2) = 20000
CashFlows(3) = 15000
CashFlows(4) = 50000
CashFlows(5) = 20000
' calculation
IrrDec = Application.IRR(CashFlows)
Debug.Print Time & ", IRR value (percent) WS: " & Format(IrrDec, "percent")
End Sub

1.3 IRR GoalSeek method
SYNTAX (VBA): Range().GoalSeek Goal:=value, ChangingCell:=Range(). Returns TRUE or FALSE
Cash flow values are stored in a worksheet range.
Code 3: Sub
DemoIRRgs returns the NPV for the carrot washer project using the VBA Range.GoalSeek method
=================
' IRR GoalSeek method
' =================
Sub DemoIRRgs()
Dim IrrDec As Double
' reset disc rate
Range("Disc").Value = "5%"
' calculation
Range("NPV").GoalSeek Goal:=0, ChangingCell:=Range("Disc")
IrrDec = Range("Disc")
Debug.Print vbNewLine & Time & ", IRR value (percent) GoalSeek: " & Format(IrrDec, "percent")
End Sub

- Download the Excel file for this module: xlf-vba-financial-irr.xlsm [18 KB]
- Development platform: Excel 2016 (64 bit) Office 365 ProPlus
- Published: 24 August 2018
- Revised: Friday 24th of February 2023 - 02:38 PM, Pacific Time (PT)
