プログラミング

プログラミングに関するフォーラムです。VBAは除きます。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
またTypeNameに関して
投稿日時: 17/02/05 14:28:50
投稿者: hisayanxp

Option Explicit
Dim Test
    Test=CInt(InputBox("文字でも数字でも入力してください。") )
If Isnumeric(Test)=True Then
    MsgBox TypeName(Test)
Else
    MsgBox("入力されたのは数字ではありません。")
End If
※123と入力するとIntergerと表示されます。これは納得できます。
abcのような文字だと「型が一致しません」というエラー値が出ます。このことにも納得できます。
Test=CInt(InputBox("文字でも数字でも入力してください。") )
の段階でabcでは数値データとして解釈できないから。
 
問題は次の場合です。
Option Explicit
Dim Test
    Test=InputBox("文字でも数字でも入力してください。")
If Isnumeric(Test)=True Then
    MsgBox TypeName(Test)
Else
    MsgBox("入力されたのは数字ではありません。")
End If
IsNumeric 関数は、「渡された式/値が数値データとして評価できるかどうか」を 判別するための関数
だとすると
※123と入力しても数値データとして評価できないはずだから「入力されたのは数字ではありません。」と表示されなければならないのではないでしょうか?実際はStringと表示されます。←←←←←←←←
abcのような文字だと「入力されたのは数字ではありません。」と表示されます。これは納得できます。

回答
投稿日時: 17/02/05 15:15:57
投稿者: かすみの

結論としては、値"123"は数値変換可能である「文字列」であるので、その挙動となる。
となります。
 

引用:
IsNumeric 関数は、「渡された式/値が数値データとして評価できるかどうか」を 判別するための関数
だとすると

間違いはなく、その認識で正しいです。
 
If Isnumeric(Test)=True Then
    MsgBox TypeName(Test) ←ここ
Else
    MsgBox("入力されたのは数字ではありません。")
End If
  
つまりTestをVariantとした場合、ここ
に入るものとしては・・・
@Variant/Int、Variant/Double などの暗黙変換で数値であるもの。
AVariant/Stringのうち、数値変換可能な「文字列」
の、どちらかとなります。
 
変数Test自体はInputBoxの戻り値を受けるので(暗黙的に)Variant/Stringであるはずです。
(type指定とかできるにせよ、大よそStringのはず)
 
なので・・・
IsNumeric("123") → true : "123"は 数値変換可能な「文字列」 →上記Aのケース
IsNumeric("abc") → false : "abc"は 数値変換不可能な「文字列」→@でもAでもないケース
となります。
 
要は、どちらも「文字列」としての評価をしただけに過ぎないので、
質問の結果になるということになります。
[/quote]

投稿日時: 17/02/05 18:28:58
投稿者: hisayanxp

かすみの さん
ありがとうございました。納得しました。