1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Excel時短術】全ファイル対応!セル選択で「十字ハイライト」を表示する爆速アドインの作り方

1
Last updated at Posted at 2026-04-24

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

導入方法

  1. 上記コードを記述したExcelファイルを「名前を付けて保存」から Excel アドイン (.xlam) 形式で保存します。
  2. Excelの [ファイル] > [オプション] > [アドイン] > 下部の設定ボタンをクリック。
  3. 作成したアドインにチェックを入れれば完了です。

技術的ポイントの解説

  • 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

これでどう変わるか?

  1. 右クリックで切替: セルを右クリックすると、メニューの一番下に**「十字ハイライトの切替」**が現れます。
  2. 完全停止: OFFにすれば、マクロ自体が動かなくなるので、普通のExcelとして100%の操作性に戻ります。
  3. 安心感: 「コピペをたくさんする作業だから今はOFF」「データのチェックだからON」という使い分けが、ファイルを選ばずいつでも可能です。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?