アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセル2010です。
InputBoxについて教えてください。 
負数以外の数値を受け取りたいのです。
以下のようにやってみました。

Sub test001()
Dim ans As Double
ans = Application.InputBox("数値を入力", Type:=1)
If ans = False Then
MsgBox "キャンセル"
Exit Sub
ElseIf ans < 0 Then
MsgBox "負数は不可。"
Call test
Else
MsgBox ans & "を受け取りました。"
End If
End Sub

一応、これで動くのですが、問題は数値0を入力された場合です。
0はFalseと認識されるようで、キャンセルとなってしまいます。0は0という数値で受け取りたいのです。

試行錯誤の結果、Type:=1をやめ、変数ansをVariantにして
If ans = “False” Then と、Falseをダブルクォーテーションでくくると、0を数値としてくれるようです。でも理屈がわかりません。変数ansにキャンセルボタンで帰ってくるのはBooleanのFalseであり、Stringの”False”ではないと思うのですが。

Sub test002()
Dim ans
ans = Application.InputBox("数値を入力")
If ans = "False" Then
MsgBox "キャンセル" & TypeName(ans)
Exit Sub
ElseIf ans = "" Then
MsgBox "未入力" & TypeName(ans)
Call test002
ElseIf Not IsNumeric(ans) Then
MsgBox "数値ではありません。" & TypeName(ans)
Call test002
ElseIf ans < 0 Then
MsgBox "負数は不可。" & TypeName(ans)
Call test002
Else
MsgBox ans & "を受け取りました。" & TypeName(ans)
End If
End Sub

あと、もうひとつ質問は、数値以外の入力があった場合、再度入力させるためいちいちCall test002 を入れてますが、このやり方でただしいのでしょうか?

A 回答 (2件)

こんばんは。


たぶん、もうお気づきかとは思いますが、一応念のため。
このコードの正式な書き方は分かりません。ただ、プログラムの歴史の中で、こういうスタイルで構造化プログラムができるようになって、環境が激変したというそうです。


'//
Sub Test003r()
 Dim ans As Variant
 Dim msg As String
 Do
  ans = Application.InputBox("数値を入力" & vbCr & msg)
  If VarType(ans) = vbBoolean Then '←あくまでも、InputBox の次に置きます。
   MsgBox "キャンセル"
   Exit Sub
  End If
  If IsNumeric(ans) And Val(ans) >= 0 Then Exit Do
  msg = "正しい数値(>=0)を入れてください。"
 Loop
 If ans <> "" Then
  MsgBox ans
 End If
End Sub
'//
    • good
    • 0
この回答へのお礼

そうか!分かりました。
ここでもキャンセルのFalseが0と認識されて
Val(ans) >= 0 Then Exit Doではじかれたんですね。
WindFaller さん、何度もありがとうございます。

お礼日時:2014/12/02 21:34

こんにちは。



>数値以外の入力があった場合、再度入力させるためいちいちCall test002
それぞれの人のテクニックだけれども、InputBox 側で、データ型を指定するのはやめて、以下のようにしたらどうかと思います。以下は正しいのかは知りませんが、こんな感じだったような記憶があります。

'//
Sub Test003()
 Dim ans As Variant
 Dim msg As String
 Do
  ans = Application.InputBox("数値を入力" & vbCr & msg)
  If IsNumeric(ans) And Val(ans) > 0 Then Exit Do
  msg = "正しい数値(>0)を入れてください。"
  If VarType(ans) = vbBoolean Then Exit Sub
 Loop
 If ans <> "" Then
  MsgBox ans
 End If
End Sub

'//

>再度入力させるためいちいちCall test002 を入れてますが、このやり方でただしいのでしょうか?
これは、何かの本で読んだかプログラミングの講座で聞いた覚えがあります。
そういうやり方は、古いやり方で、現代のプログラミングでは向かないそうです。
    • good
    • 0
この回答へのお礼

さっそくありがとうございました。
なるほど、Loopさせるわけですね。
ところで、キャンセル時にメッセージをだそうと、以下のようにやってみたのですが、MsgBox "キャンセル"が出てくてません。どうしてでしょう?


Sub Test003()
Dim ans As Variant
Dim msg As String
Do
ans = Application.InputBox("数値を入力" & vbCr & msg)
If IsNumeric(ans) And Val(ans) >= 0 Then Exit Do
If VarType(ans) = vbBoolean Then
MsgBox "キャンセル"
Exit Sub
End If
msg = "正しい数値(>=0)を入れてください。"
Loop
If ans <> "" Then
MsgBox ans
End If
End Sub

お礼日時:2014/12/02 18:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!