【簡単エクセル/Excel VBA マクロ】メモや議事録に日時を自動入力する|Worksheet_Change|アプリ事例 #009



いつもありがとうございます。
ノンプログラマー向けの「Excel VBA マクロ アプリ事例解説シリーズ」へようこそ。
本稿では、「メモや議事録に日時を自動入力する」アプリを紹介いたします。
手作業で毎回日時を入力するのは面倒ですよね。
しかし、効率化のためにNow関数
を使用すると、ファイルを開くたびに日時が再計算されてしまい、正確な記録が難しくなります。
今回はそのようなときに使いたくなるアプリを紹介します。具体的には、「値入力セル」を更新すると、それに連動して「日時入力セル」も自動で更新されるアプリです。
このアプリは、ワークシートイベントを使用するため、中~上級者向けのものと言えるかもしれません。この技術を習得すれば、あなたのマクロがより一層洗練されたものとなるでしょう。
VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。
メモや議事録に日時を自動入力する方法

アプリの仕様
次のように、A列に何かしらデータを入力します。

そうすると、次のようにB列に日時が自動入力されます。

ワークシートイベントを利用し、A列の更新を検知して、B列に日時を書き込む仕組みです。
コードの実装

このアプリは ワークシートイベント を利用しています。そのため、標準モジュールではなく、対象ワークシートのコードモジュールにコードを記述する必要があります。
具体的には、通常ですとVBAエディター(VBE)の左上の方に表示されている対象のシートをダブルクリックし、開いたコードモジュールにコード記述 します。
Sheet1
のコードモジュールに記述する場合は、これです。

このコードモジュールに記述するコードと、その実行結果を示します。
Private Sub Worksheet_Change(ByVal Target As Range)
' 変数宣言
Dim cell As Range
' Intersect関数でA列に変更があったかを検知
If Not Intersect(Target, Me.Columns(1)) Is Nothing Then
' 一時的にイベントの検知を無効化(イベントの無限ループを防ぐ)
Application.EnableEvents = False
' A列で変更されたすべてのセルを確認し、それぞれの隣のB列に日時を入力する
For Each cell In Intersect(Target, Me.Columns(1))
' A列のセルが空白でなければ
If cell.Value <> "" Then
' 隣のB列に現在の日時を入力
cell.Offset(0, 1) = Now
' A列のセルが空白なら
Else
' B列も空白にする(データを削除する)
cell.Offset(0, 1).ClearContents
End If
Next cell
End If
' イベントの検知を再開
Application.EnableEvents = True
End Sub


解説していきます。
Private Sub Worksheet_Change(ByVal Target As Range)
ここでは、ワークシートイベント「Worksheet_Change」 を定義しています。このイベントは、ワークシートのセルが変更されたときに自動的に実行されるマクロです。Target は変更されたセルの範囲を表します。
' 変数宣言
Dim cell As Range
ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型のデータを格納できるようになります。
具体的には、ここでは、セルの範囲を格納するための変数cell
を宣言しています。Range
はExcelシート内のセル範囲を操作するためのデータ型です。この変数cell
を使って、変更されたA列の各セルを処理します。
' Intersect関数でA列に変更があったかを検知
If Not Intersect(Target, Me.Columns(1)) Is Nothing Then
ここでは、Intersect
関数を使って、変更されたセルがA列に含まれているかを判定 しています。
具体的には、Target
(変更されたセルの範囲)と Me.Columns(1)
(A列)に交差があれば Not Nothing
となり、処理を続行します。一方で、A列以外の変更であれば、この条件が False
になり、何も処理されません。
' 一時的にイベントの検知を無効化(イベントの無限ループを防ぐ)
Application.EnableEvents = False
ここでは、イベントの無限ループを防ぐため、一時的にイベントの検知を無効化 しています。
例えば、B列に日時を入力する際、その変更が Worksheet_Change
イベントを再び呼び出してしまうと無限ループになる可能性があります。それを防ぐために Application.EnableEvents = False
を設定します。
' A列で変更されたすべてのセルを確認し、それぞれの隣のB列に日時を入力する
For Each cell In Intersect(Target, Me.Columns(1))
ここでは、変更されたA列のすべてのセルを順番に処理するループを開始 しています。"変更されたA列のすべてのセル"とは、つまり、Intersect(Target, Me.Columns(1))
で取得したセルです。For Each cell
で、このセルをひとつずつ処理します。
' A列のセルが空白でなければ
If cell.Value <> "" Then
' 隣のB列に現在の日時を入力
cell.Offset(0, 1) = Now
' A列のセルが空白なら
Else
' B列も空白にする(データを削除する)
cell.Offset(0, 1).ClearContents
End If
ここでは、変更されたA列のセルの値を判定し、それに応じてB列を更新する処理 を行っています。
- A列のセルに値が入力された場合
If cell.Value <> "" Then
により、A列のセルが空でない(値がある)と判定され、cell.Offset(0, 1) = Now
によって、隣のB列に現在の日時が入力 されます。
- A列のセルが空白の場合
Else
により、A列のセルが空だと判定され、cell.Offset(0, 1).ClearContents
により、B列のデータ(日時)が削除されます。
この処理によって、A列にデータを入力すると、B列に入力日時が記録され、A列のデータを削除すると、B列の日時も自動的に削除される 仕組みになっています。
' イベントの検知を再開
Application.EnableEvents = True
ここでは、無効化していたワークシートイベントの検知を再開 しています。これをしないと、今後のセル変更が Worksheet_Change
イベントで検知されなくなってしまいます。

以上で、解説は終了です。ありがとうございました。
おわりに


ご覧いただきありがとうございました。
本稿では、「メモや議事録に日時を自動入力する」を紹介をいたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご確認いただけると幸いでございます。
関連記事
本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。
- 【簡単エクセル/Excel VBA マクロ】Excel VBA マクロの全体像 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】通常使用編目次 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】ワンポイントテクニック編目次 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】アプリ事例編目次 | みんなの実用学 (jitsuyogaku.com)
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。
