42個のコマンドボタンに日付を振ってみる
昨日は、ユーザーフォーム上にコマンドボタンをばらまいて、それをじわじわと集合させてみた。
infoment.hatenablog.com
そこで今回は、この42個のボタンを使って11月のカレンダーを作成してみる。
既に下地はできている。そこでまず、6行×7列の一番左上にくる日付を求める。
作成するカレンダーを、当月のカレンダーとした場合、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
結果、ボタンを押すと、ボタンに割り振られた日付が表示されるようになった。
ただしこのままでは、何月のカレンダーか分からない。曜日も解らない。
もう少し工夫が必要です。
参考まで。