Creating a dynamic calendar in Excel

lockarde

Board Regular
Joined
Oct 23, 2016
Messages
77
Good afternoon all,

I have a spreadsheet that tracks intakes for my office. These intakes have due dates, and I would like to have a calendar automatically update with the information under "Action Title" column based on the due dates. Here's what my sheet looks like with all sensitive information removed:
Action TitleType of RequestOriginating OfficePoint of ContactAction Assigned ToDue DateBranch AssignedCreated ByDate Assigned for ActionInternal Comments
Rabble....
5/25/2020​
....

So, my thought is, as I enter information, as soon as I put a Due Date, i.e 5/25/20, the information "Rabble" would get copied into May 25 2020 cell in the calendar.

I found a calendar macro here, and I like the format - but I'd like that to be a scrolling calendar, with arrows that I can click to go between months and I'm not sure how to implement the arrows, and have it show the information correctly as I scroll through the months, in one sheet.

Any help is greatly appreciated!
 

Excel Facts

When they said...
When they said you are going to "Excel at life", they meant you "will be doing Excel your whole life".
I have made the following toy solution assuming tht you have Excel 365. Otherwise it is much harder with formulas. This example is available here. Columns to the right of M can be hidden. I have used a calendar from this Excel article of DRSteele.
If you accept it as is, I can think of making a switch to change months.


Book2
ABCDEFGHIJKLMNOPQRS
1SunMonTueWedThuFriSatA2020-03-15#################2020-03-03################################
22020-03-132020-03-13B2020-03-17################2020-03-10################################
303/01/2020 03/02/2020 03/03/2020 03/04/2020 03/05/2020 03/06/2020 03/07/2020 C2020-03-15################2020-03-17################################
403/08/2020 03/09/2020 03/10/2020 03/11/2020 03/12/2020 03/13/2020 03/14/2020 D2020-03-17################2020-03-24################################
503/15/2020 A C03/16/2020 E03/17/2020 B D03/18/2020 03/19/2020 03/20/2020 F03/21/2020 E2020-03-16################2020-03-31
603/22/2020 03/23/2020 03/24/2020 03/25/2020 03/26/2020 03/27/2020 03/28/2020 F2020-03-20
703/29/2020 03/30/2020 03/31/2020
Sheet1
Cell Formulas
RangeFormula
A2A2=TODAY()
B2B2=A2
B3:H7B3=TEXTJOIN(" ",FALSE,TEXT(M1,"mm/dd/rrrr"),FILTER($J$1:$J$6,$K$1:$K$6=M1,""))
 
Upvote 0
Hey, if you do not have O365 you can use the WEEKDAY function to assist in making a dynamic calendar.

Book1
CDEFGHIJ
2Month:Feb2020
301/02/2020SunMonTueWedThuFriSat
4      1
52345678
69101112131415
716171819202122
823242526272829
Sheet1
Cell Formulas
RangeFormula
C3C3=DATE(G2,MONTH("1/"&D2),1)
D4D4=IF(WEEKDAY(C3,1)=1,C3,C3-WEEKDAY(C3,2))
E4:J4E4=D4+1
D5:J8D5=D4+7
Cells with Conditional Formatting
CellConditionCell FormatStop If True
D4:J8Expression=MONTH(D4)<>MONTH($C$3)textNO
 
Upvote 0
Hey, if you do not have O365 you can use the WEEKDAY function to assist in making a dynamic calendar.
Yes, that helps somewhat. However dynamic array functions are crucial in making the task lists in calendar cells.
I know how to circumvent this problem, but it is not that simple, unfortunately, so I prefer lockarde to respond before I start programming this solution.

J.Ty.
 
Upvote 0
Thanks for the response! Apologies for not checking this sooner. I played around with the macro I found that makes a calendar based on a month and year input, and with some research added arrow buttons for changing the month. I also managed to get the calendar to display the information relative to a due date each time it creates the month. My code is below:
VBA Code:
Sub Auto_Open()
i = month(Date)
yr = Year(Date)

CalendarMaker i, yr
Sheets("Project Management").Activate
End Sub

Sub CalendarMaker(i As Integer, yr As Integer)
Dim calws As Worksheet, ms_new As Worksheet, mos As Integer, mosname As String, newmos As Integer

Set ms_new = Sheets(Sheets.Count)

mos = i
mosname = (MonthName(mos) & " " & yr)
      
       Application.ScreenUpdating = False
       Sheets("Calendar").Activate
       ' Clear area a1:g14 including any previous calendar.
       Range("a1:g14").Clear
       StartDay = DateValue(mosname)
       ' Check if valid date but not the first of the month
       ' -- if so, reset StartDay to first day of month.
       If day(StartDay) <> 1 Then
           StartDay = DateValue(month(StartDay) & "/1/" & _
               Year(StartDay))
       End If
       ' Prepare cell for Month and Year as fully spelled out.
       Range("a1").NumberFormat = "mmmm yyyy"
       ' Center the Month and Year label across a1:g1 with appropriate
       ' size, height and bolding.
       With Range("a1:g1")
           .HorizontalAlignment = xlCenterAcrossSelection
           .VerticalAlignment = xlCenter
           .Font.Size = 24
           .Font.Bold = True
           .RowHeight = 45
           .Interior.Color = RGB(140, 160, 216)
           .BorderAround _
              Weight:=xlThick, ColorIndex:=xlAutomatic
       End With
       ' Prepare a2:g2 for day of week labels with centering, size,
       ' height and bolding.
       With Range("a2:g2")
           .ColumnWidth = 40
           .VerticalAlignment = xlCenter
           .HorizontalAlignment = xlCenter
           .VerticalAlignment = xlCenter
           .Orientation = xlHorizontal
           .Font.Size = 13
           .Font.Bold = True
           .RowHeight = 25
       End With
       ' Put days of week in a2:g2.
       Range("a2") = "Sunday"
       Range("b2") = "Monday"
       Range("c2") = "Tuesday"
       Range("d2") = "Wednesday"
       Range("e2") = "Thursday"
       Range("f2") = "Friday"
       Range("g2") = "Saturday"
       ' Prepare a3:g7 for dates with left/top alignment, size, height
       ' and bolding.
       With Range("a3:g8")
           .HorizontalAlignment = xlRight
           .VerticalAlignment = xlTop
           .Font.Size = 18
           .Font.Bold = True
           .RowHeight = 21
       End With
       ' Put inputted month and year fully spelling out into "a1".
       Range("a1").Value = Application.Text(mosname, "mmmm yyyy")
       ' Set variable and get which day of the week the month starts.
       DayofWeek = Weekday(StartDay)
       ' Set variables to identify the year and month as separate
       ' variables.
       CurYear = Year(StartDay)
       CurMonth = month(StartDay)
       ' Set variable and calculate the first day of the next month.
       FinalDay = DateSerial(CurYear, CurMonth + 1, 1)
       ' Place a "1" in cell position of the first day of the chosen
       ' month based on DayofWeek.
       Select Case DayofWeek
           Case 1
               With Range("a3")
                .Value = 1
                .Interior.Color = RGB(140, 160, 216)
               End With
           Case 2
               With Range("b3")
                .Value = 1
                .Interior.Color = RGB(140, 160, 216)
               End With
           Case 3
               With Range("c3")
                .Value = 1
                .Interior.Color = RGB(140, 160, 216)
               End With
           Case 4
               With Range("d3")
                .Value = 1
                .Interior.Color = RGB(140, 160, 216)
               End With
           Case 5
               With Range("e3")
                .Value = 1
                .Interior.Color = RGB(140, 160, 216)
               End With
           Case 6
               With Range("f3")
                .Value = 1
                .Interior.Color = RGB(140, 160, 216)
               End With
           Case 7
               With Range("g3")
                .Value = 1
                .Interior.Color = RGB(140, 160, 216)
               End With
       End Select
       ' Loop through range a3:g8 incrementing each cell after the "1"
       ' cell.
       For Each cell In Range("a3:g8")
           RowCell = cell.Row
           ColCell = cell.Column
           ' Do if "1" is in first column.
           If cell.Column = 1 And cell.Row = 3 Then
           ' Do if current cell is not in 1st column.
           ElseIf cell.Column <> 1 Then
               If cell.Offset(0, -1).Value >= 1 Then
                   cell.Value = cell.Offset(0, -1).Value + 1
                   cell.Interior.Color = RGB(140, 160, 216)
                   ' Stop when the last day of the month has been
                   ' entered.
                   If cell.Value > (FinalDay - StartDay) Then
                       cell.Value = ""
                       cell.ClearContents
                       cell.Interior.Color = 16777215
                       ' Exit loop when calendar has correct number of
                       ' days shown.
                       Exit For
                   End If
               End If
           ' Do only if current cell is not in Row 3 and is in Column 1.
           ElseIf cell.Row > 3 And cell.Column = 1 Then
               cell.Value = cell.Offset(-1, 6).Value + 1
               cell.Interior.Color = RGB(140, 160, 216)
               ' Stop when the last day of the month has been entered.
               If cell.Value > (FinalDay - StartDay) Then
                   cell.Value = ""
                  
                   ' Exit loop when calendar has correct number of days
                   ' shown.
                   Exit For
               End If
           End If
       Next

       ' Create Entry cells, format them centered, wrap text, and border
       ' around days.
       For x = 0 To 5
           Range("A4").Offset(x * 2, 0).EntireRow.Insert
           With Range("A4:G4").Offset(x * 2, 0)
               .RowHeight = 150
               .HorizontalAlignment = xlLeft
               .VerticalAlignment = xlTop
               .WrapText = True
               .Font.Size = 12
               .Font.Bold = False
               .Interior.Color = 16777215
               ' Unlock these cells to be able to enter text later after
               ' sheet is protected.
               .Locked = False
           End With
           ' Put border around the block of dates.
           With Range("A3").Offset(x * 2, 0).Resize(2, _
           7).Borders(xlLeft)
               .Weight = xlThick
               .ColorIndex = xlAutomatic
           End With

           With Range("A3").Offset(x * 2, 0).Resize(2, _
           7).Borders(xlRight)
               .Weight = xlThick
               .ColorIndex = xlAutomatic
           End With
           Range("A3").Offset(x * 2, 0).Resize(2, 7).BorderAround _
              Weight:=xlThick, ColorIndex:=xlAutomatic
       Next
       If Range("A13").Value = "" Then Range("A13").Offset(0, 0) _
          .Resize(2, 8).EntireRow.Delete
       ' Turn off gridlines.
       ActiveWindow.DisplayGridlines = False
       ActiveWindow.ScrollRow = 1
       ' Allow screen to redraw with calendar showing.
       Application.ScreenUpdating = True
       ' Prevent going to error trap unless error found by exiting Sub
       ' here.
      
       Find_Info i, yr
      
       Exit Sub
       Resume
   End Sub

Sub Find_Info(i As Integer, yr As Integer)

Dim r As Integer, c As Range, duedate As String, lastrow As Integer, duerng As Range
Dim ActionTitle As String, duemos As Integer, dueyr As Integer, dueday As Integer, at As Range
'c = 6

With Sheets("Project Management")
    lastrow = .Range("A1").End(xlDown).Row + 1
    r = 3
    Do While r < lastrow
        Set c = Sheets("Project Management").Cells.Find("Due Date")
        Set at = Sheets("Project Management").Cells.Find("Action Title")
        
        duedate = .Cells(r, c.Column).Value
        ActionTitle = .Cells(r, at.Column).Value
        duemos = month(duedate)
        dueyr = Year(duedate)
        dueday = day(duedate)
        If duemos = i And dueyr = yr Then
            Set duerng = Sheets("Calendar").Cells.Find(dueday)
            Set duerng = duerng.Offset(1, 0)
            If Not duerng.Value2 = "" Then
            duerng.Value2 = duerng.Value2 & Chr(10) & Chr(10) & ActionTitle
            Else
            duerng.Value2 = ActionTitle
            End If
            r = r + 1
        Else
            r = r + 1
        End If

    Loop
End With

End Sub

That's for the calendar, And for the buttons:

Code:
Option Explicit
Public i As Integer, yr As Integer


Sub Next_Month()
Dim day As Integer
day = Weekday(2 / 5 / 2020)
If yr < Year(Date) Then
    yr = yr

ElseIf yr > Year(Date) Then
    yr = yr
Else
    yr = Year(Date)
End If

If yr = 0 Then
    yr = Year(Date)
End If

i = i + 1

If i >= 13 Then
    i = 1
    yr = yr + 1
End If

CalendarMaker i, yr

End Sub
Sub Prev_Month()

If yr < Year(Date) Then
    yr = yr

ElseIf yr > Year(Date) Then
    yr = yr
Else
    yr = Year(Date)
End If

If yr = 0 Then
    yr = Year(Date)
End If

i = i - 1

If i <= 0 Then
    i = 12
    yr = yr - 1
End If

CalendarMaker i, yr

End Sub

I appreciate the help! I'm glad I was able to sort this one out mostly by myself though.
 
Upvote 0

Forum statistics

Threads
1,224,891
Messages
6,181,614
Members
453,057
Latest member
LE102024

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top