月日だけを入力すると今年の日付になる
Excelで日付を入力する場合、「3/6」のように年を省略して月と日だけを入力することがあります。
これが当日や未来日付の場合であればあまり問題になりませんが、経理関係の日付の場合は前年の日付を扱うことが少なくありません。
その場合、「3/6」と入力すると現在の年の3月6日としてセルには書き込まれます。過去日でも未来日であっても月日だけの入力では今年の日付になります。それを避けたい場合は「2021/3/6」や「21/3/6」のように年も含めて入力すればいいのですが、入力量が多いと年の入力が面倒で仕方ありません。
そこで、対処方法として、月日だけで日付の入力を行い、あとで年の部分を一括で1年前に戻す、という方法です。
対応方法にはいろいろあるとは思いますが、ここでは今年の1年前の日付に変更する、という方法を紹介します。
コード
以下の関数は選択セル範囲で日付が入力されているセルがあった場合、そのセルの日付の年を1年前に変更します。
処理の内容はコードのコメントにほとんど書いてますので、それを見てもらえば大体わかると思います。
補足として、単純に前年の日付に更新してしまうと、実行する度に年数が古くなってしまうため、今年の前年よりも過去には変更しないようにしています。あくまでも「今年の1年前に変更」です。
なので、今年の翌年以降の未来日付である2050年とかの日付のセルに対して実行しても、未来日の年は更新しません。
使い方はセルを選択して実行するだけです。日付でないセルの場合は処理をスキップします。日付とみなせる書式であればどのような書式でも動作します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Sub ChangeDate1YearAgo() Dim r As Range '// 処理対象セル Dim dt As Date '// 日付 Dim s As String '// 日付文字列 Dim iNowYear As Integer '// 今年 Dim iPreYear As Integer '// セルの日付の前年 Application.ScreenUpdating = False '// 選択セル範囲をループ For Each r In Selection '// セルの内容が日付ではない場合 If IsDate(r.Value) = False Then '// 次セルの処理へ GoTo CONTINUE End If '// セルの日付の1年前を取得 dt = DateAdd("yyyy", -1, r.Value) '// 今年の年を取得 iNowYear = CInt(Format(Now, "yyyy")) '// セルの日付の前年を取得 iPreYear = CInt(Format(dt, "yyyy")) '// セルの日付の前年が、今年の前年の場合(1年前の日付の場合) If (iNowYear - iPreYear = 1) Then '// セルの日付を前年の日付に更新する r.Value = dt End If CONTINUE: Next Application.ScreenUpdating = True End Sub |