- ベストアンサー
エクセルのマクロ 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」以外の数字を入力した場合に 再度インプットボックスに戻って入力を促すように 組みたいのですが どうしたらよろしいでしょう? (開くブックはインプットボックスの共通です 実際は入力できる数字はもっとたくさんあり それに対応しているシートもたくさんあります わかりにくい書き方でしたら 補足要求くだされば 補足をさせていただきます よろしくおねがいします。)
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
これでどうでしょう? 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
その他の回答 (5)
- ta123
- ベストアンサー率51% (95/186)
No.4回答補足 > 「Else節の中でGoto文」 > これについても勉強していきたいとおもいます 下手な文章で誤解を与えてしまいました。 Else節とは無関係でGoto文そのものがあまり使いたくない命令と言うことです。特に前の命令に戻るようなGoto文は使用を避けるべきということです。 私がプログラマーをしていた頃、構造化プログラミングをならっていた影響でしょう。現在どのように言われているのかは知りませんがGoto文が多用されているプログラムを見ると、追っかけにくいです。 調子に乗って変な一文を書いてしまったと反省しております。
お礼
回答ありがとうございます エクセルでのマクロしか (しかも独学で)経験がないのですが 非常に参考になりました 組む上での 常識というか 考え方まで 考えたことがなかったもので・・・ またなにかありましたら よろしくおねがいいたします
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
'選択部分をループで囲んで、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
お礼
回答ありがとうございます 本処理とは別にEXITを記述する 方法があるのですね 参考になりました ありがとうございます
- ta123
- ベストアンサー率51% (95/186)
スマートな対策が提案済みのようですので、別の観点から。 入力値のチェックについては、利用者は想定外のことをしてきますので頭が痛いですね。 コーディングマナーとして、Select Case文には必ずElse節を記述して暴走を防ぐようにしておくのがいいと思います。 Else節の中でGoto文を使ってInputBox処理に戻してもいいのですが、フローが汚くなるのでエラーメッセージを出して終了させるのがいいのではなかと思います。
お礼
「利用者は想定外のことをしてきますので」 この一文 非常に実感を伴ってきます。 マクロに限らずプログラムは すべての事象を考えて しなければなりませんね。 「Else節の中でGoto文」 これについても勉強していきたいとおもいます
- Wendy02
- ベストアンサー率57% (3570/6232)
こんな感じかな? >蛇足ですが、意地悪く不の数や 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)
お礼
回答ありがとうございます 組んでいながら 「Cancel をクリックした時や空打ちした時の対応」 まで考えが及んでいませんでした お恥ずかしい限りです 値に関しては Loop Until 構文が 基本になりそうですね ありがとうございます!
- ta123
- ベストアンサー率51% (95/186)
こんなのはどうでしょうか。 Do x = Application.InputBox("数値を入力! 1=東京、2=大阪", Type:=1) Loop Until (x <= 2)
お礼
早速御回答ありがとございました! 無事に解決いたしました 感謝です!! 蛇足ですが、意地悪く不の数や 1.5などを入力した場合にも 対応は可能でしょうか? 本当にたすかりました
お礼
インプットボックスで キャンセルボタンや×ボタンの値を返させておいて その値によって処理すれば こういうことも可能なのですね 発想がそこまでいってなかったので 参考になりました! 感謝です
補足
お礼欄に一部変な内容を書いてしまいました 失礼いたしました