セルが値か数式かを判定するには
セルには値と数式の2種類が設定できます。このとき、値と数式のどちらが設定されているのかを調べたい場合に、HasFormulaプロパティで判定できます。
HasFormulaプロパティはRangeオブジェクトのプロパティの1つです。
なお、HasFormulaプロパティを使ってシートにある数式セルを探す方法を別ページで紹介しています。詳細は「VBAで数式が設定されているセルを高速で探す」をご参照ください。
構文
Property Range.HasFormula As Variant
親オブジェクト | Rangeオブジェクトを指定します。セルは1つでも複数セル範囲でも構いません。 |
戻り値 | Rangeオブジェクトが示すセル範囲の全てのセルに数式が設定されている場合はTrueを返します。
Rangeオブジェクトが示すセル範囲の全てのセルに数式が設定されていない場合はFalseを返します。 それ以外はNullを返します。 |
HasFormulaプロパティでNullを返す条件は、Rangeオブジェクトが複数のセル範囲の各セルで値や数式が混在している場合です。
例えば、4つのセル範囲をRangeオブジェクトが指している場合に、1つが値で、2つが数式で、1つが未設定(空)のような場合に値なのか数式なのかを判定できないためNullを返します。
同様に、4つのセルが全て数式であればTrueを返し、全て値であればFalseを返します。
1. セルが値か数式か調べる
A1セルに値か数式かどちらが設定されているかを判定するサンプルです。数式が設定されていればTrue、値であればFalseがイミディエイトウィンドウに出力されます。
1 2 3 |
Sub HasFormulaTest() Debug.Print Range("A1").HasFormula End Sub |
2. 選択セル範囲の数式セルを調べる
セル範囲を選択して以下の関数を実行すると、数式セルの座標と値がイミディエイトウィンドウに出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub HasFormulaInSelection() Dim r As Range '// セル '// 選択セル範囲をループ For Each r In Selection '// 数式セルの場合 If r.HasFormula = True Then '// セル座標とセル値を出力 Debug.Print r.Address(False, False) & ":" & r.Value End If Next End Sub |
実行例
B1,B2,C4の3つのセルに数式がある状態で、B1~C4セルを選択して実行すると、以下が出力されます。
B1:1
B2:1
C4:4
3. 複数セル範囲でのNull判定の実践例
複数セル範囲で数式と値が混在している場合、HasFormulaプロパティはNullを返します。この挙動を利用して、セル範囲が混在状態かどうかを判定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub CheckMixedRange() Dim result As Variant result = Range("A1:A5").HasFormula If IsNull(result) Then Debug.Print "範囲内に数式と値が混在しています" ElseIf result = True Then Debug.Print "全て数式です" Else Debug.Print "全て値です" End If End Sub |
4. 数式セルだけを選択する応用例
HasFormulaプロパティを使って、指定範囲内の数式セルだけを選択する実用的なマクロです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub SelectFormulaCells() Dim r As Range Dim formulaRange As Range '// 対象範囲を設定 For Each r In Range("A1:C10") If r.HasFormula = True Then If formulaRange Is Nothing Then Set formulaRange = r Else Set formulaRange = Union(formulaRange, r) End If End If Next '// 数式セルがあれば選択 If Not formulaRange Is Nothing Then formulaRange.Select MsgBox formulaRange.Count & "個の数式セルを選択しました" Else MsgBox "数式セルが見つかりませんでした" End If End Sub |
5. 実務での活用シーン
HasFormulaプロパティは以下のような場面で役立ちます。
- データ選別時: 数式セルと値セルを区別して処理する。
- ブック検証時: 想定外の場所に数式が入っていないかチェックする。
- データ移行時: 数式を値に変換する前に、数式セルの位置を特定する。
- エラー調査時: 数式エラーが発生しているセルを特定する
注意点とTips
- HasFormulaプロパティは読み取り専用です。このプロパティで値を設定することはできません。
- 空白セルの場合、HasFormulaはFalseを返します。
- 配列数式もHasFormulaはTrueを返します。
- IsNull関数を使ってNull判定を行う場合、必ずVariant型の変数に代入してから判定してください。
- 直接比較(If Range(“A1”).HasFormula = Null)は正しく動作しません。