エクセルの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)の使い方で結果が変わるのは驚いた。