『セルの違いを判断したい』(まさる)
以下のプログラムを実行します。
Private Sub CommandButton1_Click()
Dim varval As Double
On Error Resume Next
varval = Range("A1")
If Err.Number = 0 Then Debug.Print ("OK A1") Else Debug.Print ("NG A1")
Err.Clear
varval = Range("A3")
If Err.Number = 0 Then Debug.Print ("OK A3") Else Debug.Print ("NG A3")
Debug.Print (Range("a1").Text = Range("a3").Text)
Debug.Print (Range("a1").Value = Range("a3").Value)
End Sub
これを実行させた結果は以下のようになっています。 見た目はA1,A3ともに "" です。
OK A1 NG A3 True True
何が異なるとこうなるのでしょうか? また、どのようにして調べればいいのでしょうか?
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
A1セルが何も入力されていないセルでA3セルは式が入力されていて式の結果が""だとか?
つまりA1セルがnull(未入力)でA3セルが""(空文字)だとか。
nullは文字と比較した場合には""と数値と比較した際には0と判断される。
なのでA3セルに0と入力して実行すると
OK A1 OK A3 False True という結果になる。 (ねむねむ) 2026/05/25(月) 09:14:37
>見た目はA1,A3ともに "" です。 長さ0の文字列と空白(Empty)は違います。 それぞれのセルに、何をどのように入力したのか説明してください。
On Error Resume Nextの使い方について疑問もありますが、まずは上記に回答ください。 (xyz) 2026/05/25(月) 09:23:01
Long型の変数に代入してエラーになるかどうかを判定していますが、 こういうコードを組むなら、どういうときにエラーになるのかならないのか 分かってないといけないですよね
Sub test()
Dim varval As Long
On Error Resume Next
Range("A1").ClearContents ' 空白
varval = Range("A1")
Debug.Print "[" & Range("A1").Value & "]"; vbTab; IIf(Err.Number = 0, "正常", "エラー:"); Err.Description
Err.Clear
Range("A1").Value = "" ' 空白文字
varval = Range("A1")
Debug.Print "[" & Range("A1").Value & "]"; vbTab; IIf(Err.Number = 0, "正常", "エラー:"); Err.Description
Err.Clear
Range("A1").Value = 1 ' 数値
varval = Range("A1")
Debug.Print "[" & Range("A1").Value & "]"; vbTab; IIf(Err.Number = 0, "正常", "エラー:"); Err.Description
Err.Clear
Range("A1").Value = "1" ' 数値を表す文字
varval = Range("A1")
Debug.Print "[" & Range("A1").Value & "]"; vbTab; IIf(Err.Number = 0, "正常", "エラー:"); Err.Description
Err.Clear
Range("A1").Value = "&HA" ' 数値を表す文字
varval = Range("A1")
Debug.Print "[" & Range("A1").Value & "]"; vbTab; IIf(Err.Number = 0, "正常", "エラー:"); Err.Description
Err.Clear
Range("A1").Value = "A" ' 文字
varval = Range("A1")
Debug.Print "[" & Range("A1").Value & "]"; vbTab; IIf(Err.Number = 0, "正常", "エラー:"); Err.Description
Err.Clear
End Sub (´・ω・`) 2026/05/25(月) 09:38:14
> On Error Resume Nextの使い方 使わずにエラーに出すべきかなと思います。必要な情報が出力されるのに任せたほうがよいかと。 (もちろん、多数の方が使用するもので止まったら困るなら話は別ですが) 使うなら既に指摘があるようにErr.No,Err.Descriptionをデバッグ出力します。
# 蛇足ですが、一般的な話として # On Error Resume Nextをむやみに使うと、本来のエラーを隠蔽してしまうリスクがあります。 # できるだけOn Error Resume Nextは狭い範囲で使うのがよいとされていると思います。
(xyz) 2026/05/25(月) 09:59:21
セルを調べてみると A1 = Empty A3 = "" このようになっていました。 セルを選択して Delete や、文字を BackSpace で消した場合は Empty になります。 どのようにすれば、 A1 = Empty → "" にすることができるのでしょうか? (まさる) 2026/05/25(月) 10:27:24
(xyz)さんへ >それぞれのセルに、何をどのように入力したのか説明してください。 知らないままにこうなっていたのです。 少なくともプログラムではやっていません。 (まさる) 2026/05/25(月) 10:29:47
(xyz)さんへ
> On Error Resume Nextの使い方
今回はテスト用に作っていて 一度に結果表示したかったので、On Error Resumu Next を 使っていますが、実際のプログラムでは使用していません。 (まさる) 2026/05/25(月) 10:33:53
わたしちょっと思い違いをしていました。 先の私の書き込みは無視してください。
Range("A1").Value=""
のときと
Range("A1").Formula = "="""""
では挙動が違うんですね
(´・ω・`) 2026/05/25(月) 11:12:57
「Emptyであるか」と「Emptyと等しいか」は別物なので、 Emptyを「""」にしたいのは何故なのか? という文脈によって対応方法は変わってきそうですよね。
Emptyと「""」を等しく取り扱うのであれば「Empty = ""」で考えれば良し、 区別しなければならないのであれば他の情報で判断する。 ...って事じゃないでしょか?
Range("A1").Value = Empty
Range("A3").Formula = "="""""
Dim var1, var3
var1 = Range("A1").Value
var3 = Range("A3").Value
Debug.Print var1 = Empty, var3 = Empty
Debug.Print var1 = "", var3 = "", var1 = 0#, var3 = 0#
Debug.Print TypeName(var1), TypeName(var3)
Debug.Print IsEmpty(var1), IsEmpty(var3)
Debug.Print IsNumeric(var1), IsNumeric(var3)
Debug.Print
var1 = 0#
var3 = ""
Debug.Print var1 = Empty, var3 = Empty
Debug.Print var1 = "", var3 = "", var1 = 0#, var3 = 0#
Debug.Print TypeName(var1), TypeName(var3)
Debug.Print IsEmpty(var1), IsEmpty(var3)
Debug.Print IsNumeric(var1), IsNumeric(var3)
(白茶) 2026/05/25(月) 11:38:19
Dim varval As Double
にしていると Empty の場合は 0 になるけど、
"" の場合はエラーになるというのを知らなかった。
そもそも、いままでそんなことがなかったので
数字がない場合は常に 0 になると思っていました。
なので、中身を確認したり比較して処理するような
プログラムをいままで作ったことがありません。
いまでも手動で空文字を入れる方法は見つけることができません。
今回いろいろ試してみて例えば
B1 の計算式に 「=IF(A1=0, "",A1)」を入れて
B1 セルの「値だけをコピー」すると、A1に空文字が入り
プログラムの処理中に
Varval = Range("A1")
とした時点で、エラーになる。
B1 =IF(A1=0, Empty,A1)
なんて、Empty にできればいいんですけどそれもできないみたいです。
プログラム中にはこのような代入文がたくさんありすぎて
今更すべてを対応するのも大変なので、使用者にコピーしないでって
お願いすることにします。
(まさる) 2026/05/25(月) 13:11:22
空であるかどうかを確認するにはISBLANK関数もありますが、 空にするには、単純にセル範囲を選択してDeleteキーを押すのが簡単でしょうか。 # そういう話でなければ失礼。 (xyz) 2026/05/25(月) 14:44:31
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.