スピル範囲の自動色付け(強調表示)
このVBAコードは、ワークシート上で計算が発生するたび、数式の結果が複数のセルに展開される「スピル」機能が使われているセルを検出し、そのスピル先の全てのセル範囲に特定の条件付き書式を適用します。
これにより、どのセルが動的なスピル結果であるかを視覚的に分かりやすくします。

スピル範囲の自動色付け(強調表示)するVBA
Private Sub Worksheet_Calculate()
On Error Resume Next
Application.ScreenUpdating = False
Const AutoRuleFormula = "=N(""スピル自動書式"")=0" '常に「TRUE」
Const AutoRuleColor = &HFFFFCC '水色:RGB(204, 255, 255)
'前回の条件付書式を削除
Dim CurrentRule As FormatCondition
For Each CurrentRule In Me.Cells.FormatConditions
If CurrentRule.Type = xlExpression And CurrentRule.Formula1 = AutoRuleFormula Then
CurrentRule.Delete
End If
Next CurrentRule
'数式の全セルを取得
Dim AllFormulas As Range
Set AllFormulas = Me.UsedRange.SpecialCells(xlCellTypeFormulas)
'現在のスピル範囲に条件付書式を設定
Dim rng As Range
If Not AllFormulas Is Nothing Then
For Each rng In AllFormulas.Cells
' スピル数式のセルのみを対象
If rng.HasSpill = True Then
With rng.SpillingToRange.FormatConditions.Add(Type:=xlExpression, Formula1:=AutoRuleFormula)
.Interior.Color = AutoRuleColor
End With
End If
Next
End If
Application.ScreenUpdating = True
On Error GoTo 0
End Sub
スピル範囲の自動色付け(強調表示)するVBAの解説
これは、「ワークシート上の計算結果が変更されたとき」にExcelが自動で実行する仕組みです。
具体的にはセルの値が変更されたり、数式の結果が更新されたりして、シートの再計算が発生するたびに、このコードが自動的に呼び出されます。
このコードは、ワークシート上の計算結果が変更されたとき(セルに入力や数式の再計算が行われたとき)に自動的に実行されます。
処理中に画面がちらつくのを防ぐため、画面の更新を一時的に停止しています。処理終了時にTrueに戻されます。
これは条件付き書式のための「常に真(TRUE)」になる数式を定義しています。
N()関数は引数を数値に変換し、テキストの場合は0を返すため、0=0で常に「TRUE」となります。
特定のセルを参照せずに、常にTRUEになる式にすることで、セル範囲全体に常に一律で同じ書式を適用するために使用しています。
適用する背景色(水色:RGB(204, 255, 255))の値を定義しています。
シート全体に設定されている条件付き書式を一つずつ確認します。
タイプが「数式」(xlExpression)であり、かつ、このマクロが自動で設定した特定の数式(AutoRuleFormula)である場合にのみ、その書式をCurrentRule.Deleteで削除します。
シートのデータ範囲(UsedRange)内から、数式が入力されているセルだけをすべて抽出します。
抽出した数式セル(rng)が、スピル機能を持っている(結果が複数のセルに展開されている)かを確認します。
スピル機能を持っている場合、このプロパティで数式の結果が展開されている全てのセル範囲(スピル範囲全体)を取得します。
取得したスピル範囲全体に対して、定義したAutoRuleFormula(常にTRUE)とAutoRuleColor(水色)の条件付き書式を新しく設定します。
Grokが作成したVBA
Private Sub Worksheet_Calculate()
Dim prevRanges As Collection
Set prevRanges = GetPrevRanges()
If Not prevRanges Is Nothing Then
Dim addr
For Each addr In prevRanges
On Error Resume Next
Range(addr).Interior.ColorIndex = xlNone
Next
End If
Set prevRanges = New Collection
Dim cell As Range
For Each cell In Me.UsedRange.SpecialCells(xlCellTypeFormulas)
If cell.HasSpill Then
Dim spillRng As Range
Set spillRng = cell.SpillingToRange
spillRng.Interior.Color = RGB(204, 255, 255)
prevRanges.Add spillRng.Address
End If
Next
SavePrevRanges prevRanges
End Sub
Private Function GetPrevRanges() As Collection
On Error Resume Next
Dim prop As String
prop = ThisWorkbook.CustomDocumentProperties("PrevSpillRanges").Value
If prop = "" Then Exit Function
Set GetPrevRanges = New Collection
Dim addrs: addrs = Split(prop, ",")
Dim i As Integer
For i = 0 To UBound(addrs)
GetPrevRanges.Add addrs(i)
Next
End Function
Private Sub SavePrevRanges(ranges As Collection)
Dim propVal As String
If ranges.Count > 0 Then
Dim i As Integer
For i = 1 To ranges.Count
propVal = propVal & ranges(i) & ","
Next
propVal = Left(propVal, Len(propVal) - 1)
End If
On Error Resume Next
ThisWorkbook.CustomDocumentProperties("PrevSpillRanges").Delete
ThisWorkbook.CustomDocumentProperties.Add "PrevSpillRanges", False, msoPropertyTypeString, propVal
End Sub
サイト内の参考ページ
同じテーマ「マクロVBAサンプル集」の記事
数式の参照しているセルを取得する
増殖した条件付き書式を整理統合する
条件付き書式で変更された書式を取得する
セル結合/解除でセル値を退避/回復
セル結合なんて絶対に許さないんだからね
セルの数式をネスト色分けしてコメント表示
セル結合して表を見やすくする(非推奨)
シートを削除:不定数のシート名に対応
セル番地でバラバラに指定されたセルの削除
シート内に散在する複数表の縦結合
スピル範囲の自動色付け(強調表示)
新着記事NEW ・・・新着記事一覧を見る
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- スピル範囲の自動色付け(強調表示)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
