はじめに
Excelでたくさんのデータを扱っていると、「今どのセルを選択しているのか」を見失ってしまうことはありませんか。特に列数・行数が多い表では、選択中のセルがどの行・列にあるのか目で追うのが大変です。
この記事では、Worksheet_SelectionChangeイベントを使って、セルを選択した瞬間にその行・列を自動でハイライト表示する方法を解説します。VBA初心者の方でもそのままコピペして使える実用的なコードを紹介しますので、ぜひ最後まで読んでみてください。
この記事を読むと以下のことが分かります。
Worksheet_SelectionChangeイベントの基本的な使い方- 選択中の行・列を自動で色付けする方法
- 色を元に戻す処理の書き方(塗りつぶしが残ってしまう問題への対処)
- 複数シートに同じ処理を適用する方法
Worksheet_SelectionChangeイベントとは
Worksheet_SelectionChangeは、シート上で選択セルが変更されたタイミングで自動的に実行されるイベントプロシージャです。似た名前のWorksheet_Changeは「セルの値が変更されたとき」に発生するイベントですが、Worksheet_SelectionChangeは「クリックやカーソル移動でセルの選択位置が変わったとき」に発生する点が異なります。
このイベントを使うことで、ユーザーが操作するたびに任意の処理を自動実行できます。今回は「選択中の行・列を色付けする」処理を組み込んでいきます。
基本的な書き方
Worksheet_SelectionChangeイベントはシートモジュールに記述します。VBEの左側のプロジェクトエクスプローラーから対象のシート(例:Sheet1)をダブルクリックしてコードを開いてください。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "選択位置が変わりました:" & Target.Address
End Sub
上記のコードをシートモジュールに貼り付けてセルを選択すると、選択したセルのアドレスがメッセージボックスで表示されます。Target引数には、選択されたセル(Range)が渡されます。
選択中の行・列をハイライトする
それでは本題です。選択中のセルがある行と列全体に色を付けるコードを作成します。ポイントは「前回ハイライトした部分の色を元に戻してから、新しい行・列に色を付ける」ことです。これを忘れると、色付けした部分がどんどん増えてしまいます。
Dim prevRange As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ws As Worksheet
Set ws = Target.Worksheet
' 前回ハイライトした行・列の色を元に戻す
If Not prevRange Is Nothing Then
ws.Rows(prevRange.Row).Interior.ColorIndex = xlColorIndexNone
ws.Columns(prevRange.Column).Interior.ColorIndex = xlColorIndexNone
End If
' 今回選択されている行・列をハイライト
ws.Rows(Target.Row).Interior.Color = RGB(255, 255, 153)
ws.Columns(Target.Column).Interior.Color = RGB(255, 255, 153)
' 今回の選択範囲を記憶しておく
Set prevRange = Target
End Sub
コードの解説
prevRangeはモジュールレベルの変数として宣言し、直前に選択していたセルの情報を保持します。シートモジュールの一番上(プロシージャの外)にDim prevRange As Rangeを書くことで、イベントが発生するたびに値を保持できます。xlColorIndexNoneを指定すると、塗りつぶしをなし(透明)に戻せます。すでに罫線や背景色を設定している表で使う場合は、単純に色をなしに戻すと元の書式が消えてしまうので注意してください。Target.RowとTarget.Columnで、選択セルの行番号・列番号を取得しています。複数セルを範囲選択した場合は、選択範囲の左上のセルが基準になります。
既存の書式を壊さないようにする方法
先ほどのコードは、ハイライトを解除する際にColorIndex = xlColorIndexNoneとしているため、元々色付けしていたセルの書式まで消えてしまいます。表に色付きセルがある場合は、以下のように「条件付き書式」を使う方法がおすすめです。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ws As Worksheet
Set ws = Target.Worksheet
' 既存のハイライト用条件付き書式を削除
ws.Cells.FormatConditions.Delete
' 選択中の行全体に条件付き書式を追加
With ws.Rows(Target.Row).FormatConditions.Add(Type:=xlExpression, Formula1:="=TRUE")
.Interior.Color = RGB(255, 255, 153)
End With
' 選択中の列全体に条件付き書式を追加
With ws.Columns(Target.Column).FormatConditions.Add(Type:=xlExpression, Formula1:="=TRUE")
.Interior.Color = RGB(255, 255, 153)
End With
End Sub
条件付き書式を使う方法なら、セルのInterior.Colorを直接書き換えないため、元々設定していたセルの塗りつぶしを消してしまう心配がありません。ただし条件付き書式のルールが増えすぎるとファイルが重くなることがあるので、毎回FormatConditions.Deleteで前回のルールを削除してから追加するようにしましょう。
複数シートに適用したい場合
上記のコードは1枚のシートにしか効きません。ブック内のすべてのシートで同じ動作をさせたい場合は、ThisWorkbookモジュールにWorkbook_SheetSelectionChangeイベントを使うと便利です。
' ThisWorkbookモジュールに記述
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim ws As Worksheet
Set ws = Sh
ws.Cells.FormatConditions.Delete
With ws.Rows(Target.Row).FormatConditions.Add(Type:=xlExpression, Formula1:="=TRUE")
.Interior.Color = RGB(255, 255, 153)
End With
With ws.Columns(Target.Column).FormatConditions.Add(Type:=xlExpression, Formula1:="=TRUE")
.Interior.Color = RGB(255, 255, 153)
End With
End Sub
Workbook_SheetSelectionChangeは、ブック内のどのシートで選択位置が変わっても発生するイベントです。Sh引数に選択が変更されたシートオブジェクトが渡されるため、シートごとにコードを書く必要がなくなります。
注意点
SelectionChangeイベントはセルを選択するたびに頻繁に発生します。重い処理を書くと操作がもたつく原因になるため、色付けのようなシンプルな処理にとどめましょう。Application.EnableEvents = Falseを使わずにFormatConditionsを操作すると、まれに再帰的にイベントが発生することがあります。動作が不安定に感じた場合は、処理の先頭でApplication.EnableEvents = Falseにし、処理の最後でTrueに戻す実装も検討してください。- ブックを保存する際、条件付き書式の設定も一緒に保存されます。ファイルを配布する場合は、開いたタイミングでルールをリセットする処理(
Workbook_Openなど)を用意しておくと安心です。
まとめ
この記事では、Worksheet_SelectionChangeイベントを使って選択中の行・列を自動ハイライトする方法を紹介しました。
Worksheet_SelectionChangeはセルの選択位置が変わるたびに発生するイベントInterior.Colorで直接色を変える方法はシンプルだが、既存の書式を壊す可能性があるFormatConditions(条件付き書式)を使う方法なら、既存の書式を保持したままハイライトできる- ブック全体に適用したい場合は
ThisWorkbookのWorkbook_SheetSelectionChangeイベントを使う
大きな表を扱うときに選択中の位置が分かりやすくなるだけで、作業効率がぐっと上がります。ぜひ自分の業務ファイルにも組み込んでみてください。


コメント