
今回はカレンダーの外形とシェイプをクリックしたときの動作までとします。
今回の概要
セルを選択するとアイコンが右横に表示されます。

アイコンをクリックするとカレンダーの外形が開きます。

シェイプをクリックするとシェイプの名前がメッセージに表示されます。
この例では、「25」のシェイプをクリックしました。

コード
標準モジュールの中のグローバル変数と OpenCalendar
1ブロックを 縦15 横35 として図形を構成します。
Option Explicit
Private shpHeight As Long
Private shpWidth As Long
Private TBT As Long
Private YBT As Long
Private DBT(1 To 6) As Long
Private BL(1 To 7) As Long
Private Const ColorSunday As Long = vbRed
Private Const ColorSaturday As Long = vbBlue
Private Const ColorWeekday As Long = vbBlack
Private Const ColorPreHome As Long = 5288016
Private Const Firstyobi As Long = vbSunday
Private Yobi As Variant
'---------------------------------------
'
Public Sub OpenCalendar()
Dim I As Long
Dim J As Long
'--------新しくカレンダーを開く前に既存を抹消します。
Call DeleteCal
Yobi = Array("", "日", "月", "火", "水", "木", "金", "土")
'--------シェイプ1ブロックの大きさです。
shpHeight = 15
shpWidth = 35
'--------カレンダーの最も上の位置です。
TBT = ActiveCell.Offset(0, 1).Top
'--------カレンダーの1列目の左の位置です
BL(1) = ActiveCell.Offset(0, 1).Left
'--------曜日のトップの位置です。
YBT = TBT + shpHeight
'--------日付の1段目の位置です。
DBT(1) = YBT + shpHeight
'--------2段目以降の位置です
For I = 2 To 6
DBT(I) = DBT(I - 1) + shpHeight
Next I
'--------日付の2列以降の左端の位置です。
For J = 2 To 7
BL(J) = BL(J - 1) + shpWidth
Next J
Application.ScreenUpdating = False
'--------シェイプを作成します。
Call UpShapes
Application.ScreenUpdating = True
End Sub
図で示すと次のようになります。

シェイプを描画 UpShapes
ただひたすらシェイプを書きます。
難しいところはなく腕力のみです。
'---------------------------------------
'
Private Sub UpShapes()
Dim SHP As Shape
Dim Row As Long
Dim Col As Long
Dim intLogicalDay As Long
Dim Grid As Long
'--------
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(1), _
TBT, shpWidth, shpHeight)
With SHP
.Name = "SHP_PreviousYear"
.OnAction = "ShapeCalendar.PreviousYearClick"
.Fill.ForeColor.RGB = RGB(252, 213, 181)
With .TextFrame2
.MarginTop = 0
With .TextRange
.Text = "▼"
.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(2), _
TBT, shpWidth * 2, shpHeight)
With SHP
.Name = "SHP_TextYaer"
.OnAction = "ShapeCalendar.Dummy"
.Fill.ForeColor.RGB = RGB(221, 221, 221)
With .TextFrame2
.MarginTop = 0
With .TextRange
.Text = ""
.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(4), _
TBT, shpWidth, shpHeight)
With SHP
.Name = "SHP_NextYear"
.OnAction = "ShapeCalendar.NextYearClick"
.Fill.ForeColor.RGB = RGB(146, 246, 166)
With .TextFrame2
.MarginTop = 0
With .TextRange
.Text = "▲"
.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(5), _
TBT, shpWidth, shpHeight)
With SHP
.Name = "SHP_PreviousMonth"
.OnAction = "ShapeCalendar.PreviousMonthClick"
.Fill.ForeColor.RGB = RGB(252, 213, 181)
With .TextFrame2
.MarginTop = 0
With .TextRange
.Text = "▼"
.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(6), _
TBT, shpWidth, shpHeight)
With SHP
.Name = "SHP_TextMonth"
.OnAction = "ShapeCalendar.Dummy"
.Fill.ForeColor.RGB = RGB(221, 221, 221)
With .TextFrame2
.MarginTop = 0
With .TextRange
.Text = ""
.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(7), _
TBT, shpWidth, shpHeight)
With SHP
.Name = "SHP_NextMonth"
.OnAction = "ShapeCalendar.NextMonthClick"
.Fill.ForeColor.RGB = RGB(146, 246, 166)
With .TextFrame2
.MarginTop = 0
With .TextRange
.Text = "▲"
.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
'--------
For Col = 1 To 7
intLogicalDay = (((Col - 1) + (Firstyobi - 1)) Mod 7) + 1
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(Col), _
YBT, shpWidth, shpHeight)
With SHP
.Name = "SHPY" & Format(Col, "00")
.OnAction = "ShapeCalendar.Dummy"
.Fill.ForeColor.RGB = RGB(221, 221, 221)
With .TextFrame2
.MarginTop = 0
With .TextRange
.Text = Yobi(intLogicalDay)
.Font.Size = 10
If intLogicalDay = 1 Then
.Font.Fill.ForeColor.RGB = RGB(255, 0, 0)
ElseIf intLogicalDay = 7 Then
.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
Else
.Font.Fill.ForeColor.RGB = ColorWeekday
End If
End With
End With
End With
Call ShapeHyozi(SHP)
Next Col
'--------
For Row = 1 To 6
For Col = 1 To 7
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(Col), _
DBT(Row), shpWidth, shpHeight)
Grid = Col + (Row - 1) * 7
With SHP
.OnAction = "ShapeCalendar.DateClick"
.Name = "SHPD" & Format(Grid, "00")
.Fill.ForeColor.RGB = RGB(221, 221, 221)
With .TextFrame2
.MarginTop = 2
With .TextRange
.Text = Grid
.Font.Fill.ForeColor.RGB = ColorWeekday
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
Next Col
Next Row
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(1), _
DBT(6) + shpHeight, shpWidth * 2, shpHeight)
With SHP
.Name = "SHP_HOME"
.OnAction = "ShapeCalendar.GoHome"
.Fill.ForeColor.RGB = RGB(221, 221, 221)
With .TextFrame2
.MarginTop = 1
With .TextRange
.Text = "HOME"
.Font.Fill.ForeColor.RGB = ColorSaturday
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(3), _
DBT(6) + shpHeight, shpWidth * 2, shpHeight)
With SHP
.Name = "SHP_PREHOME"
.OnAction = "ShapeCalendar.GoPreHome"
.Fill.ForeColor.RGB = RGB(221, 221, 221)
With .TextFrame2
.MarginTop = 1
With .TextRange
.Text = "preHOME"
.Font.Fill.ForeColor.RGB = ColorPreHome
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
Set SHP = ActiveSheet.Shapes.AddShape(1, BL(5), _
DBT(6) + shpHeight, shpWidth * 3, shpHeight)
With SHP
.Name = "SHP_CANCEL"
.OnAction = "ShapeCalendar.DeleteCal"
.Fill.ForeColor.RGB = RGB(221, 221, 221)
With .TextFrame2
.MarginTop = 1
With .TextRange
.Text = "CANCEL"
.Font.Fill.ForeColor.RGB = ColorSunday
.Font.Size = 10
End With
End With
End With
Call ShapeHyozi(SHP)
End Sub
'---------------------------------------
'
Private Sub ShapeHyozi(ByRef myShape As Shape)
With myShape
.Line.Visible = msoTrue
.Line.ForeColor.RGB = RGB(166, 166, 166)
.Line.Weight = 0.5
.Fill.Visible = msoTrue
.Fill.Solid
.Placement = xlFreeFloating
.Locked = msoTrue
With .TextFrame2
.HorizontalAnchor = msoAnchorCenter
With .TextRange
.ParagraphFormat.Alignment = msoAlignCenter
End With
End With
End With
End Sub
登録するアクション群
今回のアクションは、クリックしたシェイプの名前をメッセージで表示することにしました。
シェイプはコントロールのようなイベントを持っていないので、最初これをどうやっていいのか全く分かりませんでした。
調べて行き着いたところが、Application.Caller でした。
'---------------------------------------
'
Private Sub NextYearClick()
MsgBox Application.Caller
End Sub
'---------------------------------------
'
Private Sub PreviousYearClick()
MsgBox Application.Caller
End Sub
'---------------------------------------
'
Private Sub NextMonthClick()
MsgBox Application.Caller
End Sub
'---------------------------------------
'
Private Sub PreviousMonthClick()
MsgBox Application.Caller
End Sub
'---------------------------------------
'
Private Sub DateClick()
MsgBox Application.Caller
End Sub
'---------------------------------------
'
Private Sub GoHome()
MsgBox Application.Caller
End Sub
'---------------------------------------
'
Private Sub GoPreHome()
MsgBox Application.Caller
End Sub
'---------------------------------------
'
Private Sub Dummy()
MsgBox Application.Caller
End Sub