Cellwise Start free

Excel guide · 5 min read

How to create a calendar in Excel

Quick answerPut the year in B1 and the month number in B2, then enter =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.

ABCDE
1Year2026Event dateEvent
2Month (1-12)11Nov 3, 2026Dentist
3Nov 11, 2026Team offsite
4Nov 11, 2026Book club
5Nov 26, 2026Thanksgiving
6Dec 2, 2026Rent 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.

=SEQUENCE(6,7,DATE(B1,B2,1)-WEEKDAY(DATE(B1,B2,1))+1)

Result: spills 6 rows × 7 columns

46327463284632946330463314633246333
46334463354633646337463384633946340
46341463424634346344463454634646347
46348463494635046351463524635346354
46355463564635746358463594636046361
46362463634636446365463664636746368

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).

=LET(s,DATE(B1,B2,1),d,SEQUENCE(6,7,s-WEEKDAY(s)+1),IF(MONTH(d)=B2,DAY(d),""))

Result: spills 6 rows × 7 columns

1234567
891011121314
15161718192021
22232425262728
2930

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.

=LET(s,DATE(B1,B2,1),d,SEQUENCE(6,7,s-WEEKDAY(s,2)+1),IF(MONTH(d)=B2,DAY(d),""))

Result: spills 6 rows × 7 columns

1
2345678
9101112131415
16171819202122
23242526272829
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.

=LET(s,DATE(B1,B2,1),TEXT(SEQUENCE(1,7,s-WEEKDAY(s)+1),"ddd"))

Result: spills 1 row × 7 columns

SunMonTueWedThuFriSat

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.

=LET(s,DATE(B1,B2,1),d,SEQUENCE(6,7,s-WEEKDAY(s)+1),IF(MONTH(d)=B2,DAY(d)&IF(COUNTIF(D2:D6,d)," •",""),""))

Result: spills 6 rows × 7 columns

123 •4567
891011 •121314
15161718192021
2223242526 •2728
2930

"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

Related guides

Updated