[[20260525085518]] 『セルの違いを判断したい』(まさる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『セルの違いを判断したい』(まさる)

 以下のプログラムを実行します。

 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


Range("A1").Value = NullString
MsgBox IsEmpty(Range("A1"))
Range("A1").Formula = "="""""
Range("A1").Copy
Range("A1").PasteSpecial
MsgBox IsEmpty(Range("A1"))
Application.CutCopyMode = False
(パハップス) 2026/05/25(月) 11:42:00

 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.