EventChangeConvYYMMtoDate|数字4桁の入力で日付を自動入力する
- yuji fukami
- 2 日前
- 読了時間: 5分
この部品でできること
EventChangeConvYYMMtoDate は、日付の表示形式が設定されたセルに、2〜4桁の数字を入力するだけで日付に自動変換するExcel VBAの汎用プロシージャです。
セルの表示形式が「年(Y)」「月(M)」「日(D)」をすべて含む日付書式のときだけ動作する
入力した数字の桁数に応じて「月」と「日」に分割し、その日付をセルに書き戻す
今日が12月に1月の日付を入れたら翌年、1月に12月の日付を入れたら前年、と年跨ぎを自動補正する
「1245」や「1401」のように存在しない日付を入れたときは、セルを空白に戻す
下の動画は、実際の動作デモンストレーションです。日付書式のセルに数字を打つだけで、月日が入力されていく様子を実演しています。
使いどころ
日報・予定表・明細表など、日付を何度も入力するシートで、月日の入力をキーボードだけで済ませたいとき
「/」や「-」を打たずに、テンキーの数字だけで日付を入れたいとき
入力ミス(ありえない月日)を自動で弾いて、無効な値がセルに残らないようにしたいとき
コード
下記をそのまま標準モジュールに貼り付ければ動作します(依存する自作関数はありません)。末尾のコメントに、シートの Worksheet_Change イベントから呼び出す使い方を示しています。
使い方・引数
この部品は、単独で呼び出す通常のプロシージャではなく、シートの変更を検知する Worksheet_Change イベントから呼び出して使うイベント補助プロシージャです。引数の Target(Range)には、値が変更されたセルが渡されます。
設置手順は次のとおりです。
上のコードを標準モジュール(例では Mod01_)に貼り付ける
日付入力を効かせたいシートのコード(プロジェクトエクスプローラーで対象シートをダブルクリックして開くシートモジュール)に、Worksheet_Change イベントを書く
その中から EventChangeConvYYMMtoDate(Target) を呼び出す
シートモジュールに書くコードは、コード末尾のコメントで示されているとおり、次の形です。
Worksheet_Change はそのシートのセルの値が変わるたびに自動で呼ばれるイベントです。ここで Target(変更されたセル)をそのまま EventChangeConvYYMMtoDate に渡すことで、対象シートのどのセルに数字を入れても、日付書式のセルであれば自動変換が働くようになります。
なお、部品側では変換した値をセルに書き戻す際、一時的に Application.EnableEvents = False にしています。これは、書き戻しがふたたび Worksheet_Change を呼んで無限ループになるのを防ぐためです。
仕組みの解説
コードの流れに沿って、動作を順番に説明します。
まず、変更されたセルの表示形式(NumberFormat)を取得し、大文字に変換したうえで「Y」「M」「D」がすべて含まれているかを判定します。3つとも含む=年月日を表す日付書式のときだけ処理を続け、そうでなければ何もしません。つまり、日付書式が設定されていないセルに数字を入れても変換は起きません。
次に、入力値が数字であること、桁数が2桁・3桁・4桁のいずれかであることを確認します。これ以外は対象外です。
桁数ごとに、次のルールで「月」と「日」に分割します。
2桁「11」→ 先頭1桁が月、残り1桁が日 → 1月1日
3桁「111」→ 先頭1桁が月、残り2桁が日 → 1月11日
4桁「1111」→ 先頭2桁が月、残り2桁が日 → 11月11日
年は今日の年を基準にしますが、年跨ぎを補正します。今日が12月のときに1月の日付を入れたら翌年、今日が1月のときに12月の日付を入れたら前年として DateSerial で日付を組み立てます。年末年始に、翌年・前年の日付を素早く入れられるようにするための配慮です。
最後に、組み立てた日付の月・日が、入力から分割した月・日と一致するかを確認します。「1245」(存在しない45日)や「1401」(存在しない14月)のように、DateSerial が繰り上げてしまうような無効な入力は、ここで一致しなくなるため例外として扱い、セルを空白に戻します。正しい日付のときだけ、そのセルに日付として書き込みます。
依存プロシージャ
このコードは自作の依存プロシージャを持たない、自己完結した部品です。上のコードブロックをそのまま標準モジュールに貼り付け、対象シートに Worksheet_Change を書くだけで動作します。
応用・注意点
変換が効くのは、セルに日付の表示形式(年・月・日をすべて含む書式)が設定されている場合だけです。効かないときは、まず対象セルの表示形式を確認してください。
Worksheet_Change はシートごとに1つだけ書けるイベントです。同じシートで別の変更処理も行いたい場合は、既存の Worksheet_Change の中に Call EventChangeConvYYMMtoDate(Target) を1行足す形で共存させてください。
書き戻し時に Application.EnableEvents = False にしているため、途中でマクロがエラー停止するとイベントが無効のままになることがあります。その場合はイミディエイトウィンドウで Application.EnableEvents = True を実行して戻してください。
桁数の分割ルール上、2桁は「1桁の月+1桁の日」に固定されます。たとえば「10日」を1桁で表すことはできないため、10日以降は3桁(例「110」=1月10日)で入力します。
サンプルブック(ダウンロードして試せます)
コードの詳しい動きは上のコードブロックと解説のとおりですが、まず動かして試したい場合は、下記のサンプルブックをダウンロードして、日付書式のセルに数字を入れるだけで動作を確認できます。Worksheet_Change の設置もすでに済んでいるので、開いてすぐに変換の動きを手元で再現できます。
まとめ
EventChangeConvYYMMtoDate を使えば、日付書式のセルに数字を打つだけで月日を自動入力でき、年跨ぎの補正や無効な日付の除外までまかせられます。シートの Worksheet_Change から1行呼び出すだけで設置できるので、日付入力が多いシートの入力効率を手軽に上げられる部品です。


