空白セルかどうか判定するには
VBAの処理でよくあるのが「セルが空白かどうか」を判定する場面です。
ほとんどの場合は以下のようにRangeオブジェクトのValueプロパティが空文字列””かどうかの書き方でOKです。
If Range(“A1”).Value = “” Then
この書き方でほとんどの場合は判定できます。Rangeオブジェクトの書き方がいくつかあるのでそれを以下で紹介します。
なお、この書き方で判定できないのはセルの数式がエラーになっている場合です。それについては後述します。
空白判定の書き方
Rangeオブジェクトの書き方には複数あります。「Range(“セル座標”)」、「Cells(行位置, 列位置)」の主に2つの書き方と、それに加えてRangeオブジェクト変数を扱う書き方などです。
以下に4種類のコードがありますが、いずれの書き方もA1セルの値が空文字列かどうか判定しています。
Range(“セル座標”) での書き方
1 2 3 4 5 6 |
Sub checkBlankCell1() '// A1セルの値が空文字列の場合 If Range("A1").Value = "" Then Debug.Print "blank" End If End Sub |
Cells(y, x) での書き方
1 2 3 4 5 6 |
Sub checkBlankCell2() '// A1セルの値が空文字列の場合 If Cells(1, 1).Value = "" Then Debug.Print "blank" End If End Sub |
Rangeオブジェクト変数に代入する書き方
1 2 3 4 5 6 7 8 9 10 11 |
Sub checkBlankCell3() Dim r As Range '// セル '// A1セルのRangeオブジェクトを変数rに格納 Set r = Range("A1") '// A1セルの値が空文字列の場合 If r.Value = "" Then Debug.Print "blank" End If End Sub |
Rangeオブジェクト変数とValue値の文字列変数に代入する書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub checkBlankCell4() Dim r As Range '// セル Dim s As String '// セルのValue値 '// A1セルのRangeオブジェクトを変数rに格納 Set r = Range("A1") '// A1セルのRangeオブジェクトのValue値を取得 s = r.Value '// A1セルの値が空文字列の場合 If s = "" Then Debug.Print "blank" End If End Sub |
セルの数式がエラーになっている場合
上記はセルの値がエラーになっていない場合の書き方ですが、セルに「#N/A!」(参照先が無いエラー)や「#DIV/0!」(0割りエラー)のようなエラー表示がされている場合は、「Range.Value」のValueプロパティで値が取得できないため、エラーとしてVBAの処理が止まってしまいます。
もしエラー値かどうかを判定したいのであれば以下のようにRangeオブジェクトのValue値に対してIsError関数を利用します。
1 2 3 4 5 6 7 |
Sub checkBlankCell5() '// A1セルの値がエラー値の場合 If IsError(Range("A1").Value) = True Then '// どういうエラーなのかCVErr関数でを出力する Debug.Print CVErr(Range("A1").Value) End If End Sub |
IsError関数の詳細は「VBAでセルの数式がエラーか判定する(IsError)」をご参照ください。
ここで問題になるのが、エラー判定のコードを書いた方がいいかどうか、という点です。
このようなエラー値の対応を入れるかどうかは、状況によって変わります。具体的には、セルにエラーが無いことを前提とするか、エラーがあることを前提とするか、です。
VBAを実行するとかしないとかの前に、ブックのデータがエラーになっていておかしいのでセルの値が正しく表示されるように修正するのが先、という場合の方がおそらく多いでしょう。
ここではセルがエラー値かどうかという話だけですが、他にもブックのデータが想定していない内容であることが多岐にある場合、それら全部の不正チェックをVBAでやるのか、という話です。
おそらくそこで想定されるエラー処理を入れても日の目を見ないことの方が圧倒的に多いはずです。多くの場合はブックを直せばエラーは解消するので。
なので、セルの値がエラーかどうかの判定はよほどの場合にのみ入れるようにしておき、通常は上記の「If Range(セル座標).Value = “” Then」での空白チェックでよいと思われます。
ちなみに私はほとんどの場合においてIsError関数での判定処理は入れません。面倒なので。