即効テクニック |
セルの条件付き書式を設定すると、設定した条件が正しいときだけ書式が反映されます。 では、任意のセルに設定した条件付き書式が反映されているかどうかを判定するにはどうしたらいいでしょう。 それにはまず、設定されている条件を調べなければなりません。
「数式が」で設定した条件を取得するのは簡単です。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 SubEvaluateメソッドの特徴は、評価する式を文字列として指定できることです。 以上のことから、条件付き書式に設定した条件が「真かどうか」を判定するには次のようになります。条件付き書式を設定したセルにアクティブセルを移動してから実行してください。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