Excel guide · 5 min read
How to create a calendar in Excel
=LET(s,DATE(B1,B2,1),d,SEQUENCE(6,7,s-WEEKDAY(s)+1),IF(MONTH(d)=B2,DAY(d),"")). It spills a 6-week grid, Sunday to Saturday, with the day numbers of that month and blanks elsewhere. Change B2 and the whole calendar updates. It needs Excel 365 or Excel 2021 and later.Sample data
Every result on this page was calculated from this sheet by the same spreadsheet engine the Cellwise app uses.
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Year | 2026 | Event date | Event | |
| 2 | Month (1-12) | 11 | Nov 3, 2026 | Dentist | |
| 3 | Nov 11, 2026 | Team offsite | |||
| 4 | Nov 11, 2026 | Book club | |||
| 5 | Nov 26, 2026 | Thanksgiving | |||
| 6 | Dec 2, 2026 | Rent due |
The idea: find the Sunday before the 1st, then count 42 days
Every month fits in a grid of 6 rows by 7 days. The grid starts on the Sunday on or before the 1st of the month. DATE(B1,B2,1) is the 1st, here Sunday, November 1, 2026. WEEKDAY returns 1 for Sunday through 7 for Saturday, so subtracting WEEKDAY and adding 1 always lands on that Sunday.
SEQUENCE(6,7,start) then counts 42 days in a block, row by row: 6 rows, 7 columns, starting at that date and stepping by 1. The raw result is a grid of dates. They show as numbers like 46327 until you format them; a custom format of d (Ctrl+1 > Custom) shows just the day.
Why 6 rows when most months need 5? Some months spread over six weeks. August 2026 starts on a Saturday and has 31 days, so the 30th and 31st land in row 6. February 2026 starts on a Sunday and fills exactly 4 rows. A fixed 6x7 grid keeps your layout the same every month.
Result: spills 6 rows × 7 columns
| 46327 | 46328 | 46329 | 46330 | 46331 | 46332 | 46333 |
| 46334 | 46335 | 46336 | 46337 | 46338 | 46339 | 46340 |
| 46341 | 46342 | 46343 | 46344 | 46345 | 46346 | 46347 |
| 46348 | 46349 | 46350 | 46351 | 46352 | 46353 | 46354 |
| 46355 | 46356 | 46357 | 46358 | 46359 | 46360 | 46361 |
| 46362 | 46363 | 46364 | 46365 | 46366 | 46367 | 46368 |
42 dates in a 6x7 block, starting Sunday, Nov 1, 2026 and ending Saturday, Dec 12.
Show only this month's days
A plain grid also shows the last days of the previous month and the first days of the next one, which is confusing on a wall calendar. LET names the 1st of the month s and the grid d, so you can test each date: if MONTH(d) is the month in B2, show DAY(d), otherwise show nothing.
For November 2026 the grid fills 1 to 28 in the first four rows, 29 and 30 start row 5, and row 6 is blank. Change B2 to 8 and the same formula shows August, with the 1st on Saturday and the 30th and 31st in row 6.
The result is day numbers, not dates. That's perfect for printing. If you also want to mark events or shade weekends, keep the dates and hide the other months with conditional formatting instead (see the last section).
Result: spills 6 rows × 7 columns
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | |||||
November 2026: 1 under Sunday, 30 under Monday in row 5, blanks around it.
Start the week on Monday
In much of Europe and in many work calendars the week starts on Monday. WEEKDAY(s,2) numbers the days Monday 1 to Sunday 7, so the same subtraction finds the Monday on or before the 1st. For November 2026 that is Monday, October 26.
November 1 is a Sunday, so it now sits in the last column of row 1, and November 30 is alone at the start of row 6. Months that start on a Sunday are exactly the ones that need six rows in a Monday calendar.
Result: spills 6 rows × 7 columns
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Row 1 is blank except 1 under Sunday; 30 starts row 6.
Add the day names and a title
Put the day headers in the row above the grid with one formula. =TEXT(SEQUENCE(1,7,s-WEEKDAY(s)+1),"ddd") takes the first seven dates of the grid and formats them as short day names, so they always match the grid. For the Sunday version that gives Sun, Mon, Tue, Wed, Thu, Fri, Sat; with WEEKDAY(s,2) it gives Mon to Sun. Use "dddd" for full names.
For the title, =TEXT(DATE(B1,B2,1),"mmmm yyyy") shows November 2026. To flip through months, add a Next button the low-tech way: =DATE(B1,B2+1,1) rolls past December on its own, because DATE(2026,13,1) is January 2027.
Make B2 a drop-down (Data > Data Validation > Allow: Whole number, between 1 and 12) so nobody types 13 into it.
Result: spills 1 row × 7 columns
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
Sun, Mon, Tue, Wed, Thu, Fri, Sat across seven cells.
Mark events and shade weekends
Keep a small events list next to the calendar: dates in column D, what's happening in E. COUNTIF can count how many events fall on each grid date in one go, and the formula below adds a dot to busy days. The 3rd, 11th and 26th get a marker; the 11th has two events. The Dec 2 rent reminder doesn't show, because it's outside November.
To see what's on a day, =TEXTJOIN(", ",TRUE,FILTER(E2:E6,D2:D6=DATE(2026,11,11))) lists "Team offsite, Book club".
For colors, spill the plain date grid from the first section, format it as d, and select the grid and add conditional formatting rules written for its top-left cell. If the grid starts in G3: =MONTH(G3)<>$B$2 with gray text fades the other months, =WEEKDAY(G3,2)>5 shades weekends, =COUNTIF($D$2:$D$6,G3)>0 highlights event days and =G3=TODAY() marks today.
Result: spills 6 rows × 7 columns
| 1 | 2 | 3 • | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 • | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 • | 27 | 28 |
| 29 | 30 | |||||
"3 •", "11 •" and "26 •" on the event days; other days show just the number.
Common mistakes
The grid shows numbers like 46327
Those are dates. Select the grid, press Ctrl+1, choose Custom and type d to show only the day.
Using a 5-row grid
Months like August 2026 (Sunday start) or November 2026 (Monday start) need six rows. Use SEQUENCE(6,7,...) so nothing is cut off.
#SPILL! where the calendar should be
Something is typed inside the 6x7 area the formula needs. Clear those cells, including stray spaces.
Day headers don't match a Monday grid
Use the same WEEKDAY type in the header formula and the grid formula: both WEEKDAY(s,2) for Monday, or both plain WEEKDAY(s) for Sunday.
FAQ
How do I make a yearly calendar in Excel?
Build one month block with the formula, then copy it 11 times and point each copy to its own month, for example =DATE($B$1,1,1) in the first and month 2 in the next. Lay them out 3 or 4 across for a printable page.
Does Excel have a calendar template?
Yes. File > New, then search "calendar" for ready-made designs. A formula calendar is better when you want it to update from a date cell, show your own events, or sit inside a workbook you already use.
How do I create a calendar in older Excel without SEQUENCE?
Put the first grid date in the top-left cell, say G3, with =DATE(B1,B2,1)-WEEKDAY(DATE(B1,B2,1))+1. In H3 enter =G3+1 and in G4 enter =G3+7. Fill the formulas across and down a 6x7 area and format the cells as d.
How do I print the calendar on one page?
Go to Page Layout, set Orientation to Landscape, and set Width and Height to 1 page in the Scale to Fit group. Add borders to the grid with Home > Borders > All Borders so the days read as boxes on paper.
Functions used
SEQUENCENumbered list, spillsDATEBuilds a dateWEEKDAYDay of the week as a numberLETNames values inside a formulaMONTHMonth numberDAYDay of the monthTEXTNumber to formatted textCOUNTIFCounts cells that matchTEXTJOINJoins with a separatorFILTERKeeps matching rows, spillsTODAYToday’s date
Related guides
- How to list all dates between two dates in Excel
- How to highlight weekends in Excel
- How to get the day of the week from a date in Excel
- Highlight overdue and upcoming dates in Excel
- How to find the nth weekday of a month in Excel
- How to find missing numbers in a sequence in Excel
- How to find upcoming birthdays in Excel
Updated