残業を減らす!Officeテクニック

Excelのチェックボックスと連動して日付を自動入力するマクロを作成する

チェックを付けたら自動的に日付を入力するマクロを作成する

 以前の記事で、タスク完了時にチェックをONにすると、日付が自動入力されるテクニックを紹介しました。ただ、この方法ではTODAY関数を利用しており、[F2]→[F9]キーと押して値に変換する手間はかかります。

チェックONで、本日の日付が自動入力される。ただし、TODAY関数のままでは更新されてしまう
[F2]キーを押して編集状態にしてから[F9]キーを押すと値に変換できる

 チェックON時に、固定された“本日の日付”を直接入力する方法があれば便利ですよね。「チェックボックスがON(TRUE)であれば、右隣のセルに本日日付を入力する」旨のコードをVBAで記述すれば可能です。今回はコピペで埋め込める簡単なコードを紹介します。

 ただし、ファイルを[マクロ有効ブック]として保存する必要があります。また、標準ではVBAのコード(マクロ)は無効化されるため、有効化してから利用します。

VBAのコード(マクロ)を含む[マクロ有効ブック(.xlsm)]を開くと、標準で無効化される。[コンテンツの有効化]をクリックしてからファイルを利用する

VBAエディターにコードを埋め込む

 今回入力するVBAのコードは以下の通りです。コピペするだけでそのまま動作しますが、セル範囲は固有値を指定しているので、利用環境に応じて修正してください。コードの詳細は後述します。

 なお、[開発]タブは[Excelのオプション]から表示可能です。詳しくは、こちらの記事を参照してください。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cell As Range
Dim dateColOffset As Integer
dateColOffset = 1

If Not Intersect(Target, Me.Range("H2:H100")) Is Nothing Then
    Application.EnableEvents = False

    For Each cell In Target
        If cell.Value = True Then
            cell.Offset(0, dateColOffset).Value = Date
        Else
            cell.Offset(0, dateColOffset).ClearContents
        End If
    Next cell

    Application.EnableEvents = True
End If

End Sub
[開発]タブの[Visual Basic]をクリックする
VBAエディターが起動するので、現在開いているファイルのワークシートを選択する
上記のコードを貼り付けて、[上書き保存]をクリックする。VBAエディターのウィンドウは閉じて構わない
チェックをONにすると、右隣のセルに本日の日付が入力される
固定値として入力されていることがわかる

コードの意味

 簡単にコードの意味を解説します。自分の環境に合わせて修正できる箇所を確認しておくといいでしょう。

「If ~ End If」とその間にある「For Each ~ Next cell」がこのコードのポイント

 今回はワークシートに直接埋め込んでいるので、1行目(①)は変更禁止です。上部のプルダウンリストから[Worksheet]と[Change]を選択しても、同様のコードを自動入力できます。ワークシートに変更(Change)された時のコードという意味合いです。

 2,3行目の「Dim~」は変数の宣言です(②)。ここでは「dateColOffset」という変数を用意して、オフセット量、つまり、現在のセルを基準にどれだけ“ずらす”のかを指定できるようにしています。4行目で「1」に設定しています。

 5行目は「セルH2~H100が変更されているか」を判定します。チェックボックスを用意しているセル範囲に合わせて変更可能です。6行目では、一時的に処理を無効化して無限ループを回避しています。

 7行目のFor Each文は、対象(Target:セルH2~H100)のセル分、処理を繰り返す命令です(③)。8行目の「If cell.Value = True Then」は、「セルの値が『True』(チェックON)なら」という条件判定です。

 続く「cell.Offset(0, dateColOffset)」は、対象のセルを基準としたオフセット量を指します。4行目で「dateColOffset = 1」としているので、ここでは(0, 1)となります。チェックボックスの右隣のセルということです。8行目の条件を満たしていれば本日日付、満たしていなければ消去(ClearContents)となります。

 最後の「Application.EnableEvents = True」で再び処理を有効化して、If文を終わります。

 複雑なコードではないので、進捗管理やタスクの記録を効率化したい方におすすめです。環境に合わせてセル範囲やオフセット量を調整して導入してみてください。