• ベストアンサー

エクセルのマクロ selectcase について(訂正分です)

Sub macro() x = Application.InputBox("数値を入力! 1=東京、2=大阪", Type:=1)  Select Case x   Case 1   「指定フォルダにあるブック」を開きます、   そのブック内の「東京」シートを開き   その決まった部分を選択   Case 2    「指定フォルダにあるブック」を開きます、   そのブック内の「大阪」シートを開き   その決まった部分を選択  End select 選択した部分をmacroがあるブックのシートに コピー・ペーストした後で 「指定したフォルダ内にあるブック」をクローズ End sub  このようなマクロを組んでいます インプットボックスで 1または2を入れると それに応じた作業をしてくれますが それ以外の数字を入力すると エラーが起きます (「指定フォルダにあるブック」内には 「東京、「大阪」以外のシートが存在しないので) これを避けるため「1」「2」以外の数字を入力した場合に 再度インプットボックスに戻って入力を促すように 組みたいのですが どうしたらよろしいでしょう? (開くブックはインプットボックスの共通です  実際は入力できる数字はもっとたくさんあり  それに対応しているシートもたくさんあります  わかりにくい書き方でしたら 補足要求くだされば  補足をさせていただきます よろしくおねがいします。)

質問者が選んだベストアンサー

  • ベストアンサー
  • moooon
  • ベストアンサー率26% (26/98)
回答No.3

これでどうでしょう? 1か2しか受け付けません。 キャンセルもさせません。 Sub test() Dim x As Variant Do x = Application.InputBox("数字を入力! 1=東京、大阪", Type:=2) If Not (x = 1 Or x = 2) Then MsgBox "数字の1~2を入れてください。", vbExclamation, "だめ!" Loop Until x = 1 Or x = 2 End Sub

ennkai
質問者

お礼

インプットボックスで キャンセルボタンや×ボタンの値を返させておいて その値によって処理すれば こういうことも可能なのですね 発想がそこまでいってなかったので 参考になりました! 感謝です

ennkai
質問者

補足

お礼欄に一部変な内容を書いてしまいました 失礼いたしました

その他の回答 (5)

  • ta123
  • ベストアンサー率51% (95/186)
回答No.6

No.4回答補足 > 「Else節の中でGoto文」 > これについても勉強していきたいとおもいます 下手な文章で誤解を与えてしまいました。 Else節とは無関係でGoto文そのものがあまり使いたくない命令と言うことです。特に前の命令に戻るようなGoto文は使用を避けるべきということです。 私がプログラマーをしていた頃、構造化プログラミングをならっていた影響でしょう。現在どのように言われているのかは知りませんがGoto文が多用されているプログラムを見ると、追っかけにくいです。 調子に乗って変な一文を書いてしまったと反省しております。

ennkai
質問者

お礼

回答ありがとうございます エクセルでのマクロしか (しかも独学で)経験がないのですが 非常に参考になりました 組む上での 常識というか 考え方まで 考えたことがなかったもので・・・ またなにかありましたら よろしくおねがいいたします

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

'選択部分をループで囲んで、1,2の時だけループをexitする Sub macro() Dim x Do While True '選択部分 x = Application.InputBox("数値を入力! 1=東京、2=大阪", Type:=1) Select Case x Case 1 '1の処理 Exit Do Case 2 '2の処理 Exit Do End Select Loop '本処理 End Sub

ennkai
質問者

お礼

回答ありがとうございます 本処理とは別にEXITを記述する 方法があるのですね 参考になりました ありがとうございます

  • ta123
  • ベストアンサー率51% (95/186)
回答No.4

スマートな対策が提案済みのようですので、別の観点から。 入力値のチェックについては、利用者は想定外のことをしてきますので頭が痛いですね。 コーディングマナーとして、Select Case文には必ずElse節を記述して暴走を防ぐようにしておくのがいいと思います。 Else節の中でGoto文を使ってInputBox処理に戻してもいいのですが、フローが汚くなるのでエラーメッセージを出して終了させるのがいいのではなかと思います。

ennkai
質問者

お礼

「利用者は想定外のことをしてきますので」 この一文 非常に実感を伴ってきます。 マクロに限らずプログラムは すべての事象を考えて しなければなりませんね。 「Else節の中でGoto文」 これについても勉強していきたいとおもいます

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんな感じかな? >蛇足ですが、意地悪く不の数や 1.5などを入力した場合にも >対応は可能でしょうか? 通常は、Cancel をクリックした時や空打ちした時の対応が必要ですね。   Dim x As Variant  Do   x = Application.InputBox("数字を入力! 1=東京、2=大阪", Type:=2)   If VarType(x) = vbBoolean Then Exit Sub   If Not (x > 0 And x < 3) Then MsgBox "数字の1~2を入れてください。", vbInformation  Loop Until x > 0 And x < 3 '1.5 などを入力した場合は、端数を落とすという方法がよいのではないでしょうか?  x = Int(x)

ennkai
質問者

お礼

回答ありがとうございます 組んでいながら 「Cancel をクリックした時や空打ちした時の対応」 まで考えが及んでいませんでした お恥ずかしい限りです 値に関しては Loop Until 構文が 基本になりそうですね ありがとうございます!

  • ta123
  • ベストアンサー率51% (95/186)
回答No.1

こんなのはどうでしょうか。 Do x = Application.InputBox("数値を入力! 1=東京、2=大阪", Type:=1) Loop Until (x <= 2)

ennkai
質問者

お礼

早速御回答ありがとございました! 無事に解決いたしました 感謝です!! 蛇足ですが、意地悪く不の数や 1.5などを入力した場合にも 対応は可能でしょうか? 本当にたすかりました

関連するQ&A