推しミネラルウォーターはありますか?

エラー処理について教えてください。
以下の様なマクロで、インプットボックスに
数字以外を入力した場合のエラー処理ですが、
次のような手順で進めると
「型が一致しません」とエラー表示されてしまいます。
どこがいけないのでしょうか?
  【手順】
  ・マクロ実行
  ・インプットボックスへ数字以外の文字を入力
  ・「OK」クリック
  ・再びインプットボックス出現
  ・もう一度数字以外の文字を入力
  ・「OK」クリック←ここでエラー表示!

Sub TEST()
Dim Tuki As Integer
On Error GoTo INPT
INPT:
Tuki = InputBox("何月分ですか?" & vbCrLf & _
"数字を入力してください。", "集計月入力", 1)
If Tuki = 0 Or Tuki > 12 Then
MsgBox "1から12の数字を入力してください。"
GoTo INPT
End If
On Error GoTo 0
End Sub

A 回答 (4件)

こんにちは。



#2の回答者です。

>私の作ったコードと同じ症状になりました。
> 「型が一致しません」とエラー表示されてしまいます。

私の#2の最初のコードでも、そんなはずはないはずです。

もしかしたら、変数の宣言が、
Dim Tuki As Integer

となっているのではないでしょうか。ここがInteger ではダメなのです。

InputBox 関数の戻り値は、見かけ上、文字列で返ります。数値を入れれば、数値で返ります。ただし、Tuki の型が、Integer にしていますと、受けられないので、そこで、「型が違う」といって、エラーが発生します。文字も数値も一旦は、なんでも引き受けて、その後で、振り分けないとできません。

また、Cancel 値も、ここでは、0の扱いになって振り分けられません。正確には、数値の0ではありません。(それを振り分ける特殊な古い関数はありますが、今では使いません。)

それで、InputBox メソッド(Application.InputBox)を使うことが多くなりました。こちらの場合は、戻り値は、Type 1(数字), 2(文字)などがありますが、これも、思ったようには行かない部分があります。Type:=1 として、試してみると、別のメッセージが出てきます。

「 数値が正しくありません。」と出てきます。

InputBox 関数の中で自動的に振り分けます。私は、それがうっとうしいので、Type:=2 にして、文字で受けるようにしています。これは、なかなか、難しいです。パターンを覚えて、それに当てはめるようにして使うのがよいです。
    • good
    • 0
この回答へのお礼

はい。Integerのままでした<(_ _)>
的確なご返答にため息が出そうな程でした。
ありがとうございました!!
InputBox がこれ程厄介だとは思ってませんでした。
ご返答の最後の部分にある通り、経験を増やして
自分の使いやすいやり方を覚えた方がいいのですね。
早くWendy02さんの様にサクサク作れるようになりたいです。

お礼日時:2009/03/31 11:50

こういう形のOn Error GoTo の使い方は余り感心しませんが、なるべく元のソースを変えずにエラーが起こらないようにするのでしたら、InputBoxメッソドを使うという手もありますね。



↓こんな感じで数値だけが戻るようにします。
Tuki = Application.InputBox("何月分ですか?" & vbCrLf & "数字を入力してください。", "集計月入力", 1, Type:=1)
    • good
    • 0
この回答へのお礼

回答ありがとうございました!
これからはInputBoxメッソドを使うことにします。
勉強不足が身にしみますね・・。

お礼日時:2009/03/31 09:24

こんにちは。



箇条書きで書くと、
1. On Error GoTo トラップだけでは、そのエラーは捕まえられません。
2. INPT:のラベルの位置が違っています。
3. InputBox 関数と、InputBox メソッドとの使い方には違いがあり、メソッドのほうが便利です。

むやみに On Error トラップを使っても意味がありません。
元のコードでは、どうしても、上手く行かないはずです。
'------------------------------------

Sub TEST_R()
  Dim Tuki As Variant
  On Error GoTo INPT
START:
  Tuki = InputBox("何月分ですか?" & vbCrLf & _
  "数字を入力してください。", "集計月入力", 1)
  Tuki = Val(Tuki)
  If Tuki = 0 Or Tuki > 12 Then
    MsgBox "1から12の数字を入力してください。"
    GoTo START
  End If
  MsgBox Tuki & "月"
  Exit Sub
INPT:
 Tuki = 0
 GoTo START
End Sub

'---------------------------------
'サンプルコード

Sub Sample()
  Dim Tuki As Variant
  Do
    Tuki = Application.InputBox("何月分ですか?:1~12" & vbCrLf & _
    "数字を入力してください。", "集計月入力", 1, Type:=2)
    If VarType(Tuki) = vbBoolean Or Tuki = "" Then Exit Sub
    If IsNumeric(Tuki) And (Tuki > 0 And Tuki < 13) Then
      Exit Do
    Else
      MsgBox "Error: " & Tuki & vbCrLf & "1から12の数字を入力してください。"
    End If
  
  Loop
  MsgBox Tuki & "月が入力されました。", vbInformation
End Sub

この回答への補足

お礼を投稿した後、頂いたコードを実行してみました。
ループの方はバッチリでした☆
ただ、上のエラー処理のコードを実行したところ、
私の作ったコードと同じ症状になりました。
何故でしょうか??
よろしければ教えてください!

補足日時:2009/03/31 09:30
    • good
    • 0
この回答へのお礼

回答ありがとうございました!
サンプルコードまで <(_ _)>
やはりエラー処理は下に持ってこないとダメなんですね。
「こうすれば簡単じゃん♪」って思ってたら上手くいきませんでした;
下のコードの方が素直そうですね♪
参考にさせていただきます。助かりました!

お礼日時:2009/03/31 09:21

エラー処理の中でエラーを起こしているからでは?

    • good
    • 0
この回答へのお礼

回答ありがとうございました!
エラー処理の中でエラーを起こすとこうなるんですね。
何故でしょう??単純に考えると何度でも繰り返して
くれそうな気がするんですが・・。

お礼日時:2009/03/31 09:11

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