「カレンダー入力」用フォーム:アドイン版

前頁の「カレンダー入力用フォーム」では実装が難しいと思われていた方へ

       
   
 


VBA
 
 


VBA
 
 




 
 


シート上で「カレンダー入力フォーム」を表示させたところ
 



項目内容
日付セルの指定 日付セルは予め呼び出しワークブック側のソースコードで指定する仕組みです。
ですから若干のソースコードの作成が必要になりますが、下記のサンプルで説明する程度の簡単なものです。 これらにより「日付セル」として指定されたセルだけカレンダーが表示され、それ以外のセルではカレンダーは表示されません。
呼び出し方法 日付セルをマウスでダブルクリックするか、日付セルを選択した状態でF4キーを押すことでカレンダーが表示されます。



本プログラムのカレンダーでの日付入力はあくまで「入力補助」であり「強制」ではありません。
Excelではセルに対して「月日」のみの入力で「年」を含めた日付が入力できるためこのようなカレンダーでの日付入力はニーズが薄いと思われがちですが、 年末年始近辺での作業で「月日」のみの入力でよく誤りが起きることはご存じだと思います。 ここでカレンダーでの日付入力を通常に運用されていればこのような誤りは軽減されるでしょう。
カレンダー上での操作 カレンダー上で所望する日付をクリックするか、青反転の日付カーソルを上下左右の矢印キーで移動させてEnterキーを押すことで 日付が決定され日付セルにその日付が入力され、カレンダーは閉じられます。 カレンダーを表示させてから不要になった場合は右上の×ボタンかEscキーで閉じられます。



この他年月の切り替えなどを含めてキーボードでの操作にも留意しており、青反転の日付カーソルを上下左右の矢印キーで移動させる時に現在表示月の範囲を超える場合は 自動的に年月が変更されるなどの対応を行なっています。それぞれは次の表で説明します。
カレンダーの表示位置 カレンダーは上記画像のように呼び出した日付セルの直下に表示されます。 この状態でカレンダーがディスプレィスクリーンからはみ出してしまう場合は直上に表示されます。
表示初回年月 日付セルからカレンダーが呼び出された初回は、日付セルに既に日付が入力されている場合はその日付の年月が選択された状態で表示され、 日付セルに日付が入力されていない場合は処理日(システム日付)の年月が選択された状態で表示されます。
表示年月の変更 カレンダー上部の年月表示からの変更は、カレンダー上部左右の矢印(←、→)の他、 カレンダー上部の年月表示の「年」「月」をマウスでクリックするとプルダウンが表示されるので、直接「年」「月」を変更することも可能です。 キーボードからの年月変更については次の表で説明します。
曜日並びの変更 曜日並びはデフォルトでは上の画像のように一般的なカレンダーと同じで日曜日が左端となる順序ですが、サンプルからコピーしていただく定数の変更だけで 月曜日が左端となる順序に変更できます。
祝日の表示 本プログラムのカレンダーは日本の政令での祝日に対応しており、祝日は上の画像で見られるように赤字で表示されます。 この赤字の日付をマウスでポイントすると祝日名がカレンダー下部のステータス領域に表示されます。



20192021年は天皇誕生日の変更や東京五輪による祝日移動、さらには東京五輪延期による移動などがあり、 本カレンダーもそれらの祝日にも対応しております。
アドインにしたことによる祝日処理への影響は利点・欠点が共にあり、下記で説明しています。
Excelで利用できるカレンダー機能は多数公開されていると思いますが、利用目的や機能、制限事項などはさまざまなようです。 本プログラムはサンプルを含めて動作確認ができるので上記の項目などを確認してご利用いただければと思います。



キーボード入力での各キーの機能は以下のようになっています。(前頁と同じです)
押下キー動作機能
→、Tab、+、6(テンキー)翌日に移動します。(表示範囲を超えると自動的に翌月に移動します。)
←、Shift+Tab、-、4(テンキー)前日に移動します。(表示範囲を超えると自動的に前月に移動します。)
↓、2(テンキー)翌週の同曜日に移動します。(表示範囲を超えると自動的に翌月に移動します。)
↑、8(テンキー)前週の同曜日に移動します。(表示範囲を超えると自動的に前月に移動します。)
Home表示月の月初(1日)に移動します。
End表示月の月末(末日)に移動します。
PageDown翌月に移動します。
PageUp前月に移動します。
F12翌年同月に移動します。
F11前年同月に移動します。
Enter日付を決定してカレンダー入力フォームを閉じます。
Escキャンセルしてカレンダー入力フォームを閉じます。
 






 
 Excel
 


Excel
 (VBA)  Excel
 
 Excel  
 


Excel  
 
   
 



 
優劣 項目 内容
利点 必要VBA知識 カレンダーに関する主たる機能部分を全てアドインに収容してブラックボックス化し、利用ワークブックに対しては必要機能を「関数」として提供しているので、 アドイン呼び出しと「関数」利用部分についてサンプルを元に組み込んでいただくことで、簡単に機能するようにできると思います。
VBAの知識はある程度必要ですが、サンプルのソースコードもほとんどはそのままコピーするだけで良く、ワークシート関連での変更箇所はコピーのままで良いところと分けて明記してあります。
実装作業 カレンダーの呼び出し部分は呼び出し元のワークブック側に実装する必要がありますが、前頁のように全機能を実装するのではなく、 呼び出し部分のみなので実装のための作業が大幅に少なくて済みます。
カレンダー機能を実装したいワークブックが多数ある場合などは作業コストの軽減にも繋がります。
アドインの配置先 「主機能をアドイン化する」という時点で「ではアドインはどこに置くのか」という新たな選択肢が発生します。
提供サンプルのままだと、アドインは利用ワークブックと同じフォルダに配置することになりますが、 社内ネットワークが完備している環境であれば配置先(パス)を明示しての社内での一元化も可能です。
利用ワークブックからアドインが参照できない場合は、当サイトからWeb参照されるようになっています。
祝日情報の管理 上記と重複しますが、祝日法の改正などの対応についてもアドインが社内で一元化できていれば、 一元化された場所のアドインを最新に置き換える(上書きコピー)だけで対応できます。
バージョン更新 上記同様にこれらの機能改廃(不具合対応含む)についても 一元化された場所のアドインを最新に置き換える(上書きコピー)だけです。 社内に新旧のバージョンが混在するような状況も避けられます。
欠点 レスポンス 初回にカレンダー等の本機能を呼び出す時に裏でアドインファイルが開かれるため、この初回に限って若干動作レスポンスが悪くなります。 実際の動作レスポンスについては前頁のサンプルと比べてご確認下さい。



元々、アドイン化を対応から外していたのはこの動作レスポンスを考えてのことでしたが、現在の事務用の主力PCであれば初回のカレンダー起動で秒単位に待たされるようなことはありませんでした。
祝日パラメータ 前頁での説明は「祝日パラメータ」については利用者側で変更ができるとしていましたが、 今回のアドインについては内部非公開であり、かつ「祝日パラメータシート」を使わない方法としています。
これは多分に動作レスポンスを意識してのものですが、ソースコード非公開については「VBA初心者向け」での配慮でもあります。
対応範囲 前頁のものはワークシートの他、ユーザーフォームでの利用に対応していましたが、 アドインに関しては現在の実装上でワークシートの対応のみとしています。
ユーザーフォームで利用される方はそもそもVBAの知識もある程度お持ちであろうと考えますので、 前頁のサンプルでの方法をご検討下さい。
環境設定 アドインを配置するフォルダを「信頼できる場所」に登録するなどセキュリティ上の設定が必要になります。
 
VBA
 




VBA
 2
 



 
 Excel
 


F4
 使F4
 F4InternetExplorer(DateTimePicker)
 



 F4  VBA  F4Excel  
 
 
 BE
 Sheet4
 


 
 
 




VBA  
 
プロジェクトを表示させたところ
Visual Basic Editor(VBE)(Alt+F11)()  VBAProject2AddinCalendar6R.xlamCalendar61.xlsm
 


AddinCalendar6R.xlam
 Excel    
 


Calendar61.xlsm
 
 


   
 


Calendar61.xlsm  ThisWorkbook
 Calendar61.xlsm4ThisWorkbookmodAboutCalendar6  6
43
 
 Microsoft Scripting Runtime()
 
modAboutCalendar6 ()
 modAboutCalendar6
   modAboutCalendar6

'***************************************************************************************************
'   カレンダーフォーム関連モジュール                        ※modAboutCalendar6(Module)
'
'   参照設定:Microsoft Scripting Runtime
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'23/01/22(2.00)新規作成(シート上でのキー入力に対するカレンダー表示機能追加の対応)
'***************************************************************************************************
Option Explicit
Option Private Module
'===================================================================================================
' カレンダー表示関連定数(公開)
'---------------------------------------------------------------------------------------------------
' カレンダーアドイン所在フォルダ名(ブランクの場合は本ブックのフォルダ)
Private Const g_cnsAddinPath As String = ""
' カレンダーフォームのタイトル
Private Const g_cnsCalCaption As String = "日付選択"
' カレンダーフォームの週開始曜日(1=日曜日、2=月曜日)
Private Const g_cnsStartYobi As Integer = 1                         ' 日曜日
'Private Const g_cnsStartYobi As Integer = 2                         ' 月曜日

'###################################################################################################
' ※ここから下は一切変更せずにご利用下さい。
'###################################################################################################
                                    ・
                                    ・
                                    ・

'----------------------------------------<< End of Source >>----------------------------------------
 modAboutCalendar6  2603
 
 
定数内容
g_cnsAddinPath アドインの配置先フォルダのフルパスを指定する項目です。
このようにブランクとする場合は実行するワークブックと同じフォルダでアドインを開く動作になります。 この指定箇所にアドイン「AddinCalendar6R.xlam」が存在しない場合は、当サイトからWeb参照で開くように動作します。
アドインの配置先フォルダはExcelのトラストセンターで「信頼できる場所」に登録して下さい。
g_cnsCalCaption 実行時に表示されるカレンダーフォームのタイトルです。
g_cnsStartYobi 実行時に表示されるカレンダーフォームの開始曜日の指定です。 「2」に変更すると月曜日始まりになります。 「2」以外は全て日曜日始まりです。
「※ここから下は一切変更せずにご利用下さい。」より下にはこの他の定数・変数や実際にアドインとやりとりを行なう関数等が配置されていますが、 原則として利用者が変更を行なうものではないのでこの説明には記載していません。

Sheet1,Sheet2... (各ワークシートクラス)
各ワークシートに必要なのは日付入力を行なうセルをダブルクリックした時にカレンダーを表示させるイベントの記述で、これはワークシートごとの記述となります。 この際に「日付入力セルかどうか」の判定を行ないますが、これもワークシートごとに設定するようになっています。

'***************************************************************************************************
'   カレンダーフォーム表示テスト                                Sheet1(Class)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'23/01/22(2.00)新規作成
'***************************************************************************************************
Option Explicit
'===================================================================================================
' シート上の日付セルアドレス
Private Const g_cnsDateCellAdress = "$A$1,$A$9,$D$13,$B$17,$G$18,$E$21,$C$25,$H$27:$I$28,$F$30"

'###################################################################################################
' ※ここから下は一切変更せずにご利用下さい。
'###################################################################################################
                                    ・
                                    ・
                                    ・

'----------------------------------------<< End of Source >>----------------------------------------
利用者に設定していただくのはこの「日付入力セルかどうか」の判定のための定数「g_cnsDateCellAdress」のみです。
これは「カレンダーフォームの表示①」シートの記述例です。「カレンダーフォームの表示②」シートのように列全体になると、

' シート上の日付セルアドレス
Private Const g_cnsDateCellAdress = "$B$2:$B$1048576,$E$2:$E$1048576"
 
 
 g_cnsDateCellAdress
   
 
 
ThisWorkbook ()
 ThisWorkbook  

'***************************************************************************************************
'   カレンダーフォーム表示テスト                                ※ThisWorkbookイベント(Class)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'23/01/22(2.00)新規作成
'***************************************************************************************************
Option Explicit

'***************************************************************************************************
'   ■■■ ワークブックイベント ■■■
'***************************************************************************************************
'* 処理名 :Workbook_Open
'* 機能  :開くイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(既定)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2023年01月22日
'* 作成者 :井上 治
'* 更新日 :2023年01月22日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub Workbook_Open()
    '-----------------------------------------------------------------------------------------------
    Dim dteHoliUpdate As Date                                       ' 祝日情報更新日
    Dim dteAddinUpdate As Date                                      ' アドイン更新日
    Dim strAddinVersion As String                                   ' アドインバージョン
    ' カレンダーバージョン取得
    Call modAboutCalendar6.GetCalendarVer(dteHoliUpdate, strAddinVersion, dteAddinUpdate)
    ' ※この記述は本サンプル限定⇒必須ではありません
    ' カレンダーフォームの表示シート
    With ThisWorkbook.Worksheets(1)
        .Select
        .Protect UserInterfaceOnly:=True
        .Cells(1, 7).Value = "祝日パラメータ更新日:" & Format(dteHoliUpdate, "yyyy/MM/dd")
        .Cells(2, 7).Value = "カレンダーモジュールVer:" & strAddinVersion & _
            "(" & Format(dteAddinUpdate, "yy/MM/dd") & ")"
    End With
    ' 保存済みにする
    ThisWorkbook.Saved = True
End Sub

'###################################################################################################
' ※ここから下は一切変更せずにご利用下さい。
'###################################################################################################
                                    ・
                                    ・
                                    ・

'----------------------------------------<< End of Source >>----------------------------------------
 Workbook_Open
 Workbook_WindowActivateWorkbook_WindowDeactivate  F4F4  F4
 Workbook_Open  Workbook_OpenF4  ThisWorkbook
 Workbook_Open    
 
 


()
 Excel    
 

   
 
 


 
 





 
 
ダウンロードはこちら。
←ExcelCalendar6.zip
      (199KB)

Vectorからも「カレンダー入力フォーム(Calendar6:アドイン版)でダウンロードできます。