難易度:★★☆(やや難)

※当校のExcel VBAコースを補足する内容となっています。


いきなりだけど、シートモジュールって何?
いままで紹介してきたコードと、なにか違うの?

シートモジュール・・・、そうだね
例えば、
・ダブルクリックしたとき、実行したい。
・あるセルの値が変更になったとき、実行したい。
・セルを選択したとき、実行したい。

などのイベントプロシージャ(特定の動作によって実行するプログラム)が書かれるケースが多いよ。
もちろん、普通のプログラムを書くこともできるよ。

ふーん。
でも、イメージわかない。
書くって、どこに?
ダブルクリックて、どうやって書くの?

うん、そうだね。
では、今回はシートモジュールの書き方について紹介しましょう。

シートモジュールとは

特定の動作によって実行するプログラム「イベントプロシージャ」が書かれるケースが多いよね。
シートモジュールに書いたコードは、そのシートで発生したイベント時に実行されるんだ。
例えば、こんな場合。

・セルの値が変更になった時
・セルをダブルクリックした時
・セルを選択した時

など、いろいろなイベントがあるんだ。

「イベントプロシージャ」が書かれるのは、ブックモジュールも同じことが言えるんだけど、イベントの種類が違ってくるんだよね。
ブックモジュールについては、またの機会に説明しますね。

シートモジュールの書き方

VBEを立ち上げ、左側ウインドウ(プロジェクトエクスプローラ)の目的のシート名を右クリックしよう。右クリックメニューから、「コードの表示」を選択します。

右側にコードウインドウが表示された。

コードウインドウの上のコンボボックスを変更します。左右に並んだコンボボックスあるよね。

左のコンボボックスの値を「Worksheet」を選んでみると、右側のコンボボックスも値が選べるようになった。

右側のコンボボックスにあるイベントの中から、目的に合ったものを選ぶことができるんだ。
今回は、リストの中から「Change」を選んでみよう。

これで、準備完了。

  • そうそう、シートモジュールに不要なイベントが表示されてしまったら、BackSpaceやDeleteキーを使って削除しておいてくださいね。

コードを書いてみよう

では、以前に紹介したお釣りを計算するコードを使おう。
お釣りを計算するコードを呼び出すのに、シートモジュールを使ってみよう。

呼び出すってなあに?

コードは、通常、単体コードで済むことはなくて、複数のコードに分かれるんだよね。
コードの途中で、別のコードを使って仕事をする。そして、元のコードの続きを実行する。
この時、別のコードを呼び出すと言うんだ。
一度やってみよう。

お釣りを計算するコードを事前に見ておこうか。

入力するセルは、B1だけ、あとは、結果を表示してるだけだね。
このコードは、Alt+F8でマクロを選択し実行したよね。これを自動化してみようと思う。

お釣りを計算するコードをここに乗せておくよ。
すべて選択して、Ctrl+Cでコピーをしよう。

Sub お釣り計算()

    Dim i, j As Long
    Dim w_Kinsyu() As Variant
    Dim w_Amari As Long
    
    Const w_Tanka = 130
        
    w_Kinsyu = Array(10000, 5000, 1000, 500, 100, 50, 10, 5, 1)
    Range("A4:D12") = ""
    
    If Cells(1, 2) < w_Tanka Then
        MsgBox "お金が足りません"
        Exit Sub
    End If
    
    w_Amari = Cells(1, 2) - w_Tanka
    j = 4
    For i = 0 To 8
        If Int(w_Amari / w_Kinsyu(i)) <> 0 Then
            Cells(j, 1) = w_Kinsyu(i)
            Cells(j, 2) = "円"
            Cells(j, 3) = Int(w_Amari / w_Kinsyu(i))
            Cells(j, 4) = "枚"
            w_Amari = w_Amari Mod w_Kinsyu(i)
            j = j + 1
        End If
    Next i
    
End Sub

これを、新規ワークブックの標準モジュールに貼り付けるよ(Ctrl+V)。

いよいよシートモジュールだ。
まず、シートモジュールを表示してね。
シートモジュールの書き方に示したように、コードウインドウの上の右側のコンボボックスの値が、Changeのイベントプロシージャになっているかな。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row = 1 And Target.Column = 2 Then
        Call お釣り計算
    End If
    
End Sub

「Target」は、Rangeオブジェクトで、セルやセル範囲のこと。
「Target.Row」は、セルの値が変わった(Change)行数で、
「Target.Column」は、セルの値が変わった(Change)列数になります。
「Call お釣り計算」は、お釣り計算コードを呼び出す、です。

つまり、セル「B1」の値が変わったら、お釣り計算するというコードを実行されるわけです。

簡単な例ですが、シートモジュールの紹介でした。