イベントプロシージャを使おう。

マクロを作成する時、通常は標準モジュールで作成することが多いと思います。
標準モジュールで作成すれば、どこからでも呼び出すことができるし、動作の制限を受けることもありません。

一方、それとは別に、ワークシートオブジェクトにもプロシージャを作成することができます。
この中で、イベントプロシージャを使うととても便利です。
イベントプロシージャとは、何か動作を起こしたときに、自動実行されるプロシージャのことです。
以下で、その例を紹介します。

1.セルの選択が変わったとき、マクロを自動実行する。

 このマクロは、セルの選択が変わったときに自動実行される、ワークシートセレクトチェンジです。
 (矢印キーでもマウスでも、選択したセルの位置が変われば動作します。)
 下のプロシージャは、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回行って、反転させます。

2.セルの値が変わったとき、マクロを自動実行する。

 このマクロは、セルに何か値を入力して値が変わったときに自動実行される、ワークシートチェンジです。
 マクロを組むとき、使うことが多いイベントプロシージャですが、注意すべき点があります。

 それは、このプロシージャでセルに値を書き込むときです。
 @値を入力する。
 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の命令が実行されないので、この先、イベントプロシージャが全て動かなくなります。
それを元に戻すには、ブックを保存してもう一度開いてください。
そうすれば、また動くようになります。

3.マウスの右クリックでも、マクロを自動実行させたい場合。

イベントプロシージャの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 が設定されていると,そちらを実行してから,ダブルクリックの方を実行することになるので,注意を!