Excel全ファイル対応!既存書式を汚さない「十字ハイライト」アドインをVBAで作成する(Altキー・A1セルでの解除機能付き)
★右クリックメニューに「十字ハイライトのON/OFF」を追加する
はじめに
Excelで大量のデータを扱っているとき、「今どこのセルを見ているか」を見失うことはありませんか?
よくある「条件付き書式」や「セルの塗りつぶし」を書き換えるVBAでは、**「既存の書式を壊してしまう」「Ctrl+Z(戻る)が効かなくなる」**といったデメリットがあります。
本記事では、**「アドイン(.xlam)」形式で実装し、「行と列を丸ごと選択状態にする」**ことで、既存の書式を一切汚さず、かつ全てのExcelファイルで有効になる十字ハイライトツールの作り方を紹介します。
このツールの特徴
- 全ファイル対応: アドインとして導入するため、どのExcelを開いても動きます。
- 書式維持: セルの色を変えないので、色分けされた表でも安心です。
-
スマートな解除: 以下の操作で即座にハイライトを解除できます。
- A1セルを選択: 十字が消えて標準状態に戻ります。
- Alt + クリック: コピペしたい時など、一時的に解除したい時に有効。
-
コピペ保護:
CutCopyModeを判定し、コピー操作を邪魔しません。
実装コード
1. クラスモジュールの作成
クラスモジュールを挿入し、オブジェクト名を AppEventClass に変更して以下のコードを貼り付けてください。ここではWindows APIを使用してAltキーの状態を監視しています。
Option Explicit
#If VBA7 And Win64 Then
'64bit版
Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#Else
'32bit版
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#End If
' Windows APIの定義(Altキーの状態を判定)
Private Const VK_MENU As Long = &H12 ' Altキーの定数
Public WithEvents App As Application
Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
' 1. Altキーが押されている場合は、十字を解除して終了(コピペ時に便利)
If GetAsyncKeyState(VK_MENU) < 0 Then
GoTo ClearAndExit
End If
' 2. A1セルが選択された場合は、ハイライトを解除(スイッチ機能)
If Target.Address(False, False) = "A1" Then
GoTo ClearAndExit
End If
' 3. コピーモード中や複数セル選択時もハイライトしない
If App.CutCopyMode <> 0 Or Target.Count > 1 Then
Exit Sub
End If
' --- 十字表示処理 ---
App.EnableEvents = False
App.ScreenUpdating = False
' 行全体と列全体を選択状態にする
Union(Target.EntireRow, Target.EntireColumn).Select
Target.Activate ' アクティブセルを白抜きにする
App.EnableEvents = True
App.ScreenUpdating = True
Exit Sub
ClearAndExit:
' ハイライトを解除して通常の1セル選択状態に戻す
App.EnableEvents = False
Target.Select
App.EnableEvents = True
End Sub
2. 標準モジュールの作成
アドイン起動時にイベント監視を開始させるためのコードです。
Dim myApp As New AppEventClass
' Excel起動時に実行
Sub Auto_Open()
Set myApp.App = Application
End Sub
導入方法
- 上記コードを記述したExcelファイルを「名前を付けて保存」から Excel アドイン (.xlam) 形式で保存します。
- Excelの [ファイル] > [オプション] > [アドイン] > 下部の設定ボタンをクリック。
- 作成したアドインにチェックを入れれば完了です。
技術的ポイントの解説
- Union().Select: セルの色を塗るのではなく「選択範囲」を拡張しているだけなので、ファイル保存時に余計なデータが残りません。
- GetAsyncKeyState: マウス操作とキー入力を組み合わせることで、VBA標準イベントでは難しい「Alt+クリック」という高度な操作判定を実現しています。
-
EnableEventsの制御:
Select操作自体がイベントを発生させるため、無限ループに陥らないよう適切にイベントを制御しています。
ここまでよければ、ここまででもいいけど、、、
確かに、毎回「A1をクリック」や「Altを押しながら」と意識するよりも、「今は使う、今は使わない」をカチッと切り替えられる物理的なスイッチがある方が、実務では圧倒的に安心感がありますね。
アドイン(.xlam)として運用する場合、「右クリックメニュー」にスイッチを追加するのが、どのファイルを開いていてもすぐに操作できて最も便利です。
最終リソースのコードを活かしつつ、スイッチ機能を追加した構成をまとめました。
1. クラスモジュール(AppEventClass)の修正
クラス変数の冒頭に、ON/OFFを判定する Public 変数を追加します。
Option Explicit
' (API宣言部分はそのまま)
#If VBA7 And Win64 Then
Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#Else
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
#End If
Private Const VK_MENU As Long = &H12
Public WithEvents App As Application
Public IsEnabled As Boolean ' ★スイッチの状態を保持する変数
Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
' ★スイッチがOFFなら何もしない
If Not IsEnabled Then Exit Sub
' 1. Altキーが押されている場合は解除
If GetAsyncKeyState(VK_MENU) < 0 Then GoTo ClearAndExit
' 2. A1セルが選択された場合は解除
If Target.Address(False, False) = "A1" Then GoTo ClearAndExit
' 3. コピーモード中や複数セル選択時は何もしない
If App.CutCopyMode <> 0 Or Target.Count > 1 Then Exit Sub
' --- 十字表示処理 ---
App.EnableEvents = False
App.ScreenUpdating = False
Union(Target.EntireRow, Target.EntireColumn).Select
Target.Activate
App.EnableEvents = True
App.ScreenUpdating = True
Exit Sub
ClearAndExit:
App.EnableEvents = False
Target.Select
App.EnableEvents = True
End Sub
2. 標準モジュールの修正(メニュー作成)
右クリックメニューに「十字ハイライトのON/OFF」を追加するコードです。
Dim myApp As New AppEventClass
' アドイン読み込み時にメニュー作成
Sub Auto_Open()
Set myApp.App = Application
myApp.IsEnabled = True ' 初期状態はON
Call CreateMenu
End Sub
' 右クリックメニューに項目を追加
Sub CreateMenu()
Dim cb As CommandBarControl
Call DeleteMenu ' 二重登録防止
Set cb = Application.CommandBars("Cell").Controls.Add(Type:=msoControlButton, Temporary:=True)
With cb
.Caption = "十字ハイライトの切替"
.OnAction = "ToggleHighlight" ' 実行する関数名
.BeginGroup = True ' 区切り線を入れる
End With
End Sub
' メニューを削除
Sub DeleteMenu()
On Error Resume Next
Application.Bars("Cell").Controls("十字ハイライトの切替").Delete
End Sub
' ON/OFFを切り替える処理
Sub ToggleHighlight()
myApp.IsEnabled = Not myApp.IsEnabled
If myApp.IsEnabled Then
MsgBox "十字ハイライトを 【ON】 にしました"
Else
MsgBox "十字ハイライトを 【OFF】 にしました"
' OFFにした瞬間に選択範囲をリセットしてあげる(親切設計)
Selection.Cells(1).Select
End If
End Sub
これでどう変わるか?
- 右クリックで切替: セルを右クリックすると、メニューの一番下に**「十字ハイライトの切替」**が現れます。
- 完全停止: OFFにすれば、マクロ自体が動かなくなるので、普通のExcelとして100%の操作性に戻ります。
- 安心感: 「コピペをたくさんする作業だから今はOFF」「データのチェックだからON」という使い分けが、ファイルを選ばずいつでも可能です。