
目的の機能
セルを選択するとそのセルの右横にアイコンを表示します。

アイコンをクリックすると Shape で作成したカレンダーが開きます。

カレンダーの日にちをクリックすると、カレンダーを呼び出したセルに日にちがセットされます。

セルを選択すると Icon を表示
今回は、セルを選択するとアイコンを表示して、そのアイコンをクリックするとメッセージが表示されるところまでとします。
シートのモジュール
すべてのセルを対象にするのではなく、書式で日付のフォーマットが推測されるセルのみとします。
そのセルが選択されたなら、プロシージャ DispCalendarIcon を実行します。
Option Explicit
'---------------------------------------
'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim DateFormats As Variant
Dim DateFormat As Variant
DateFormats = Array("yyyy/mm/dd", "yy/m/d", "yy/mm/dd", _
"d""日""", "dd""日""", "d/m/yyyy", _
"dd/mm/yyyy", "ggge", "ge")
Call DeleteCal
For Each DateFormat In DateFormats
If InStr(Target.NumberFormatLocal, DateFormat) > 0 Then
Call DispCalendarIcon
Exit For
End If
Next
End Sub
例では、アイコンを APPTS.ICO としていますが、1041の中から気に入ったものを選べばいいでしょう。
名前は、SHPが付く名称にしてください。プロシージャ DeleteCal で削除対象にします。
アイコンをクリックしたときの動作は OnAction に登録します。この例では、標準モジュール ShapeCalendar の中にある OpenCalendar を指定しています。
'---------------------------------------
'
Private Sub DispCalendarIcon()
Dim SHP As Object
Set SHP = ActiveSheet.Pictures. _
Insert(Application.Path & "\FORMS\1041\APPTS.ICO")
With SHP
'-----アクティブセルの1つ右のセル
.Left = ActiveCell.Offset(0, 1).Left + 5
.Top = ActiveCell.Offset(0, 1).Top + 2
'-----名前
.Name = "SHPIcon"
'-----クリックしたときの動作
.OnAction = "ShapeCalendar.OpenCalendar"
.PrintObject = msoFalse
.Placement = xlMove
.Locked = msoTrue
End With
End Sub
標準モジュール ShapeCalendar
標準モジュールを挿入して、このオブジェクト名を ShapeCalendar とします。
アイコンをクリックしたとき実行されるプロシージャを作成します。名前を OpenCalendar とします。
最終的には、MasBox のところにカレンダーを作成する処理を書きます。
Option Explicit
'---------------------------------------
'
Public Sub OpenCalendar()
MsgBox "アイコンをクリックした。"
End Sub
Shape で作成するカレンダーは、Shape を60個ほど作成します。これらを削除するときに実行します。
また、アイコンを削除するときにも実行します。
そして、名前に SHP がつくもののみ削除の対象とします。
'---------------------------------------
'
Public Sub DeleteCal()
Dim SHP() As String
Dim Sp As Shape
Dim objRange As Object
Dim iCount As Long
Dim I As Long
'-----シェイプがなければ終了
If ActiveSheet.Shapes.Count = 0 Then
Exit Sub
End If
'-----名称がSHPから始まるシェイプの拾い上げ
ReDim SHP(1 To ActiveSheet.Shapes.Count)
iCount = 0
For Each Sp In ActiveSheet.Shapes
If InStr(1, Sp.Name, "SHP") > 0 Then
iCount = iCount + 1
SHP(iCount) = Sp.Name
End If
Next Sp
'-----なければ終わり
If iCount = 0 Then
Exit Sub
End If
'-----シェイプの一括削除のため一括選択
ReDim Preserve SHP(1 To iCount)
Set objRange = ActiveSheet.Shapes.Range(SHP)
objRange.Select
'-----一括削除の実行
objRange.Delete
End Sub
シートのアイコンをクリック
今回のコードでは、アイコンをクリックすると「アイコンをクリックした。」が表示されます。

VBエディターの雰囲気
必要のない Solver、xlwings も表示されていますが無視してください。
