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

アフィリエイト広告を利用しています。
QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください
運営者・ポテ

いつもありがとうございます。

ノンプログラマー向けの「Excel VBA マクロ アプリ事例解説シリーズ」へようこそ。

本稿では、「メモや議事録に日時を自動入力する」アプリを紹介いたします。

Information
  • ノンプログラマー
    プログラミングを専門にしていない人たちのことです。
  • VBAとマクロの違い
    VBAは、Visusal Basic for Application の略で、プログラミング言語のことです。マクロは、VBAを使って作成される「機能」のことです。

手作業で毎回日時を入力するのは面倒ですよね。

しかし、効率化のためにNow関数を使用すると、ファイルを開くたびに日時が再計算されてしまい、正確な記録が難しくなります。

今回はそのようなときに使いたくなるアプリを紹介します。具体的には、「値入力セル」を更新すると、それに連動して「日時入力セル」も自動で更新されるアプリです。

このアプリは、ワークシートイベントを使用するため、中~上級者向けのものと言えるかもしれません。この技術を習得すれば、あなたのマクロがより一層洗練されたものとなるでしょう。

VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。

Information

ワークシートイベント
Excelのシート上で特定の操作が行われたときに自動で実行される処理のことです。例えば、セルの値が変更されたり、シートがアクティブになったりすると、あらかじめ設定したマクロが自動的に動作します。
良く使われるワークシートイベントには、次のようなものがあります:

  • Worksheet_Change:セルの値が変更されたときに実行
  • Worksheet_SelectionChange:選択セルが変わったときに実行
  • Worksheet_Activate:シートがアクティブになったときに実行

メモや議事録に日時を自動入力する方法

アプリの仕様

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

アプリの仕様説明:A列に文字列を入力している画像

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

アプリの仕様説明:B列に自動的に日時が入力された画像

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

コードの実装

このアプリは ワークシートイベント を利用しています。そのため、標準モジュールではなく、対象ワークシートのコードモジュールにコードを記述する必要があります。

具体的には、通常ですとVBAエディター(VBE)の左上の方に表示されている対象のシートをダブルクリックし、開いたコードモジュールにコード記述 します。

Sheet1のコードモジュールに記述する場合は、これです。

Sheets1のコードモジュールの説明図

このコードモジュールに記述するコードと、その実行結果を示します。

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 になり、何も処理されません。

Information
  • Intersect関数
    Intersect 関数は、指定した複数の範囲(Range)が交差しているかどうかを判定する関数 です。交差している場合は、その交差部分のRangeオブジェクトを返し、交差していない場合は「Nothing」を返します。
    基本構文:Intersect(Range1, Range2)
  • Target
    Worksheet_Change イベントの引数 であり、変更されたセルの範囲Rangeオブジェクト)を表します。
  • Me
    現在のオブジェクト(実行中のコードが属するオブジェクト)を指すキーワード です。ワークシートのコードモジュール内で Me を使うと、そのシート自体(=マクロが書かれているワークシート)を指します。
        ' 一時的にイベントの検知を無効化(イベントの無限ループを防ぐ)
        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列を更新する処理 を行っています。

  1. A列のセルに値が入力された場合
    • If cell.Value <> "" Then により、A列のセルが空でない(値がある)と判定され、cell.Offset(0, 1) = Now によって、隣のB列に現在の日時が入力 されます。
  2. A列のセルが空白の場合
    • Else により、A列のセルが空だと判定され、cell.Offset(0, 1).ClearContents により、B列のデータ(日時)が削除されます。

この処理によって、A列にデータを入力すると、B列に入力日時が記録され、A列のデータを削除すると、B列の日時も自動的に削除される 仕組みになっています。

    ' イベントの検知を再開
    Application.EnableEvents = True

ここでは、無効化していたワークシートイベントの検知を再開 しています。これをしないと、今後のセル変更が Worksheet_Change イベントで検知されなくなってしまいます。

運営者・ポテ

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

おわりに

運営者・ポテ

ご覧いただきありがとうございました。

本稿では、「メモや議事録に日時を自動入力する」を紹介をいたしました。

お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。

皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。

なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご確認いただけると幸いでございます。


関連記事

本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。

VBAプログラミングスキルアップのための参考情報

ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。

VBAプログラミングのスキルアップ

学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。



入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。

甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

\チェックしてみよう/

\チェックしてみよう/

\チェックしてみよう/


VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。


こちらの記事でも紹介しております。もしよろしければご覧ください。

QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です