WORKDAY.INTL returns the date lying a given number of working days before or after a start date,
where which days are weekend is an argument rather than a fixed Saturday and Sunday. It is to
WORKDAY what NETWORKDAYS.INTL is to
NETWORKDAYS, and it shares the .INTL weekend argument with the former
exactly.
The operation is unchanged from WORKDAY: step away from start_date in the direction of days,
consuming one unit of the count for each working day stepped onto, and return where you land. Only
the definition of "working day" is now parameterized.
Arguments
WORKDAY.INTL(start_date, days, [weekend], [holidays]) — two required and two optional.
start_date — the date to offset from.
days — the number of working days to move; positive forward, negative backward. WORKDAY's
page documents that a non-integer days is truncated, and the same rule is expected here.
weekend — optional; the same two-shaped argument documented for NETWORKDAYS.INTL.
As a number:
Number
Weekend days
1 (default)
Saturday, Sunday
2
Sunday, Monday
3
Monday, Tuesday
4
Tuesday, Wednesday
5
Wednesday, Thursday
6
Thursday, Friday
7
Friday, Saturday
11
Sunday only
12
Monday only
13
Tuesday only
14
Wednesday only
15
Thursday only
16
Friday only
17
Saturday only
Codes 1–7 are consecutive pairs starting one day later each time from Saturday; codes 11–17 are
single days running Sunday through Saturday. The two blocks do not share an origin, and neither
aligns with WEEKDAY's numbering.
As a string: seven characters, one per weekday starting with Monday, "1" for a non-workday
and "0" for a workday; only those two characters are permitted. Microsoft's WORKDAY.INTL page
adds a rule its sibling's page does not state in the same words: "1111111" is invalid, because
at least one workday is required. That prohibition is structurally necessary here in a way it is
not for a counting function — a week with no working days makes the offset non-terminating, whereas
a count over such a week is simply zero.
holidays — optional range or array of dates to exclude.
The foot-gun is unchanged from the sibling and worth repeating: an unquoted 0000011 is the
number 11, a valid weekend code meaning "Sunday only". It produces a plausible wrong answer, not
an error.
Try it
Quirks
Result and edge cases
Returns a Number: a whole date serial.
days = 0 exposes the counting convention, exactly as on WORKDAY, and the
page is equally silent about it. Whether a start date falling on a weekend is returned unchanged
or snapped is the diagnostic case.
A six-day weekend leaves one working day per week, which is legal and makes offsets large in
calendar terms — a good stress case for any closed-form implementation.
Holidays that fall on weekend days should contribute nothing; undocumented.
Consecutive holidays require the exclusion pass to iterate; see the implementer notes.
Blank cells in a holidays range raise the Empty-versus-Missing question from
the value universe; serial 0 is a representable date.
Errors
Documented on the Microsoft page, and this is the fullest error table in the family:
#NUM! when "start_date is out of range for the current date base value".
#NUM! when "any date in holidays is out of range for the current date base value".
#NUM! when "start_date plus day-offset yields an invalid date".
#VALUE! when "a weekend string is of invalid length or contains invalid characters".
Two observations the Handbook records rather than smooths over:
The holidays condition is documented here and not on WORKDAY's page,
which mentions only "any argument is not a valid date" (#VALUE!). Two functions performing the
same holiday exclusion, documented with different error values for an out-of-range holiday.
Only the string form of weekend has a documented invalidity condition. What an
out-of-table numeric code does is not stated. Code 0 gives #NUM! (FN-NETWORKDAYS.INTL-001);
8, 10 and 18 are not asserted here.
NETWORKDAYS.INTL checks weekend before the dates, WORKDAY.INTL after them
The two functions read their arguments in different orders. NETWORKDAYS.INTL decodes weekend first: with #REF! in the cell for start_date and weekend 0, the answer is #NUM!, from the invalid weekend. WORKDAY.INTL reads start_date first and gives #REF! for the same arguments. An error held in the weekend cell is also treated differently: with start 2 and second argument 5, NETWORKDAYS.INTL gives #VALUE! and WORKDAY.INTL gives #NUM!. Neither returns the error itself. A logical weekend is read as a number: NETWORKDAYS.INTL(2,5,TRUE) is 4, as with weekend 1, and FALSE is #NUM!, as with weekend 0. WORKDAY.INTL does the same.
Formula
Excel
Mathematical value
NETWORKDAYS.INTL(A1, 5, 0) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
start_date: #REF!
end_date: 5 0x4014000000000000
weekend: 0 0x0000000000000000
#NUM!
—
WORKDAY.INTL(A1, 5, 0) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
start_date: #REF!
days: 5 0x4014000000000000
weekend: 0 0x0000000000000000
#REF!
—
NETWORKDAYS.INTL(2, 5, A3) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
start_date: 2 0x4000000000000000
end_date: 5 0x4014000000000000
weekend: #REF!
#VALUE!
—
WORKDAY.INTL(2, 5, A3) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
start_date: 2 0x4000000000000000
days: 5 0x4014000000000000
weekend: #REF!
#NUM!
—
=NETWORKDAYS.INTL(2,5,TRUE) 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.
4 0x4010000000000000
—
=NETWORKDAYS.INTL(2,5,FALSE) 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!
—
=WORKDAY.INTL(2,2,TRUE) 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.
4 0x4010000000000000
—
=WORKDAY.INTL(2,2,FALSE) 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
An empty cell as a first date is serial 0, but a logical in that cell is #VALUE!
A reference to an empty cell as the first date of these functions reads as serial 0 and gives a normal answer: NETWORKDAYS(B1,5) is 4 and WORKDAY(B1,2) is 3. YEARFRAC(B1,5,0) is 5/360. TRUE in the same cell gives #VALUE!, as a direct TRUE does, so a blank is not treated as the logical FALSE either.
Formula
Excel
Mathematical value
=NETWORKDAYS(B1,5) 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.
B1: (empty cell)
4 0x4010000000000000
—
=NETWORKDAYS(B1,5) 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.
B1: TRUE
#VALUE!
—
=WORKDAY(B1,2) 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.
B1: (empty cell)
3 0x4008000000000000
—
=WORKDAY(B1,2) 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.
B1: TRUE
#VALUE!
—
=NETWORKDAYS.INTL(B1,5,1) 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.
B1: (empty cell)
4 0x4010000000000000
—
=WORKDAY.INTL(B1,2,1) 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.
B1: (empty cell)
3 0x4008000000000000
—
=YEARFRAC(B1,5,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.
B1: (empty cell)
0.013888888888888888 0x3f8c71c71c71c71c
—
=TBILLEQ(B1,5,0.1) 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
Normalize weekend to a seven-bit mask once start_date has been read, the order Excel
uses (FN-NETWORKDAYS.INTL-001), from either shape, and reject
the all-ones mask here even if the counting sibling tolerates it — an offset over a week with no
working days does not terminate.
Use whole-week arithmetic. With w = popcount(¬mask) working days per week, days decomposes
into ⌊days/w⌋ whole weeks plus a remainder resolved against the start day's position in the
week. Stepping day by day is correct and unusably slow across the serial range.
Iterate the holiday exclusion to a fixed point. Skipping a holiday moves the target, which
may itself be a holiday; a single pass is wrong for consecutive holidays.
Keep the days = 0 convention identical to WORKDAY's, whatever it turns out to be.
Do not share the error path with WORKDAY until the documented divergence above is resolved
by observation.
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
20430
Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics
4,800
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.
Windows, bitness and CPU not recorded in this reading file
WORKDAY.INTL(A1, 5, 0) returned #REF!. WORKDAY.INTL(2, 5, A3) returned #NUM!. Inputs were supplied through cells using Value2. These are controls from this environment, not a same-input comparison with another build.
Observed formulas and results
WORKDAY.INTL(A1, 5, 0) → #REF!(cell-value2)
WORKDAY.INTL(2, 5, A3) → #NUM!(cell-value2)
Excel 16.0.20527.20088
Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
=WORKDAY.INTL(2,2,TRUE) returned 4 (0x4010000000000000). =WORKDAY.INTL(2,2,FALSE) returned #NUM!. 1 further recorded control is attached. Inputs were supplied through cells using Value2, formula literals. These are controls from this environment, not a same-input comparison with another build.
Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics
4,800 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
WORKDAY — the un-generalized original. WORKDAY(a,n,h) should equal
WORKDAY.INTL(a,n,1,h); unverified here.
NETWORKDAYS.INTL — the inverse operation, sharing this exact
weekend argument. Their weekend interpretations must agree or the family is incoherent; that
they do is assumed and unchecked.