Worksheet_SelectionChangeイベントとは
セルをクリックしたときに、なんらかのVBA処理をしたい場合があります。セルのクリックを検知するには、そのセルがあるシートにWorksheet_SelectionChangeプロシージャを用意しておく必要があります。
「Worksheet_SelectionChange」という名前だけ見ると、「選択範囲が変わったとき、って意味だから、左クリックは関係なさそう」と感じますが、左クリック時のイベントとして利用できます。紛らわしい名前ですがVBA文化はこんなもんです。
「左クリック時」とは正確には、マウスの左ボタンをクリックして押し込んでから、離してボタンが上に戻ったときに検知されます。そのため、ドラッグしようとして左クリックを押しっぱなしの状態のときにはWorksheet_SelectionChangeイベントは検知されません。
検知される操作:マウスだけでなくキーボード入力も検知する
Worksheet_SelectionChangeプロシージャは、マウスクリックだけでなく、キーボード操作によってアクティブセルが移動した場合も検知されます。
アクティブセルが移動するキー操作には、上下左右キー、Enterキー、Home、PageUp、PageDown、Ctrl+Homeなど、がありますが、いずれもWorksheet_SelectionChangeプロシージャで検知されます。
キーボードの使い方は2通りあります。1回キーを押して離して1文字入力する方法と、キーを押し続けて連続入力する方法です。Worksheet_SelectionChangeはどちらも検知します。
キーボードのキーを押しっぱなしのとき同じキー操作が連続しますが、Worksheet_SelectionChangeも連続して同じキー入力がされていることを都度検知します。例えば「a」キーを押しっぱなしにすると「aaaaa・・・・」と入力されますが、1文字ずつWorksheet_SelectionChangeプロシージャが呼び出されます。
なお、ShiftキーやCtrlキーなど、他のキーと同時に操作するためのキーは、単独で押してもWorksheet_SelectionChangeでは検知されません。ただし、これらのキーを押しながら矢印キーでセルを複数選択した場合などは、「選択範囲が変わった」とみなされてイベントが発生します。
Worksheet_SelectionChangeプロシージャは厳密にはクリックしたときのでイベントではなく、セルの選択範囲が変わった場合に発生するイベントのため、マウスクリックも検知しますが、キーボードの十字キーでのセル移動も検知対象になります。
Worksheet_SelectionChangeで検知される操作
Worksheet_SelectionChangeで検知される操作には、以下のように「選択されているセルの範囲が変更したとき」が発生するものが対象になります。
【マウス操作】
- マウス左ボタンクリック(セル範囲が変わった場合のみ)
- 別セルをドラッグして範囲選択した場合
- 名前ボックスやセル番地の入力で移動した場合
【キーボード操作】
- 上下左右の矢印キーでセルを移動
- Tab、Shift + Tab
- Enter、Shift + Enter
- PageUp / PageDown
- Home / Ctrl + Home / Ctrl + End
- F5(ジャンプ)でセル移動
【その他の操作】
- コードから ActiveCell や Selection を変更する処理
- 他のワークシートから戻ってきて選択セルが変わる場合
- Excel関数 HYPERLINK で別セルにジャンプするなどの操作
Worksheet_SelectionChangeで検知されない操作
なお、以下の操作の場合はWorksheet_SelectionChangeは検知されません。(イベントが発生しません)
- 同じセルを再度クリックしても選択が変わらない場合
- セルの中の編集開始(F2)やダブルクリックは対象外
- 右クリック(コンテキストメニュー表示)は対象外
- セルの内容を変更しただけ(選択が変わらない限り発生しない)
セルを左クリック時の用途:ゲームでは必須
通常、セルの左クリックはセルの選択をしたいので、そうではないことをしたいというのは「通常のExcel操作とは違うかなり特殊な操作」になります。
そうなると考えられるのはExcel上でゲームを操作する場合などです。ゲーム操作は通常のExcel操作を無視するのがむしろ当たり前になります。
パズルゲームでセルをクリックして盤面を移動させたり、迷路ゲームでキャラクターを移動させたり、カードゲームでクリックしたカードを反転させたり、などです。
そのため、Excelでのゲーム開発を行う場合には、Worksheet_SelectionChangeイベントは必須になります。
ゲームキャラクターの移動例:左クリックしたセルに「●」文字を移動するコード例
Worksheet_SelectionChangeイベントはワークシートのイベントのため、以下のコードはSheet1などのワークシートのコードとして作成します。ここでは、a.xlsmのSheet1シートに書いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Option Explicit '// 前回セル Private previousCell As Range Private Sub Worksheet_SelectionChange(ByVal Target As Range) '// 複数セルを選択した場合は処理を抜ける If Target.CountLarge > 1 Then Exit Sub End If '// 前回のセルの文字を消す If Not previousCell Is Nothing Then previousCell.Value = "" End If '// クリックしたセルにキャラクターを表示 Target.Value = "●" '// 今クリックしたセルを次回のために記憶 Set previousCell = Target End Sub |
使い方
上のコードをSheet1などに書いた後、Sheet1のセルを左クリックすると、クリックの度に●がクリックしたセルに移動します。
コードで行っていることは、セルを1つ選択したら、前回選択していたセルの●を消して、今回クリックしたセルに●を表示する、というものです。
Worksheet_SelectionChangeの引数のTargetはセル範囲を示します。A1をクリックすればTargetにはRange(“A1”)がセットされてあり、A1からA5までの範囲選択をしていればTargetはRange(“A1:A5”)になります。
このコードでは複数セルの処理が面倒なので「If Target.CountLarge > 1 Then」の部分で単一セルクリック時のみ処理をするようにしています。CountLarge はTargetのセルの数を返すプロパティです。同じようなセルの数を数えるCountプロパティもありますが、CountはLong型のためそれを超える広い範囲のセル選択(大量のセルを選択)をしても大丈夫なようにCountLargeを使っています。
ここから発展すると、いろんなゲームになっていきます。上のコードは要点のみを書いているため、セルの削除時の異常時の処理などが入っていませんが、ゲーム化する場合はそのあたりを考慮する必要が多数出てきます。