プログラミング

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

 
(Windows 7 Home Premium : 指定なし)
TypeNameとIsNumericに関して
投稿日時: 17/01/31 08:25:59
投稿者: hisayanxp

入力した値が数字かどうか判定する記述を下記のように作りました。
 
Option Explicit
Dim Test
Test=CInt(InputBox("文字でも数字でも入力してください。"))
If IsNumeric(Test)=True Then
MsgBox TypeName(Test)
Else
MsgBox("入力されたのは数字ではありません。")
End If
 
ところが文字を入力したときに
入力されたのは数字ではありません。と表示されずエラーになってしまいます。
どう変えたら良いでしょうか。
よろしくお願いします。

回答
投稿日時: 17/01/31 09:20:20
投稿者: sk

引用:
ところが文字を入力したときに
入力されたのは数字ではありません。と表示されずエラーになってしまいます。

引用:
Test=CInt(InputBox("文字でも数字でも入力してください。"))

数値データとして解釈できない文字列を、
CInt, CLng, CSng, CDbl などのデータ型変換関数によって
数値データに変換することはできません。
 
---------------------------------------------------------
 
Test=InputBox("文字でも数字でも入力してください。")
If IsNumeric(Test)=True Then
    '変数 Test に格納されている値のデータ型の名前を
    'メッセージボックスに表示
    MsgBox TypeName(Test)
    '変数 Test に格納されている値を
    'Integer 型のデータに型変換
    Test = CInt(Test)
    '変数 Test に格納されている値のデータ型の名前を
    'メッセージボックスに表示
    MsgBox TypeName(Test)
Else
    MsgBox("入力されたのは数値データに変換できない文字列です。")
End If
 
---------------------------------------------------------

回答
投稿日時: 17/01/31 22:15:40
投稿者: MMYS

http://www.moug.net/faq/viewtopic.php?t=75093
 
解説した内容を正しく理解できれば、 skさんが
書かれたサンプルは自力で作れるはずです。
 
よく理解できました。だけ回答しても、あなたが間違った解釈したのか、
正しく理解したのか、相手に伝わりませまん。
 
こんなコードを書いてみました。など
どのように理解したのかを書くべきかと。
 
 
 
変数の型について少々解説しておきます。
たとえば、 123 とあった場合、
@ いち に さん
A ひゃくにじゅぅさん
 
とふたつの解釈があります。つまり、
@は文字列です。
Aは数値です。
 
@の場合、「いち」「に」「さん」と単に文字が3つあるだけです。
Aの場合、数値なので数値を足したり引いたり出来ます。
 
人間ならどちらなのか柔軟に解釈できますが、コンピュータには無理なのです。
他のプログラム言語だと
・数値しか扱えない変数
・文字だけしか扱えない変数
のように指定できますが、VBSではその指定が出来ません。
で、内部でどうあつかわれているかを調べる関数が、TypeName関数です。
 

投稿日時: 17/02/03 15:24:12
投稿者: hisayanxp

だんだん混乱してきましたので、自分の中で整理をしてみました。すると、またこんな疑問が生じました。
以下の記述で、数字を入れたときに「string」と表示され、、文字を入力すると「入力されたのは数字ではありません。」と表示されます。InputBoxで返されるのは文字列のはずですから、数字であろうが文字であろうが「入力されたのは数字ではありません。」と表示されなくてはならないと思うのですが。
 
Option Explicit
Dim Test
Test=InputBox("文字でも数字でも入力してください。")
If Isnumeric(Test)=True Then
MsgBox TypeName(Test)
Else
MsgBox("入力されたのは数字ではありません。")
End If

回答
投稿日時: 17/02/03 17:44:15
投稿者: sk

引用:
以下の記述で、数字を入れたときに「string」と表示され、、
文字を入力すると「入力されたのは数字ではありません。」と表示されます。

引用:
Dim Test
Test=InputBox("文字でも数字でも入力してください。")

数字を入力しようが、それ以外の文字を入力しようが、
InputBox 関数の戻り値のデータ型が String 型である
ということに変わりはありません。
 
MSDN より:
https://msdn.microsoft.com/ja-jp/library/cc392195.aspx
https://msdn.microsoft.com/ja-jp/library/cc410238.aspx
 
引用:
InputBoxで返されるのは文字列のはずですから、数字であろうが文字であろうが
「入力されたのは数字ではありません。」と表示されなくてはならないと思うのですが。

引用:
If Isnumeric(Test)=True Then

IsNumeric 関数は、「渡された式/値が数値データとして評価できるかどうか」を
判別するための関数であって、「数値を扱うデータ型であるかどうか」や
「 0 から 9 までのアラビア数字のみで構成された文字列であるかどうか」を
判別するための関数ではありません。
 
MSDN より:
https://msdn.microsoft.com/ja-jp/library/cc410249.aspx
 
( InNumeric 関数の戻り値が True となる例)
-----------------------------------------------------------------
  +1          (正の符号が先頭につく数値)
  -1          (負の符号が先頭につく数値)
  1,000       (カンマで区切られた数値)
  0.1         (整数部、小数点、小数部で構成される数値)
  \1          (通貨記号(日本語環境なら \ )が先頭につく数値)
  &HFF        (先頭に &H がつく 16 進数表記の数値)
-----------------------------------------------------------------
 
以上のような文字列であれば、CLng, CInt, CDbl, CSng などの
データ型変換関数によって、数値データに変換することが出来ます。
(オーバーフローエラーの問題はまた別の話です)
 
逆に、上記のいずれのケースにも該当しない文字列が
それらの関数に渡されるとデータ型変換エラーが発生します。
 
IsNumeric 関数の主な用途は、上記の関数に値を渡す前に
「数値データと評価できるか(数値データへの変換が可能か)」
を判別し、データ型変換エラーを回避することです。

回答
投稿日時: 17/02/03 18:09:52
投稿者: sk

補足:

引用:
数字を入力しようが、それ以外の文字を入力しようが、
InputBox 関数の戻り値のデータ型が String 型である
ということに変わりはありません。

ちなみに、InputBox 関数を呼び出された際、
[OK]ボタンではなく[キャンセル]ボタンが選択された場合は、
InputBox 関数の戻り値は Empty 値となります。
 
----------------------------------------------------------
'インプットボックスの表示
Test = InputBox("文字でも数字でも入力してください。")
 
'[キャンセル]が選択された場合
If IsEmpty(Test) = True Then
    MsgBox "入力がキャンセルされました。"
'[OK]が選択された場合
Else
    '変数 Test の値が「数値データとして評価できる」場合
    If IsNumeric(Test) = True Then
        '変数 Test に格納されている値とデータ型の名前を
        'メッセージボックスに表示
        MsgBox "変数 Test の値は " & Test & vbCrLf & _
               "データ型は " & TypeName(Test) & " です。"
        '変数 Test に格納されている値を
        'Integer 型のデータに型変換
        Test = CInt(Test)
        '変数 Test に格納されている値とデータ型の名前を
        'メッセージボックスに表示
        MsgBox "変数 Test の値は " & Test & vbCrLf & _
               "データ型は " & TypeName(Test) & " です。"
    '変数 Test の値が「数値データとして評価できない」場合
    Else
        MsgBox "入力されたのは数値データに変換できない文字列です。"
    End If
End If
----------------------------------------------------------

回答
投稿日時: 17/02/04 10:17:04
投稿者: MMYS

文字列 と 文字列 を混同してませんか。
 
文字列を扱うには 文字列変数が必要です。
数値を扱うには  数値変数が必要です。
 
VBSではその都度、変数の型は変化します。
 

Dim Test
Test = "123" [color=green]'これは文字列[/color]

[color=green]'変数Test は現在 文字列型(String)であることを確認[/color]
MsgBox TypeName(Test)

[color=green]'変数Tesを Long型(数値型) に変換[/color]
Test = CLng(Test)

[color=green]'変数Test は現在 Long型であることを確認[/color]
MsgBox TypeName(Test)

回答
投稿日時: 17/02/04 10:35:21
投稿者: MMYS

sk さんの引用:
IsNumeric 関数の主な用途は、上記の関数に値を渡す前に
「数値データと評価できるか(数値データへの変換が可能か)」
を判別し、データ型変換エラーを回避することです。

CLng関数など数値変換関数でそのまま文字列を渡すとエラーが発生します。
IsNumeric関数はそのエラーを回避する目的で使用します。
 
MsgBox CLng("1234")	'成功 
MsgBox CLng("123a")	'エラーになる
MsgBox CLng("a123")	'エラーになる
MsgBox CLng("-123")	'成功 

 

投稿日時: 17/02/05 08:23:11
投稿者: hisayanxp

skさん、mmysさんへ
Isnumeric関数が数値かどうかの判別できない場合は、エラーになるという理解がたりませんでした。
また格闘してみます。お二方の丁寧なご説明ありがとうございました。