Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5115 / 13644 ツリー ←次へ | 前へ→

【52560】IsNumericに関して おタケ 07/11/19(月) 23:36 質問[未読]
【52561】Re:IsNumericに関して Blue 07/11/20(火) 1:51 回答[未読]
【52564】Re:IsNumericに関して Jaka 07/11/20(火) 9:43 発言[未読]

【52560】IsNumericに関して
質問  おタケ  - 07/11/19(月) 23:36 -

引用なし
パスワード
   IsNumericメソッドに関して質問です。

セル内に入力されている内容が数値だった場合、メッセージを表示させたいので以下のコードを作成しました。


If IsNumeric(Range("A1")) Then
Else(※)
MsgBox = "数値じゃありません。"
End If

(※)Elseの前には処理が入るのですが、ココでは省略します。
この場合動作は問題ありませんでした。
ただ、これを元に引数でA1内の文字列情報を渡すと、動作がおかしくなります。


別プロシージャで以下の用にA1セルの文字列を取得。
Dim a as String
a = Range("A1").Value


If IsNumeric(a) Then
Else
MsgBox = "数値じゃありません。"
End If


引数で文字列情報渡し、その情報が空欄だった場合Elseに入ってしまいます。
どうしてセルから直接情報を取得した場合と、引数で渡した場合とで結果が異なるのでしょうか?
どなたかご教授願います。

【52561】Re:IsNumericに関して
回答  Blue  - 07/11/20(火) 1:51 -

引用なし
パスワード
   IsNumeric関数はVariant型の値を引数にとります。
何もセルに入力されていないときのRangeオブジェクトのValueプロパティの値は

Dim v As Variant

v = Range("A1").Value

として確認してみるとわかると思いますが、"Empty値"となります。
Empty値をIsNumeric関数の引数に指定するとTrueがかえります。

一方、Variant型変数ではなくString型変数にEmpty値を入れると

Dim v As Variant
Dim s As String

v = Range("A1").Value
s = v

s は"空文字"になってしまいます。
空文字をIsNumeric関数の引数に指定するとFalseがかえります。

つまり、String型変数に入れることによってEmpty値の扱いが違う(?)ため
IsNumeric関数の結果が変わってしまうのです。
(String型変数で表せないEmpty値をString型変数に入れることによって、情報が変わってしまう。)

String型変数ではなくVariant型変数で渡すか、
もとから空文字(Empty値)かを見てから判定するかにすればよいでしょう。


ちなみに
>If IsNumeric(Range("A1")) Then
Valueプロパティは省略しないほうが良いでしょう。

【52564】Re:IsNumericに関して
発言  Jaka  - 07/11/20(火) 9:43 -

引用なし
パスワード
   読んで置くといいと思います。
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=52445;id=excel

表示形式をどう捉えるかでも変わると思います。

5115 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free