COUPNCD(settlement, maturity, frequency, [basis]) returns the next coupon date strictly
after the settlement date — as a date serial, which Excel's date formatting renders as a date.
Microsoft's Learn page describes it as returning "a number that represents the next coupon date
after the settlement date", and declares the return type as Double. It is a date-valued
function returning a plain number.
The whole content of the function is the schedule it derives, so this page hosts the
description that the other five coupon functions refer to.
Arguments
COUPNCD(settlement, maturity, frequency, [basis]) — the same four arguments as every other
member of the family.
Argument
Meaning
Required?
settlement
The security's settlement date — "the date after the issue date when the security is traded to the buyer".
Required
maturity
The security's maturity date — "the date when the security expires".
Required
frequency
Coupon payments per year. Microsoft: "For annual payments, frequency = 1; for semiannual, frequency = 2; for quarterly, frequency = 4."
Required
basis
The day-count basis, 0–4.
Optional, defaults to 0
The argument descriptions are quoted from Microsoft's Learn page.
basis is documented on this page with the standard five-row table:
basis
Day count basis
0 or omitted
US (NASD) 30/360
1
Actual/actual
2
Actual/360
3
Actual/365
4
European 30/360
basis cannot change this function's answer. A coupon date is a calendar date; no day-count
convention moves it. COUPNCD nevertheless accepts basis and validates it, so an out-of-range
basis turns a perfectly well-defined date into an error. That is a real, observable dependency
on an argument that does not participate in the computation — worth knowing when a COUPNCD
formula starts erroring after someone edits a shared basis cell.
Microsoft documents that "All arguments are truncated to integers." Dates should be produced
by DATE or by other formulas rather than typed as text; ordinary coercion rules are in
Coercion and lifting.
Try it
Quirks
The coupon schedule
None of the six coupon functions is given a coupon schedule. They are given a maturity date
and a frequency, and they reconstruct the schedule from those two facts:
the coupon dates are maturity, maturity − p, maturity − 2p, maturity − 3p, …
where p = 12 / frequency months
Coupon dates are therefore anchored at maturity, counted backwards, and there is no issue
date to stop the schedule; FN-COUPNUM-001 records what Excel does when it runs back past the start
of 1900. settlement selects a period from that ladder: the one whose start is at or before
settlement and whose end is after it.
Three consequences do most of the work on all six pages:
The day of the month comes from maturity, not from settlement. A bond maturing on the
15th has coupons on the 15th. Everything else about the trade is irrelevant to the schedule.
The schedule is quasi-periodic, not periodic: because the month-end rule clamps, stepping back
n periods is not always the same as stepping back one period n times from an intermediate
date. Implementations that step iteratively and implementations that compute the offset in one
jump can disagree.
Result and edge cases
settlement on a coupon date returns the following coupon date under the reference
engine, not settlement itself. See the schedule section above; this is undocumented.
settlement one day before maturity returns maturity, which is always a coupon date by
construction.
settlement ≥ maturity is a documented error.
Month-end maturities propagate month-end coupon dates: a 31 August maturity at
frequency 2 gives a 28 or 29 February coupon, not a 28th-of-the-month coupon.
Empty, missing and error arguments follow the shared call model.
Errors
Documented on Microsoft's Learn page for this function, in these words (it says "generates an
error" without naming a worksheet error value):
Condition (documented)
Documented outcome
settlement or maturity is not a valid date
error
frequency is any number other than 1, 2 or 4
error
basis < 0 or basis > 4
error
settlement ≥ maturity
error
On basis 1 COUPDAYS walks back from maturity by its own rule, not COUPPCD to COUPNCD
On basis 1 (actual/actual) COUPDAYS does not always equal COUPNCD minus COUPPCD. Its rule: start at maturity and step back by 12/frequency months. Each step keeps the day of the month and clamps it to the length of the target month, and the clamped date is the start of the next step, so passing through February lowers the day for every earlier date. Stop at the last date still after settlement, call it next. The answer is the number of actual days from one period before next up to next, and this last step keeps month ends: if next is the last day of its month, the start is the last day of its month. On the other bases the answer is 360/frequency (bases 0, 2, 4) or 365/frequency (basis 3). With this rule, all 5,584 recorded rows match (4,072 distinct inputs): 5,568 numbers and 16 #NUM!, from Excel builds 20131 and 20430. Of the 967 basis 1 rows, 81 (49 distinct inputs) differ from the day count between the dates of a schedule anchored on maturity with month ends kept. For maturity 1998-06-30 with semi-annual coupons, COUPDAYS(35748,35976,2,1) is 183, from 1997-06-30 to 1997-12-30; the anchored schedule gives 184. In one recorded case all three functions were read on the same inputs: COUPNCD(44043,2958465,2,1) less COUPPCD is 44196 - 44012 = 184, and COUPDAYS is 183.
Explanation (inferred): The rule reproduces every recorded row; that Excel's code works this way is inferred. For basis 1 no settlement or maturity before serial 61, where Excel's calendar differs from the Gregorian one, is in the recorded rows.
Formula
Excel
Mathematical value
COUPDAYS(35748, 35976, 2, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 35748 0x40e1748000000000
maturity: 35976 0x40e1910000000000
frequency: 2 0x4000000000000000
basis: 1 0x3ff0000000000000
183 0x4066e00000000000
—
COUPDAYS(36452, 36891, 4, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 36452 0x40e1cc8000000000
maturity: 36891 0x40e2036000000000
frequency: 4 0x4010000000000000
basis: 1 0x3ff0000000000000
91 0x4056c00000000000
—
COUPDAYS(36812, 47907, 4, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 36812 0x40e1f98000000000
maturity: 47907 0x40e7646000000000
frequency: 4 0x4010000000000000
basis: 1 0x3ff0000000000000
92 0x4057000000000000
—
COUPDAYS(37015, 38137, 4, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 37015 0x40e212e000000000
maturity: 38137 0x40e29f2000000000
frequency: 4 0x4010000000000000
basis: 1 0x3ff0000000000000
89 0x4056400000000000
—
COUPDAYS(38044, 38411, 2, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 38044 0x40e2938000000000
maturity: 38411 0x40e2c16000000000
frequency: 2 0x4000000000000000
basis: 1 0x3ff0000000000000
184 0x4067000000000000
—
COUPDAYS(34911, 35216, 2, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 34911 0x40e10be000000000
maturity: 35216 0x40e1320000000000
frequency: 2 0x4000000000000000
basis: 1 0x3ff0000000000000
183 0x4066e00000000000
—
COUPPCD(44043, 2958465, 2, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 44043 0x40e5816000000000
maturity: 2958465 0x4146924080000000
frequency: 2 0x4000000000000000
basis: 1 0x3ff0000000000000
44012 0x40e57d8000000000
—
COUPNCD(44043, 2958465, 2, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 44043 0x40e5816000000000
maturity: 2958465 0x4146924080000000
frequency: 2 0x4000000000000000
basis: 1 0x3ff0000000000000
44196 0x40e5948000000000
—
COUPDAYS(44043, 2958465, 2, 1) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
COUPNUM is #NUM! when the coupon before settlement falls before 1900
If the coupon date before settlement, counted back from maturity, falls before 1 January 1900, COUPNUM gives #NUM!. The other coupon functions still answer for the same inputs: COUPPCD returns 0, COUPNCD the next coupon, and COUPDAYS, COUPDAYBS and COUPDAYSNC a day count. With maturity serial 400 (1901-02-03) and semi-annual coupons, the coupon dates are serials 34 and 216: settlement 33 gives #NUM!, settlement 34 gives 2. With maturity 367, settlement 0 gives #NUM! and settlement 1 gives 2. This covers settlement 0 too: COUPNUM(0,m,2,0) was #NUM! for every maturity read.
Formula
Excel
Mathematical value
COUPNUM(33, 400, 2, 0) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
settlement: 33 0x4040800000000000
maturity: 400 0x4079000000000000
frequency: 2 0x4000000000000000
basis: 0 0x0000000000000000
#NUM!
—
COUPNUM(34, 400, 2, 0) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
settlement: 34 0x4041000000000000
maturity: 400 0x4079000000000000
frequency: 2 0x4000000000000000
basis: 0 0x0000000000000000
2 0x4000000000000000
—
COUPNUM(0, 367, 2, 0) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
settlement: 0 0x0000000000000000
maturity: 367 0x4076f00000000000
frequency: 2 0x4000000000000000
basis: 0 0x0000000000000000
#NUM!
—
=COUPNUM(0,182,2,0) Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Typed formula.
#NUM!
—
=COUPNUM(A1,400,2,0) Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Number supplied through a cell.
A1: 0 0x0000000000000000
#NUM!
—
=COUPPCD(A1,400,2,0) Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
Number supplied through a cell.
A1: 0 0x0000000000000000
0 0x0000000000000000
—
=COUPNCD(A1,400,2,0) Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZAInputs and reference value
There is no floating-point content here worth the name: the answer is an integer-valued date
serial. The engineering content is all in the schedule.
Iterate or jump, but be consistent. Stepping back one period at a time and computing the
period index directly give different answers under a clamping month rule. The reference
engine iterates.
The month-end predicate is a decision, not a fact. "Is this date the last day of its
month?" is cheap; deciding that the answer should propagate to every generated date is a
modelling choice with no documentary support.
Cost is linear in the settlement-to-maturity gap under an iterating implementation. A
30-year quarterly bond settled at issue costs 120 iterations, which is fine; a synthetic test
with a maturity centuries out is not.
Do not route this through a day-count routine.basis must be validated and then
ignored. An implementation that computes the answer via a year fraction will introduce
basis-dependence into a function that has none.
Rust code
Show the CalcFunc source of this function
Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.
No implementation has been published with a Handbook test suite for this function.
Version differences
The recorded environments below distinguish a reading from a same-input comparison. Counts describe captured inputs in each environment; overlapping captures and comparisons are not totals of unique worksheet calls.
Excel 16.0 build
Platform and CPU
Captured inputs
20131
Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics
1,060
20430
Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics
3,012
The record contains no same-input comparison between these environments. Reading different inputs on different builds does not establish either a version change or cross-build agreement.
COUPNCD(44043, 2958465, 2, 1) returned 44196 (0x40e5948000000000). Inputs were supplied through cells using Value2. These are controls from this environment, not a same-input comparison with another build.
Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
=COUPNCD(A1,400,2,0) returned 34 (0x4041000000000000). Inputs were supplied through cells using Value2. These are controls from this environment, not a same-input comparison with another build.
Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics
1,060 captured inputs are indexed for this environment. Capture dates: 2026-07-19 to 2026-07-19. This is a reading count, not a comparison with another build.
Excel 16.0 build 20430
Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics
3,012 captured inputs are indexed for this environment. Capture dates: 2026-09-24 to 2026-09-25. This is a reading count, not a comparison with another build.
Alternatives
Relationships
COUPPCD — the backward end of the same period. COUPPCD and COUPNCD
bracket settlement, and together they define the current coupon period.
COUPDAYBS, COUPDAYSNC,
COUPDAYS — the three day counts taken against those two dates, though
on basis 1 COUPDAYS can use another interval (FN-COUPDAYS-001). Note
that the three do not always add up; see the additivity discussion on
COUPDAYS.
COUPNUM — how many coupon dates remain from settlement to maturity
on the same ladder.
PRICE, YIELD, DURATION, MDURATION — the consumers. They rebuild this same schedule
internally rather than calling these functions, which is why a schedule disagreement between
Excel's COUPNCD and Excel's PRICE is possible in principle and has been observed for the
day counts in this family; see COUPDAYS.
EDATE and EOMONTH — the general-purpose
month-stepping functions. EDATE clamps the day of month; it does not implement
"month-end sticks to month-end". Rebuilding a coupon schedule with EDATE therefore
reproduces COUPNCD for ordinary maturities and diverges for month-end ones.
Confused with: EDATE(maturity, ±n × 12/frequency), for exactly that reason.