HOME > 即効テクニック > Excel VBA > 書式設定関連のテクニック > 条件付き書式の条件を調べる(3)

即効テクニック

書式設定関連のテクニック

条件付き書式の条件を調べる(3)

(Excel 97/2000/2002/2003)

セルの条件付き書式を設定すると、設定した条件が正しいときだけ書式が反映されます。 では、任意のセルに設定した条件付き書式が反映されているかどうかを判定するにはどうしたらいいでしょう。 それにはまず、設定されている条件を調べなければなりません。

「数式が」で設定した条件を取得するのは簡単です。FormatConditionオブジェクトのFormula1プロパティを調べればいいのですが、数式内で相対参照形式を使っている場合はアクティブセルの位置に注意が必要です。 セル範囲B2:B5に設定した条件の数式は次のようにして取得します。

Sub Sample1()
 Dim i As Long
 For i = 2 To 5
   Cells(i, 2).Activate
   MsgBox ActiveCell.FormatConditions(1).Formula1
 Next i
End Sub
「セルの値が」で設定した条件は「次の値に等しい」「次の値より大きい」などの種類を、FormatConditionオブジェクトのOperatorプロパティで取得できます。 ただし、Operatorプロパティは数値を返しますので、次のように判定します。
Sub Sample2()
 Dim buf As String, Ad As String
 Ad = ActiveCell.Address(False, False)
 With ActiveCell.FormatConditions(1)
   Select Case .Operator
   Case 1
     buf = "=AND(" & .Formula1 & "<=" & Ad & "," & Ad & "<="  _
        & .Formula2 & ")"
   Case 2
     buf = "=NOT(AND(" & .Formula1 & "<=" & Ad & "," & Ad & "<="  _
        & .Formula2 & "))"
   Case 3
     buf = "=" & Ad & "=" & .Formula1
   Case 4
     buf = "=" & Ad & "<>" & .Formula1
   Case 5
    buf = "=" & Ad & ">" & .Formula1
   Case 6
     buf = "=" & Ad & "<" & .Formula1
   Case 7
     buf = "=" & Ad & ">=" & .Formula1
   Case 8
     buf = "=" & Ad & "<=" & .Formula1
   End Select
 End With
 MsgBox buf
End Sub

条件付き書式が「セルの値が」と「数式が」のどちらで設定されているかはFormatConditionオブジェクトのTypeプロパティで判定できます。 TypeプロパティがxlCellValue(1)の場合は「セルの値が」でxlExpression(2)のときは「数式が」で条件が設定されています。

さて、このようにして取得できた数式が「真かどうか」は、どうやって判定すればいいでしょう。たとえば「=A1>5」という数式が正しいかどうかは、次のように調べられます。

Sub Sample3()
 If Range("A1") > 5 Then
  MsgBox "真です"
 End If
End Sub
しかし、せっかく「=A1>5」のような数式が分かっているのですから、これをそのまま数式として判定したいものです。 そうすれば「数式が」で「=LEFT(A1,SEARCH(" ",A1)-1)="A"」などの複雑な数式にも簡単に対応できます。 文字列で表された数式を、数式として評価するにはApplicationオブジェクトのEvaluateメソッドを使います。 次のマクロは、「=A1>5」という数式を評価します。
Sub Sample4()
 If Evaluate("=A1>5") Then
  MsgBox "真です"
 End If
End Sub
もちろん、次のように計算を行うことも可能です。
Sub Sample5()
  MsgBox Evaluate("=SUM(A1:A5)")
End Sub   
Evaluateメソッドの特徴は、評価する式を文字列として指定できることです。 以上のことから、条件付き書式に設定した条件が「真かどうか」を判定するには次のようになります。条件付き書式を設定したセルにアクティブセルを移動してから実行してください。
Sub Sample6()
 Dim Ad As String, buf As String
 Ad = ActiveCell.Address(False, False)
 With ActiveCell.FormatConditions(1)
   If .Type = xlCellValue Then
     Select Case .Operator
     Case 1
       buf = "=AND(" & .Formula1 & "<=" & Ad & "," & Ad & "<=" & .Formula2 & ")"
     Case 2
       buf = "=NOT(AND(" & .Formula1 & "<=" & Ad & "," & Ad & "<="  & .Formula2 & "))"
     Case 3
       buf = "=" & Ad & "=" & .Formula1
     Case 4
       buf = "=" & Ad & "<>" & .Formula1
     Case 5
       buf = "=" & Ad & ">" & .Formula1
     Case 6
       buf = "=" & Ad & "<" & .Formula1
     Case 7
       buf = "=" & Ad & ">=" & .Formula1
     Case 8
       buf = "=" & Ad & "<=" & .Formula1
     End Select
   Else
     buf = ActiveCell.FormatConditions(1).Formula1
   End If
 End With
 If Evaluate(buf) Then
   buf = buf & vbCrLf & "は真です"
 Else
   buf = buf & vbCrLf & "は偽です"
 End If
 MsgBox buf
End Sub