マクロを作成する時、通常は標準モジュールで作成することが多いと思います。
標準モジュールで作成すれば、どこからでも呼び出すことができるし、動作の制限を受けることもありません。
一方、それとは別に、ワークシートオブジェクトにもプロシージャを作成することができます。
この中で、イベントプロシージャを使うととても便利です。
イベントプロシージャとは、何か動作を起こしたときに、自動実行されるプロシージャのことです。
以下で、その例を紹介します。
このマクロは、セルの選択が変わったときに自動実行される、ワークシートセレクトチェンジです。
(矢印キーでもマウスでも、選択したセルの位置が変われば動作します。)
下のプロシージャは、1〜5までの範囲でクリックすると、その縦横のセルが反転します。
全部、■にしたり、何もなしにしたりと、パズルとして遊べます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Count > 1 Then Exit Sub ←@ If Target.Row > 5 Then Exit Sub ←A If Target.Column > 5 Then Exit Sub ←B Dim R As Integer Dim C As Integer Dim rr As Integer Dim cc As Integer Dim n As String n = "■" ←C rr = Target.Row cc = Target.Column For R = 1 To 5 If Cells(R, cc) = "" Then ←D Cells(R, cc) = n Else Cells(R, cc) = "" End If Next R For C = 1 To 5 ←E If Cells(rr, C) = "" Then Cells(rr, C) = n Else Cells(rr, C) = "" End If Next C If Cells(rr, cc) = "" Then ←F Cells(rr, cc) = n Else Cells(rr, cc) = "" End If End Sub |
@ 選択したセルの数が、1つでなければ終了します。 A 選択したセルの行が、5より大きければ終了します。 B 選択したセルの列が、5より大きければ終了します。 C セルに入力する文字を設定します。 D 選択したセルの行が、空なら決められた文字を入力します。 空でなければ、空にします。 E 選択したセルの列が、空なら決められた文字を入力します。 空でなければ、空にします。 F 選択したセルの処理が2回行われていて、もとに戻っているので、 もう1回行って、反転させます。 |
このマクロは、セルに何か値を入力して値が変わったときに自動実行される、ワークシートチェンジです。
マクロを組むとき、使うことが多いイベントプロシージャですが、注意すべき点があります。
それは、このプロシージャでセルに値を書き込むときです。
@値を入力する。
Aイベントプロシージャが自動実行される。
Bイベントプロシージャが値を書き込んだことによって、さらにイベントプロシージャが動作する。
となり、無限ループに陥ってしまうのです。
そこで、それを避けるために、ApplicationオブジェクトのApplication.EnableEventsを使います。
このオブジェクトを使うことによって、イベントプロシージャが自動実行されることを一時的に停止します。
下のプロシージャは、A1に0〜9までの数字を入力すると、拡大した文字が表示されるようになっています。
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub ←@ On Error Resume Next ←A Dim 範囲 As Range Dim 範囲あ As Range Dim 範囲い As Range Set 範囲 = Range("B2:D6") ←B Select Case Target.Value ←C Case Is = 1 Set 範囲あ = Range("B2:C6") ←D Case Is = 2 Set 範囲あ = Range("B3:C3") Set 範囲い = Range("C5:D5") Case Is = 3 Set 範囲あ = Range("B3:C3") Set 範囲い = Range("B5:C5") Case Is = 4 Set 範囲あ = Range("C2:C3") Set 範囲い = Range("B5:C6") Case Is = 5 Set 範囲あ = Range("C3:D3") Set 範囲い = Range("B5:C5") Case Is = 6 Set 範囲あ = Range("C3:D3") Set 範囲い = Range("C5") Case Is = 7 Set 範囲あ = Range("B3:C6") Case Is = 8 Set 範囲あ = Range("C3") Set 範囲い = Range("C5") Case Is = 9 Set 範囲あ = Range("C3") Set 範囲い = Range("B5:C5") Case Is = 0 Set 範囲あ = Range("C3:C5") Case Else Set 範囲あ = Range("B2:D6") End Select Application.EnableEvents = False ←H 範囲.Value = "■" ←E 範囲あ.Value = "" ←F 範囲い.Value = "" ←G Application.EnableEvents = True ←I Range("A1").Select End Sub |
@ A1以外のセルの値が変わったときなら、終了します。 A エラーを起こしたら、無視して次の処理に進みます。 B 数字を表示する枠の範囲を指定します。 C A1に入力された値で、分岐します。 D 数字枠の中で、消す範囲を指定します。 E 枠の中を全部■で埋めます。 F セットされた範囲を消します。 G セットされた範囲を消します。 H イベントプロシージャを停止させます。 I イベントプロシージャを再開させます。 |
※Application.EnableEvents を使ったイベントプロシージャがエラーを起こして停止すると、
最後のTrueの命令が実行されないので、この先、イベントプロシージャが全て動かなくなります。
それを元に戻すには、ブックを保存してもう一度開いてください。
そうすれば、また動くようになります。
イベントプロシージャのWorksheet_SelectionChangeを上手に使うと,マウスをクリックしたところに●を書き込むようなことができます。(実際は,矢印キーで操作した範囲全部に書き込まれてしまいますが。。。)
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Target.Value = "●" End Sub |
これだけで,一応,クリックしたセルに●を書き込みます。 |
これを使ってワークシートで遊んでみると,「今度は消すのも同じようにできないかな?」と思いますよね。
左クリックは使っているので,空いているのは右クリック。
それでは,同じように右クリックで消すマクロを作ってみましょう。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Target.Value = "" ← @ Cancel = True ← A End Sub |
@は,前と同じ方法なのでいいと思いますが,実はこれだけでは,うまくいきません。 というのも,右クリックは通常,メニューが開くようになっているので,@の処理が終わった後,同じようにメニューが開いてしまうのです。 これを止めるのが,Aです。 |
これを使って,ダブルクリックでマクロを自動実行させることもできます。
ただし,Worksheet_SelectionChange が設定されていると,そちらを実行してから,ダブルクリックの方を実行することになるので,注意を!