VBA セルの条件付き書式を取得する (Range.FormatConditions)

はじめに

Excel VBA マクロでセルの条件付き書式を取得する方法を紹介します。

Range("B1").FormatConditions または Cells(1, 2).FormatConditions プロパティから、セル「B1」の条件付き書式を取得できます。

FormatCondition オブジェクトから、通常の条件付き書式の条件や色などを取得または設定できます。他にもカラースケール ColorScale や、データバー Databar などもあります。

条件付き書式はとても複雑です。どの項目が何のプロパティかは Excel の「マクロの記録」から操作して確認するのが一番簡単です。
条件付き書式を設定するには「セルに条件付き書式を設定する」をご覧ください。
セルを範囲指定するすべての方法は「セルを範囲指定して取得する」をご覧ください。
  • 目次
    • セルの条件付き書式を取得する
    • セルの範囲の条件付き書式を取得する
    • 別シートのセルの条件付き書式を取得する

セルの条件付き書式を取得する

Range の引数にセル名を指定すると、そのセルの条件付き書式を取得できます。

セル「A1」の条件付き書式を取得するには Range("A1").FormatConditions を入力します。

Dim fcs As FormatConditions
Set fcs = Range("A1").FormatConditions
Debug.Print(fcs.Count)

Cells の引数にセルの行と列の番号を指定すると、そのセルの条件付き書式を取得できます。

行「2」、列「A」の条件付き書式を取得するには Cells(2, 1).FormatConditions を入力します。

Dim fcs As FormatConditions
Set fcs = Cells(1, 1).FormatConditions ' A1
Set fcs = Cells(2, 1).FormatConditions ' A2
Set fcs = Cells(1, 2).FormatConditions ' B1
Set fcs = Cells(2, 2).FormatConditions ' B2
Debug.Print(fcs.Count)

FormatConditions はコレクションになっており、インデックスに対応する条件付き書式が入っています。

Dim fcs As FormatConditions
Set fcs = Range("A1").FormatConditions

Dim fc As Variant ' FormatCondition
Set fc = fcs(1)   ' 1 つ目の条件付き書式を取得、ないときはエラー
Set fc = fcs(2)   ' 2 つ目の条件付き書式を取得、ないときはエラー

Dim s As String
s = fc.AppliesTo.Address ' 適用先
Debug.Print(s)

' 条件の取得
Dim l As Long
l = fc.Type     ' 条件の種類
Debug.Print(l)
' 以下は fc の型が FormatCondition の時
l = fc.Operator ' 条件
s = fc.Formula1 ' 1 つ目の値
s = fc.Formula2 ' 2 つ目の値

' 書式の取得
Dim bs As Borders
Dim f As Font
Dim i As Interior
Set bs = fc.Borders ' 罫線
Set f = fc.Font     ' フォント
Set i = fc.Interior ' 背景

条件付き書式が設定されている数は FormatConditions.Count で取得できます。Excel のルールの管理で表示される条件の数とインデックスも同じです。

' 条件付き書式なし
Debug.Print(Range("A1").FormatConditions.Count) ' 0
Debug.Print(Range("A1").FormatConditions(1).Type) ' エラー発生

' 条件付き書式 2 つ設定
Debug.Print(Range("A1").FormatConditions.Count) ' 2
5

FormatConditions から取得した条件付き書式に Type プロパティがあり、その種類を取得できます。

Type の値は次のものがあります。

定数名 説明
xlCellValue1セルの値が
xlExpression2数式が
xlColorScale3カラースケール
xlDatabar4データバー
xlTop105上位の 10 の値
XlIconSet6アイコンセット
xlUniqueValues8一意の値
xlTextString9テキスト文字列
xlBlanksCondition10空白の条件
xlTimePeriod11期間
xlAboveAverageCondition12平均以上の条件
xlNoBlanksCondition13空白の条件なし
xlErrorsCondition16エラー条件
xlNoErrorsCondition17エラー条件なし

この Type によって条件付き書式の型が変わります。通常は FormatCondition です。

Debug.Print(Range("A1").FormatConditions(1).Type) ' 条件の種類
Dim fc As FormatCondition   ' 通常の条件付き書式
Dim cs As ColorScale        ' xlColorScale
Dim db As Databar           ' xlDatabar
Dim tt As Top10             ' xlTop10
Dim isc As IconSetCondition ' XlIconSet
Dim uv As UniqueValues      ' xlUniqueValues
Dim aa As AboveAverage      ' xlAboveAverageCondition

Dim v As Variant
Set v = Range("A1").FormatConditions(1)

FormatCondition

通常の条件付き書式である FormatCondition を例に紹介します。

条件とプロパティは次のように対応しています。

6

Operator の値は次のものがあります。

定数名 説明
xlBetween1次の値の間
xlNotBetween2次の値の間以外
xlEqual3次の値に等しい
xlNotEqual4次の値に等しくない
xlGreater5次の値より大きい
xlLess6次の値より小さい
xlGreaterEqual7次の値以上
xlLessEqual8次の値以下

次の画像のように値を一つしか入力できないときに、Formula2 を取得しようとするとエラーが発生します。Formula2 を取得できるのは Operator が xlBetween (1) と xlNotBetween (2) のときです。

7
Debug.Print(Range("A1").FormatConditions(1).Formula2) ' エラー発生

セルの範囲の条件付き書式を取得する

セルの範囲「A1」~「B2」の条件付き書式を取得するには Range("A1:B2").FormatConditions または Range("A1", "B2").FormatConditions を入力します。

Dim fcs As FormatConditions
Set fcs = Range("A1:B2").FormatConditions
Set fcs = Range("A1", "B2").FormatConditions
Debug.Print(fcs.Count)

範囲内の各セルの条件付き書式を取得します。

適用先が同じ範囲のセルは 1 つの条件付き書式になります。適用先がセル「A1」~「A2」のときにセル「A1」~「A2」の FormatConditions.Count は 1 です。

これは Excel で条件付き書式のルールの管理を表示したときと同じです。

別シートのセルの条件付き書式を取得する

シートを指定するには Worksheets の引数にシート名またはインデックスを指定します。

Sheet1 を指定するには Worksheets("Sheet1") または Worksheets(1) を入力します。

sheet1
Dim fcs As FormatConditions
' Sheet1 のセル「A1」の条件付き書式を取得
Set fcs = Worksheets("Sheet1").Range("A1").FormatConditions
Set fcs = Worksheets(1).Range("A1").FormatConditions
Debug.Print(fcs.Count)

' Sheet2 のセル「A1」の条件付き書式を取得
Set fcs = Worksheets("Sheet2").Range("A1").FormatConditions
Set fcs = Worksheets(2).Range("A1").FormatConditions
Debug.Print(fcs.Count)

Sheet1 に Range や Cells を入力すると、自身のシートのセルになります。自身を表す Me. が省略されています。

' どちらも同じコード
Range("A1").Value = "Sheet1"
Me.Range("A1").Value = "Sheet1"

標準モジュールに Range や Cells を入力すると、開いているシートのセルになります。アクティブシートを表す ActiveSheet. が省略されています。

' どちらも同じコード
Range("A1").Value = "アクティブ"
ActiveSheet.Range("A1").Value = "アクティブ"