ラピードアクト株式会社

技術記事:ExcelVBAで仕事を効率化しようVol.26

みなさん、こんにちは。
ITソリューション事業部の林です。

本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回紹介するのは、「セル選択時にイベントを発生させる」です。

【目次】

  1. Worksheetイベントについて
  2. Worksheet_SelectionChangeの設定方法
  3. イベント引数について
  4. Worksheet_SelectionChangeイベントの使用例

それでは、始めましょう!

Worksheetイベントについて

Worksheetイベントは、ExcelVBAイベントのひとつです。
ExcelVBAイベントがどんなものかは、過去記事(Vol.8)で紹介しています。

Worksheetイベントですが、こちらはワークシート上でのユーザー操作を起因に発生させられます。
イベント起因となるユーザー操作はいくつかありますが、使用頻度の高いものは限られています。
以下は、使用頻度が高いものです。
・セルを選択したとき
・セルの値が変化した時
・セルをダブルクリップしたとき
・セルがアクティブ状態/非アクティブ状態になった時

この記事では、「セルを選択した時」にイベントを発生させる、Worksheet_SelectionChangeを紹介します。

Worksheet_SelectionChangeの設定方法

Worksheetイベントを設定するには、以下の手順で操作します。

①VBAエディタを開く
②プロジェクトエクスプローラのSheet1をダブルクリックする(Sheet1以外のシートでも可)


③コードウインドウ上部のドロップダウンリストで、左側リストからWorksheetを選択する
④コードウインドウ上部のドロップダウンリストで、右側リストからSlectionChangeを選択する


⑤コードウインドウにWorksheet_SelectionChangeイベントプロシージャが作成される

以上がイベントの設定手順になります。
他のイベントを設定する場合にも、同様の手順で設定できるので、覚えておきましょう。

注意点としては、同じ種類のWorksheetイベントは1つのシートに1つしか設定できないところです。
上記手順なら、Worksheet_SelectionChangeイベントをSheet1に複数設定することはできません。

イベント引数について

Worksheet_SelectionChangeイベントプロシージャでは、Targetという引数が使用できます。

このTarget引数には、ユーザー操作が行われたセルの情報が記録されています
Target引数はRangeデータ型として定義されていますので、イベントプロシージャで利用可能です。
利用するときは、Target.AddressTarget.RowTarget.Columnなど、Range型変数のプロパティを使用します。

Worksheet_SelectionChangeイベントの使用例

使用例① 選択範囲をポップアップ表示する
セルの選択カーソルを移動するたびに、選択されているセルの情報が表示されます。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    MsgBox Target.Address '選択セルのアドレスをポップアップ表示'
End Sub

<セルを1つ選択した場合>

<セルを複数選択した場合>

使用例② 選択範囲の書式設定を変更する
選択セルの書式のみ変更が可能です。この例ではセル背景色を設定しています。
変更箇所をわかりやすくするために、書式設定はすべてクリアしてから変更させます。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Cells.Interior.ColorIndex = -4142 'すべてのセルの背景色を初期化'
    Target.Interior.ColorIndex = 3 '選択セルの背景色を赤に変更'
End Sub

<セル選択前の状態(B3~D4が選択中)>

<セル選択後の状態(A1~C2を選択)>

使用例③ 指定セルのみでイベントを発生させる
Target引数の行/列位置が特定セルと一致する場合のみ、セルを変化させます。
この例では、現在日付(B2)を選択した時と、現在時刻(B3)を選択した時のみ、セルに値を設定しています。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Row = 2 And Target.Column = 2 Then 'B2セルが選択された場合'
        Target.Value = Format(Now, "yyyy/mm/dd") '現在日付を入力'
    End If
    If Target.Row = 3 And Target.Column = 2 Then 'B3セルが選択された場合'
        Target.Value = Format(Now, "HH:MM:SS") '現在時刻を入力'
    End If
End Sub

<初期状態>

<B2セルを選択した時>

<B3セルを選択した時>

以上、「セル選択時にイベントを発生させる」のテクニック紹介でした。
それでは、また次回お会いしましょう!