大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、値の変更時にマクロを実行するには、「シートモジュール」の「Wroksheet_Change」を使います。値の変更時に値を取得するなど、「VLOOKUP関数」のように使うことができて便利です。値の変更時に実行するシートイベントを活用していきましょう。

はじめに

この記事では、値の変更時に実行するシートイベントについて、ご紹介します。

「シートモジュール」で「Worksheet_Change」を使うことでできます。

変更したセルのアドレスは、「Target」で取得することができます。

複数のセル範囲や、とびとびのセル範囲を指定したい場合は、「Intersect」が使えます。

値の変更したタイミングで、値を転記するなど、「VLOOKUP関数」のように使うこともできて便利ですので、どんどん使っていきましょう。

では、値の変更時に実行するシートイベントについて、解説していきます。

この記事で紹介すること

  • 値の変更時に実行するシートイベントの使い方

目次から見たい項目へ移動すると便利ですよ。

目次 

「値の変更」時に実行する

「値の変更」時にマクロを実行してみます。

「Worksheet_Change」を使う

値の変更時に実行したい場合は、「シートモジュール」で「Worksheet_Change」を使います。

まずは、「Worksheet_Change」をシートモジュールに作成していきます。

「シートモジュール」の値変更イベントを作成

「シートモジュール」で「Worksheet」を選択します。

「シートモジュール」で「Worksheet」を選択します

「シートモジュール」で「Change」を選択します。

「シートモジュール」で「Change」を選択します

「シートモジュール」に「Worksheet_Change」を作成できます。

「シートモジュール」に「Worksheet_Change」を作成できました

「シートモジュール」に「Worksheet_Change」を作成できました。

メッセージを表示してみる

値変更時に、メッセージを表示してみます。

Private Sub Worksheet_Change(ByVal Target As Range)

    MsgBox "実行しました"

End Sub

VBE画面で見るとこんな感じです。

値変更時に、メッセージを表示してみます

では、やってみます。

「Sheet1」のセルの値を変更

「Sheet1」のセルを変更してみます。

「Sheet1」のセルを変更してみます

これで、マクロを実行できます。

マクロを実行できました

マクロを実行できました。

「Target」でセル範囲を取得

値を変更したセル範囲は、「Target」で取得できます。

「Target」で変更したセルのアドレス

「Target」で値を変更したセルのアドレスを取得してみます。

Private Sub Worksheet_Change(ByVal Target As Range)

    '変更したセルのアドレスを取得
    MsgBox Target.Address

End Sub

VBE画面で見るとこんな感じです。

「Target」で値を変更したセルのアドレスを取得してみます

では、値を変更して、変更したセル範囲を取得してみます。

「B2」を変更

「Sheet1」の「B2」の値を変更してみます。

「Sheet1」の「B2」の値を変更してみます

Enterで確定してみます。

セルのアドレス「$B$2」を取得できました

セルのアドレス「$B$2」を取得できました。

列を指定して実行

「列」を指定して実行してみます。

「1列目」の変更で実行する

「1列目」の変更で実行するVBAコードです。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    '「1列目」の場合
    If Target.Column = 1 Then

        MsgBox "実行しました"

    End If

End Sub

では、やってみます。

「1列目」の値を変更

「1列目」に値を入力してみます。

「1列目」に値を入力してみます

Enterで確定してみます。

値の変更時にマクロを実行できました

値の変更時にマクロを実行できました。

「1列目」以外の値を変更

「1列目」以外に値を入力してみます。

「1列目」以外に値を入力してみます

Enterで確定してみます。

マクロは実行されないです

マクロは実行されないです。

「1列目」だけに限定できました。

行を指定して実行

行を指定して実行してみます。

「1行目」の変更で実行する

「1行目」の変更で実行するVBAコードです。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    '「1行目」の場合
    If Target.Row = 1 Then

        MsgBox "実行しました"

    End If

End Sub

では、やってみます。

「1行目」の値を変更

「1行目」に値を入力してみます。

「1行目」に値を入力してみます

Enterで確定してみます。

値の変更時にマクロを実行できました

値の変更時にマクロを実行できました。

「1行目」以外の値を変更

「1行目」以外に値を入力してみます。

「1行目」以外に値を入力してみます

Enterで確定してみます。

マクロは実行されないです

マクロは実行されないです。

「1行目」に限定できました。

セル範囲を指定して実行

セル範囲を指定して実行してみます。

「A1」の変更で実行する

「A1」の変更で実行するVBAコードです。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    '「A1」の場合
    If Not Intersect(Target, Range("A1")) Is Nothing Then

        MsgBox "実行しました"

    End If

End Sub

セル範囲を指定する場合は、「Intersect」が使えます。

「InterSect」の使い方

「InterSect」は2つの範囲で、重なるセル範囲を返します。

「InterSect」は2つの範囲で、重なるセル範囲を返します

2つの範囲で、重なるセルがない場合は、「Nothing」を返します。

2つの範囲で、重なるセルがない場合は、「Nothing」を返します

今回は、「If Not Intersect(範囲1, 範囲2) Is Nothing Then」となっています。

なので、「Nothing」では「ない」となりますので、範囲1と範囲2の重なる部分がある場合に、実行します。

「A1」の値を変更すると、メッセージを表示することができます。

「A1」の値を変更

「A1」に値を入力してみます。

「A1」に値を入力してみます

Enterで確定してみます。

値の変更時にマクロを実行できました

値の変更時にマクロを実行できました。

「A1」以外の値を変更

「A1」以外に値を入力してみます。

「A1」以外に値を入力してみます

Enterで確定してみます。

マクロは実行されないです

マクロは実行されないです。

「A1」だけに限定できました。

複数のセル範囲を指定して実行

複数のセル範囲を指定して実行してみます。

「A1:B2」の変更で実行する

「A1:B2」の変更で実行するVBAコードです。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    '「A1:B2」の場合
    If Not Intersect(Target, Range("A1:B2")) Is Nothing Then

        MsgBox "実行しました"

    End If

End Sub

やってみます。

「A1」の値を変更

「A1:B2」の範囲の「A1」に値を入力してみます。

「A1:B2」の範囲の「A1」に値を入力してみます

では、Enterで確定してみます。

値の変更時にマクロを実行できました

値の変更時にマクロを実行できました。

「B2」の値を変更

「A1:B2」の範囲の「B2」に値を入力してみます。

「A1:B2」の範囲の「B2」に値を入力してみます

では、Enterで確定してみます。

値の変更時にマクロを実行できました

値の変更時にマクロを実行できました。

「A1:B2」以外の値を変更

「A1:B2」の範囲外に値を入力してみます。

「A1:B2」の範囲外に値を入力してみます

Enterで確定します。

マクロは実行されないです

マクロは実行されないです。

実行される範囲を「A1:B2」に限定できました。

とびとびのセル範囲を指定して実行

とびとびのセル範囲を指定して実行できるようにしてみます。

「A1」か「A3」の変更で実行する

「A1」か「A3」の変更で実行するVBAコードです。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    '「A1」と「A3」のセル範囲を結合
    Dim A
    Set A = Union(Range("A1"), Range("A3"))
    
    '「A1」もしくは「A3」の場合
    If Not Intersect(Target, A) Is Nothing Then

        MsgBox "実行しました"

    End If

End Sub

セル範囲を「Union」を使って結合するところがポイントです。

「A1」の変更で実行

「A1」に値を入力してみます。

「A1」に値を入力してみます

Enterで確定します。

値の変更時にマクロを実行できました

値の変更時にマクロを実行できました。

「A3」の変更で実行

「A3」に値を入力してみます。

「A3」に値を入力してみます

Enterで確定します。

値の変更時にマクロを実行できました

値の変更時にマクロを実行できました。

「A1」と「A3」以外は実行されない

「A1とA3」以外に値を入力してみます。

「A1とA3」以外に値を入力してみます

Enterで確定します。

マクロは実行されないです

マクロは実行されないです。

実行する範囲を「A1とA3」に限定できました。

ちょっと応用

ちょっと応用で、値の変更時に値を転記というのをやってみます。

値の変更時に値を転記

値の変更時にデータを転記する、というのをやってみます。

値の変更時にデータを転記する

値の変更時にデータを転記する、というのをやってみます

「VLOOUP関数」をVBAで作成するという感じです。

VBAコードは、次のようになります。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    '「E2」の場合
    If Not Intersect(Target, Range("E2")) Is Nothing Then
        
        '2~7をループ
        For i = 2 To 7
            '「Target」と値が一致する場合
            If Cells(i, "A") = Target.Value Then
                '値を転記
                Cells(i, "A").Offset(0, 1).Resize(, 2).Copy Target.Offset(0, 1)
            End If
        Next

    End If

End Sub

では、やってみましょう。

「レモン」のデータを転記

リストから「レモン」を選択します。

リストから「レモン」を選択します

では、結果をみてみます。

「レモン」のデータが転記されます

「レモン」のデータが転記されました。

「メロン」のデータを転記

次は、リストから「メロン」を選択してみます。

リストから「メロン」を選択します

結果をみてみます。

「メロン」のデータが転記されます

「メロン」のデータが転記されました。

こんな感じで、値を変更した場合に実行したい場合は「Worksheet_Change」を使いましょう。

おわりに

この記事では、値の変更時に実行するシートイベントについて、ご紹介しました。

「シートモジュール」で「Worksheet_Change」を使うことでできます。

変更したセルのアドレスは、「Target」で取得することができます。

複数のセル範囲や、とびとびのセル範囲を指定したい場合は、「Intersect」が使えます。

値の変更したタイミングで、値を転記するなど、「VLOOKUP関数」のように使うこともできて便利ですので、どんどん使っていきましょう。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す