42個のコマンドボタンに日付を振ってみる

昨日は、ユーザーフォーム上にコマンドボタンをばらまいて、それをじわじわと集合させてみた。
infoment.hatenablog.com

そこで今回は、この42個のボタンを使って11月のカレンダーを作成してみる。
f:id:Infoment:20181124215113p:plain

既に下地はできている。そこでまず、6行×7列の一番左上にくる日付を求める。
f:id:Infoment:20181124215727p:plain

作成するカレンダーを、当月のカレンダーとした場合、1日は必ず最上列に登場する。従って、日曜日始まりのカレンダーを作成する場合は、以下の式で一番左上の日付を求めることが出来る。

左上の日付 = 当月1日 - WeekDay( 当日1日, vbMonday )

あとは、WithEventsでボタンを登録した際、ついでに日付とボタンの番号を登録するだけ。ボタンの番号は、今は要らないかもしれないが、ついでに登録しておく。

クラスモジュール
Option Explicit
Private WithEvents myCmdBtn As MSForms.CommandButton
' ↓今回の追加個所↓
Public myDate As Date
Public myIndex As Long

Private Sub myCmdBtn_Click()
    ' 日付を表示させる。
    MsgBox myDate
End Sub

' Date_ および Index_ を、今回引数として追加。
Sub setBtn(Cmdbtn As MSForms.CommandButton, Date_ As Date, Index_ As Long)
    Set myCmdBtn = Cmdbtn
    ' ↓今回の追加個所↓
    myDate = Date_
    myIndex = Index_
End Sub
ユーザーフォーム
Private Sub UserForm_Initialize()
    Dim i As Long
    Dim myCmdBtn As MSForms.CommandButton
    
    Set myCol = New Collection
    
    ' ↓今回の追加個所↓
    ' 一番左上の日付を求めている。
    Dim my1stDay As Date
        my1stDay = DateSerial(Year(Date), Month(Date), 1)
    Dim myDate As Date
        myDate = my1stDay - WorksheetFunction.Weekday(my1stDay, vbMonday)

    For i = 1 To 42
        Set myCmdBtn = Me.Controls.Add("Forms.CommandButton.1", _
                                               "CommandButton" & i, True)
        With myCmdBtn
            .Left = Me.Width * Rnd * 0.9
            .Top = Me.Height * Rnd * 0.9
            .Width = ButtonSize
            .Height = ButtonSize
            ' ↓今回の変更箇所↓
            ' 通し番号ではなく、日を表示。
            .Caption = Day(myDate)
        End With
        Set myCls = New Class1
        ' ↓今回の変更箇所↓
        ' ボタンに加えて、日付と通し番号を追加。
        myCls.setBtn myCmdBtn, myDate, i
        myCol.Add myCls
        ' ↓今回の変更箇所↓
        ' 日付のカウントアップ。
        myDate = myDate + 1
    Next
    myFlag = False
End Sub

結果、ボタンを押すと、ボタンに割り振られた日付が表示されるようになった。
f:id:Infoment:20181124220751g:plain

ただしこのままでは、何月のカレンダーか分からない。曜日も解らない。
もう少し工夫が必要です。

参考まで。