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

アフィリエイト広告を利用しています。
Information
運営者・ポテ

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

皆さん、こんにちは。ご覧いただきありがとうございます。

“日々の業務にちょうどいい自動化を”──

業務改善アプリケーションの作成を行っている「 ソフトデザイン工房」 です。

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

リアルタイムで議事録などを取っていると、手作業で毎回日時を入力するのは面倒ですよね。

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

今回はそのようなときに使いたくなるアプリを紹介します。

具体的には、「値入力セル」を更新すると、それに連動して「日時入力セル」も自動で更新されるアプリです。

このアプリは、ワークシートイベントを使用するため、中~上級者向けのものと言えるかもしれません。

この技術を習得すれば、あなたのマクロがより一層洗練されたものとなるでしょう。

この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。

VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。

Information

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

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

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

アプリの仕様

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

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

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

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

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

コードの実装

このアプリは ワークシートイベント を利用しています。

そのため、標準モジュールではなく、対象ワークシートのコードモジュールにコードを記述する必要があります。

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

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

【実行結果】

A列に文字を入力すると、B列にその時の日時が自動で入力されます。

コード実行結果
コード実行結果

運営者・ポテ

順を追って解説していきます。

ワークシートイベントの定義
Private Sub Worksheet_Change(ByVal Target As Range)

ここでは、ワークシートイベント「Worksheet_Change」 を定義しています。

このイベントは、ワークシートのセルが変更されたときに自動的に実行されるマクロです。

Target は変更されたセルの範囲を表します。

変数の宣言
    ' 変数宣言
    Dim cell As Range

ここでは、コード内で使用する変数が宣言されています。

変数は Dim 変数名 As データ型 の構文で宣言します。

これにより、各変数は As 以降で指定したデータ型のデータを格納できるようになります。

具体的には、ここでは、セルの範囲を格納するための変数cell を宣言しています。

RangeはExcelシート内のセル範囲を操作するためのデータ型です。

この変数cellを使って、変更されたA列の各セルを処理します。

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列セルの順次処理
        ' A列で変更されたすべてのセルを確認し、それぞれの隣のB列に日時を入力する
        For Each cell In Intersect(Target, Me.Columns(1))

ここでは、変更されたA列のすべてのセルを順番に処理するループを開始 しています。

"変更されたA列のすべてのセル"とは、つまり、Intersect(Target, Me.Columns(1)) で取得したセルです。

For Each cell で、このセルをひとつずつ処理します。

A列の入力状態に応じたB列の更新処理
            ' 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スキルアップの参考情報

近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。

分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。

とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。

全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。

そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。

「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。

VBAのスキルアップ

VBAを学び始めるなら

入門書は、どれを選んでも大きな差はないように感じます。

どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。

もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

基礎を超えて力をつけたいなら

私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。

今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。

このレベルの本を一冊持っておくことに、損はないでしょう。


資格で能力を証明したいなら

VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。

特に「スタンダード」の方は上級者向けです。

あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。

以下の公式テキストが販売されています。



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

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。

これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。

今はAIにコードを尋ねれば、答えが返ってくる時代です。

しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。


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

【初心者歓迎】無料相談受付中 

運営者・ポテ

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

限られた時間をより良く使い、日本の生産性を高めたい──

みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。

お気軽にご相談ください。


こちらの記事でも紹介しております。

おわりに

運営者・ポテ

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

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

お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。

この記事が皆様のお役に立てれば幸いです。

なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。

この記事を書いた人

運営者・ポテソフトデザイン工房|日々の業務にちょうどいい自動化を
■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成にチャレンジ。

コメントを残す

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