エクセルのVBAでセル内が空白か0を判定する(備忘録)

エクセルのVBAでセル内が空白か0を判定する必要があったが、気になったので備忘録(20191030)

シートに下記のようにあったとして判定させるマクロを作成

 A  B  C
1 数字 1 
2 数字 0 (ゼロ)
3 空白  

マクロを4つ用意(1番目と2番目はほぼ同じ)3番目が間違った答えを出した。
Sub kuuhaku_zero()
    For a = 2 To 4
   
        If Cells(a, 2).Value = Empty Then
            If Cells(a, 2).Value <> "" Then
       
                MsgBox a & "行   " & "0"
            Else
           
                MsgBox a & "行   " & "空白"
            End If
               
        Else
       
            MsgBox a & "行   " & "0でない文字"
       
        End If

    Next a
End Sub


Sub kuuhaku_zero2()
    For a = 2 To 4
   
        If Cells(a, 2).Value = Empty Then
            If Cells(a, 2).Value <> "" Then
       
                MsgBox a & "行   " & "0"
            ElseIf Cells(a, 2).Value = "" Then
           
                MsgBox a & "行   " & "空白"
            End If
               
        Else
       
            MsgBox a & "行   " & "0でない文字"
       
        End If

    Next a
End Sub

Sub kuuhaku_zero3_誤り()
    For a = 2 To 4
   
        If IsEmpty(Cells(a, 2).Value) = True Then   'これは0を空と見ない
            If Cells(a, 2).Value <> "" Then
       
                MsgBox a & "行   " & "0"
            ElseIf Cells(a, 2).Value = "" Then
           
                MsgBox a & "行   " & "空白"
            End If
               
        Else
       
            MsgBox a & "行   " & "0でない文字"
       
        End If

    Next a
End Sub

Sub kuuhaku_zero4_別解()
    For a = 2 To 4
   
        If IsEmpty(Cells(a, 2).Value) = True Then   'これは0を空とみない

            If Cells(a, 2).Value = "" Then
           
                MsgBox a & "行   " & "空白"
            End If
               
        Else
            If Cells(a, 2).Value = 0 Then
       
                MsgBox a & "行   " & "0"
            Else
       
                MsgBox a & "行   " & "0でない文字"
            End If
        End If

    Next a
End Sub

つまり、If Cells(a, 2).Value = Empty Then だと、0も空白もtrue判定
(その後で<>""を使って、0と空白を分ける)
他方、IsEmpty関数を使ったIf IsEmpty(Cells(a, 2).Value) = True Thenだと、空白のみtrue判定
(0は空白にならなかった方(False)に入る)

理屈が分かれば4番目でもいいかと思ったが、4番目はセルに「数式」があった場合、
if(C5="","")
空白とはせず"0でない文字"になってしまう。

それで下記の形にした。


A  B  C
1 数字 1 
2 数字 0 (ゼロ)
3 空白  
4 数式  (="")

 

Sub kuuhaku_zero5_数式も()
    For a = 2 To 5   '5に直しました
   
        If Cells(a, 2).Value = Empty Then   '

            If Cells(a, 2).Value = "" Then
           
                MsgBox a & "行   " & "空白"
            Else
           
                MsgBox a & "行   " & "0"
            End If
               
        Else
           
       
            MsgBox a & "行   " & "0でない文字"
       
        End If

    Next a
End Sub

 

(エクセルのオプションで当該シートの0を表示しないようにしても動くようです。)

empty(isempty)の使い方で結果が変わるのは驚いた。