私も、何らかの形で同じジレンマに遭遇しました。なぜ、ExcelVBAにがないのですかDate Picker
。私たち全員のために何かを作成するために素晴らしい仕事をしてくれたシドに感謝します。
それでも、自分で作成する必要があるところまで来ました。そして、私はここに投稿しています。多くの人がこの投稿にアクセスし、その恩恵を受けていると確信しているからです。
私がしたことは、一時的なワークシートを使用しないことを除いて、Sidが行うことと同じように非常に単純でした。計算は非常に単純で簡単なので、他の場所にダンプする必要はないと思いました。カレンダーの最終出力は次のとおりです。

設定方法:
- 42
Label
個のコントロールを作成し、順番に名前を付けて、左から右、上から下に配置します(このラベルには、上から灰色25
までの灰色が含まれてい5
ます)。Label
コントロールの名前をLabel_01、Label_02などに変更します。42個のラベルすべてのTag
プロパティをに設定しdts
ます。
Label
ヘッダー用にさらに7つのコントロールを作成します(これにはSu、Mo、Tu ...が含まれます)
- さらに2つのコントロールを作成します
Label
。1つは水平線(高さを1に設定)用で、もう1つは月と年の表示用です。Label
月と年の表示に使用される名前Label_MthYr
- 2つのコントロールを挿入
Image
します。1つは前月をスクロールするための左アイコンを含み、もう1つは翌月をスクロールするためのものです(私は単純な左矢印と右矢印の頭のアイコンを好みます)。名前を付けImage_Left
てImage_Right
レイアウトは多かれ少なかれこのようにする必要があります(私はこれを使用する人に創造性を任せます)。

宣言:
選択した現在の月を保持するために、一番上に1つの変数を宣言する必要があります。
Option Explicit
Private curMonth As Date
プライベート手順と機能:
Private Function FirstCalSun(ref_date As Date) As Date
'/* returns the first Calendar sunday */
FirstCalSun = DateSerial(Year(ref_date), _
Month(ref_date), 1) - (Weekday(ref_date) - 1)
End Function
Private Sub Build_Calendar(first_sunday As Date)
'/* This builds the calendar and adds formatting to it */
Dim lDate As MSForms.Label
Dim i As Integer, a_date As Date
For i = 1 To 42
a_date = first_sunday + (i - 1)
Set lDate = Me.Controls("Label_" & Format(i, "00"))
lDate.Caption = Day(a_date)
If Month(a_date) <> Month(curMonth) Then
lDate.ForeColor = &H80000011
Else
If Weekday(a_date) = 1 Then
lDate.ForeColor = &HC0&
Else
lDate.ForeColor = &H80000012
End If
End If
Next
End Sub
Private Sub select_label(msForm_C As MSForms.Control)
'/* Capture the selected date */
Dim i As Integer, sel_date As Date
i = Split(msForm_C.Name, "_")(1) - 1
sel_date = FirstCalSun(curMonth) + i
'/* Transfer the date where you want it to go */
MsgBox sel_date
End Sub
画像イベント:
Private Sub Image_Left_Click()
If Month(curMonth) = 1 Then
curMonth = DateSerial(Year(curMonth) - 1, 12, 1)
Else
curMonth = DateSerial(Year(curMonth), Month(curMonth) - 1, 1)
End If
With Me
.Label_MthYr.Caption = Format(curMonth, "mmmm, yyyy")
Build_Calendar FirstCalSun(curMonth)
End With
End Sub
Private Sub Image_Right_Click()
If Month(curMonth) = 12 Then
curMonth = DateSerial(Year(curMonth) + 1, 1, 1)
Else
curMonth = DateSerial(Year(curMonth), Month(curMonth) + 1, 1)
End If
With Me
.Label_MthYr.Caption = Format(curMonth, "mmmm, yyyy")
Build_Calendar FirstCalSun(curMonth)
End With
End Sub
これを追加して、ユーザーがラベルをクリックしているように見せ、Image_Right
コントロールでも実行する必要があります。
Private Sub Image_Left_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Me.Image_Left.BorderStyle = fmBorderStyleSingle
End Sub
Private Sub Image_Left_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Me.Image_Left.BorderStyle = fmBorderStyleNone
End Sub
ラベルイベント:
これはすべて、42個のラベルすべてに対して実行する必要があります(Label_01
〜Lable_42
)
ヒント:最初の10個を作成し、残りのラベルを検索して置換するだけです。
Private Sub Label_01_Click()
select_label Me.Label_01
End Sub
これは、日付にカーソルを合わせて効果をクリックするためのものです。
Private Sub Label_01_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Me.Label_01.BorderStyle = fmBorderStyleSingle
End Sub
Private Sub Label_01_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Me.Label_01.BackColor = &H8000000B
End Sub
Private Sub Label_01_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
Me.Label_01.BorderStyle = fmBorderStyleNone
End Sub
ユーザーフォームイベント:
Private Sub UserForm_Initialize()
'/* This is to initialize everything */
With Me
curMonth = DateSerial(Year(Date), Month(Date), 1)
.Label_MthYr = Format(curMonth, "mmmm, yyyy")
Build_Calendar FirstCalSun(curMonth)
End With
End Sub
繰り返しになりますが、日付にカーソルを合わせると効果があります。
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
With Me
Dim ctl As MSForms.Control, lb As MSForms.Label
For Each ctl In .Controls
If ctl.Tag = "dts" Then
Set lb = ctl: lb.BackColor = &H80000005
End If
Next
End With
End Sub
以上です。これは生であり、あなたはそれにあなた自身のひねりを加えることができます。
私はこれをしばらく使用していますが、問題はありません(パフォーマンスと機能の面で)。
まだですが、Error Handling
簡単に管理できると思います。
実際、効果がなければ、コードは短すぎます。
あなたはあなたの日付がselect_label
手順のどこに行くかを管理することができます。HTH。