柴犬はイルミネーションの中にいます。
今回の概要
セルを選択します。
カレンダーが開きます。
空のセルですので初期値はこの日にちが黄色で表示されます。
クリックして22日を選択しました。
続けて22日をクリックします。
選択した日付がセルにセットされました。
22日をクリックする前に移り、25日のしたの小さい字の2(12月2日)をクリックしてみます。
直ちに12月のカレンダーが表示され2日が選択された表示になっています。
想定した動作となっています。
追加修正コード
OpenCalendar
インクリメントの列挙型の追加と、選択したシェイプの名前を登録する変数を追加しています。
略 Kanrei = 13 End Enum '--------追加します。 Private Enum IncFlg IncForward = 0 IncBackward = -1 End Enum Private shpHeight As Long Private shpWidth As Long 略 Private StartPosi As Long Private DaysAndWeeks() As Long '--------追加します。 Private SelectShape As String
アクション群
全面的に書き直しています。
'--------------------------------------- ' Private Sub NextYearClick() Call NextYear End Sub '--------------------------------------- ' Private Sub PreviousYearClick() Call PreviousYear End Sub '--------------------------------------- ' Private Sub NextMonthClick() Call NextMonth End Sub '--------------------------------------- ' Private Sub PreviousMonthClick() Call PreviousMonth End Sub '--------------------------------------- ' Public Sub NextYear() Call IncChageDraw(IntvYear, IncForward) End Sub '--------------------------------------- ' Public Sub PreviousYear() Call IncChageDraw(IntvYear, IncBackward) End Sub '--------------------------------------- ' Public Sub NextMonth() Call IncChageDraw(IntvMonth, IncForward) End Sub '--------------------------------------- ' Public Sub PreviousMonth() Call IncChageDraw(IntvMonth, IncBackward) End Sub '--------------------------------------- ' Private Sub GoHome() Call MoveToToday(UseCurYear:=True) End Sub '--------------------------------------- ' Private Sub GoPreHome() Call MoveToToday(UseCurYear:=False) End Sub
IncChageDraw
インクリメントしたときの動作を書きます。
'--------------------------------------- ' Private Sub IncChageDraw(ByVal intvMove As String, _ ByVal DT As IncFlg) Dim IncDate As Date Dim iInc As Long Dim Grid As Long '--------インクリメントの方向を決めます。 If DT = IncForward Then iInc = 1 Else iInc = -1 End If '--------インクリメントした日付を求めます。 IncDate = DateAdd(intvMove, iInc, CurDate) '--------表示年月日(CurDate/CurDay..)をセットします。 Call StartValues(IncDate) '--------年と月を表示します。 Call DrawYearMonth '--------日にちを描画します。 ' DaysAndWeeks の更新が必要 Call DaysDraw '--------黄色を戻します。 With ActiveSheet.Shapes(SelectShape) .Fill.ForeColor.RGB = RGB(221, 221, 221) End With '--------日にち(CurDay)を黄色に塗ります。 Call YellowPaint End Sub
MoveToToday
HOME はオープン時の日にちに戻し、PreHOME 表示する年は変えず月と日をオープン時に戻します。
'--------------------------------------- ' Private Sub MoveToToday(UseCurYear As Boolean) '--------戻る日付を求めます。 If UseCurYear Then CurYear = HoldYear End If CurMonth = HoldMonth CurDay = HoldDay CurDate = DateSerial(CurYear, CurMonth, CurDay) '--------年と月を表示します。 Call DrawYearMonth '--------日にちを描画します。 ' DaysAndWeeks の更新が必要 Call DaysDraw '--------黄色を戻します。 With ActiveSheet.Shapes(SelectShape) .Fill.ForeColor.RGB = RGB(221, 221, 221) End With '--------日にち(CurDay)を黄色に塗ります。 Call YellwPaint End Sub
DateClick
DateClick を書き直し、DateClickShape を追加します。
初回選択で選択したシェイプを黄色に塗り、続けて2回目のクリックで決定としアクティブセルに日付をセットします。
'--------------------------------------- ' Private Sub DateClick() Dim myCaller As String '--------マクロを呼び出したオブジェクトの名前 myCaller = Application.Caller '--------シェイプにテキストデータがない If Len(ActiveSheet.Shapes(myCaller).TextFrame2.TextRange.Text) = 0 Then Exit Sub End If '--------2回連続でクリックされた場合、決定しアクティブセルに日付をセットします。 If (SelectShape = myCaller) Then ActiveCell.Value = CurDate Call DeleteCal '--------新しい選択のシェイプを描画します。 Else Call DateClickShape(myCaller) End If End Sub '--------------------------------------- ' Private Sub DateClickShape(NewSelect As String) Dim Grid As Long '--------シェイプの名前から Grid を求めます。 Grid = Replace(NewSelect, "SHPD", "") '--------シェイプが属する月と表示する月が異なる場合 If CurMonth <> DatePart(IntvMonth, DaysAndWeeks(Grid)) Then '--------表示年月日(CurDate/CurDay..)をセットします。 Call StartValues(DaysAndWeeks(Grid)) '--------年と月を表示します。 Call DrawYearMonth '--------日にちを描画します。 ' DaysAndWeeks の更新が必要 Call DaysDraw Else '--------一部の更新します。 CurDate = DaysAndWeeks(Grid) CurDay = DatePart(IntvDay, CurDate) End If '--------黄色を戻します。 With ActiveSheet.Shapes(SelectShape) .Fill.ForeColor.RGB = RGB(221, 221, 221) End With '--------日にち(CurDay)を黄色に塗ります。 Call YellowPaint End Sub
OpenDraw
オープン時の初期日にちを黄色に塗ります。
'--------------------------------------- ' Private Sub OpenDraw() 略 '--------日にちを描画します。 Call DaysDraw '--------日にち(CurDay)を黄色に塗ります。(追加) Call YellowPaint End Sub
YellowPaint
新しく追加します。
選択された日にち(シェイプ)からシェイプの名前を求め黄色に塗ります。
'--------------------------------------- ' Private Sub YellowPaint() Dim Grid As Long Dim SpName As String '--------選択されたシェイプの名前を求めます。 Grid = StartPosi + CurDay - 1 SpName = "SHPD" & Format(Grid, "00") '--------選択シェイプに登録します。 SelectShape = SpName With ActiveSheet.Shapes(SpName) '--------黄色にします。 .Fill.ForeColor.RGB = RGB(255, 255, 0) End With End Sub