更新日:、 作成日:

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 = "アクティブ"