前置き
本件は未解決です。自己解決したら追記しますが、コメントなどでアドバイス頂けると助かります。
→(9/23追記)**解決しました。**皆様ありがとうございました。
最近は会社の通信教育でVBAの勉強をしているのだが、
今日かなりのハマりポイントが発生してメチャクチャ時間を取られてしまった。
まあそのまま解決したということにしてもよいが、Qiitaにでアウトプットして
何か有効活用した風にしないと気が収まらないので報告する。
(※筆者はQiita記事作成は初めてなので、記事作成の全体的な拙さについてはご容赦願いたい)
というかQiitaも色々記法があり面倒ですな…記事書いて練習しないと…
目次
- 課題の概要
- 発生したハマりポイント
- 「InputBoxに入力した文言と一致する名称のシートをアクティブにする」をSelectCase文で記述する
- SelectCase文でのエラー回避処理がうまく発生しない
本文
1. 課題の概要
課題の内容は以下の通りだ。
・作成するプログラムは簡単なシート検索機能
・InputBoxメソッドで文字列を入力させ、その文字列と一致する名を持つシートをアクティブにする
・キャンセルボタン押下、空欄入力のパターンについて、SelectCase文で条件分岐しメッセージボックスを表示するようにする
・上記以外の場合(つまり入力文字列と一致する名を持つシートが存在しない)用のエラー回避処理(メッセージボックス表示)を入れる
まあ別に難しくない。多分。
→(9/23追記)ForEach文でのシンプルな記法をコメントで頂きました。ありがとうございました!
https://qiita.com/idohori/items/8510e33eff8f6a7a30f7#comment-e322f1351256f35caf18
(しかしなぜ課題の指定はSelectCase文だったんでしょうかね?)
2. 発生したハマりポイント
2.1. 「InputBoxに入力した文言と一致する名称のシートをアクティブにする」をSelectCase文で記述する
最初に引っかかったのがこれだ。
SelectCase文での記述が指定されているので、InputBoxで入力された内容を文字列型変数に格納し、
変数のCase別に処理内容を記述し、と思ったのだが。
・キャンセルボタン押下、空欄入力のパターンについて、SelectCase文でメッセージボックスを表示するようにする
については別に迷うことがなく
Case "False"
MsgBox "キャンセルしました。"
Case ""
MsgBox "データが入力されていません。"
問題は、
・InputBoxメソッドで文字列を入力させ、その文字列と一致する名を持つシートをアクティブにする
で、この場合のCaseは何を記述するのか?
今現在はCase "hoge1", "hoge2", "hoge3",...
みたいな感じで記述しているが、
これが何十件となった場合どう記述すればよいのだろう。
Valueとか試したのだけどうまく行かなかった。
知見を募集しています。
→(9/23追記)上述したとおりやはり「For Each
文の方が現実的かつ柔軟な記法になる」ということになりました。
2.2. SelectCase文でのエラー回避処理がうまく発生しない
・上記以外の場合(つまり入力文字列と一致する名を持つシートが存在しない)用のエラー回避処理(メッセージボックス表示)を入れる
の対応について。
現在のコードは全体的に以下の通り。
Option Explicit
Sub test()
Dim hogehoge As String
hogehoge = Application.InputBox("表示するシート名を入力してください", "シートの表示")
Select Case hogehoge
Case "False"
MsgBox "キャンセルしました。"
Case ""
MsgBox "データが入力されていません。"
Case "hoge1", "hoge2", "hoge3", "hoge4", "hoge5", "hoge6", "hoge7"
Worksheets(hogehoge).Select
End Select
On Error GoTo エラーメッセージ
Exit Sub
エラーメッセージ:
MsgBox "該当のシートは存在しません。"
End Sub
ということで、Case else
を使用していないので、
hoge*に該当しない文字列を入力した場合はエラーが発生し、
エラー回避処理のメッセージボックス表示に飛ぶと思ったのだが、
入力しても一切の反応がない。
これは恐らく今のSelectCase文の書き方ではエラーが発生していないため、
エラー回避処理に飛ばないという結果になってしまっていると予想している。
(On Error GoTo エラーメッセージ
の挿入箇所をいろいろ変更したけどうまく行かなかった。)
という訳で、こちらについても知見を募集中です。
(というかこちらの対応ができないと課題が完成しないのでこちらのほうが優先度高)
→(9/23追記)
識者の皆様からコメントを頂き、
「Caseで全てのパターンを網羅していない場合、記述していないパターンが来た場合は処理をスルーする」
「むしろCase Else
をつけないとエラーが発生しない」
などの事がわかりました。
最終的には以下のコードになりました。
Option Explicit
Sub test()
Dim hogehoge As String
hogehoge = Application.InputBox("表示するシート名を入力してください", "シートの表示")
Select Case hogehoge
Case "False"
MsgBox "キャンセルしました。"
Case ""
MsgBox "データが入力されていません。"
Case "hoge1", "hoge2", "hoge3", "hoge4", "hoge5", "hoge6", "hoge7"
Worksheets(hogehoge).Select
Case Else
On Error GoTo エラーメッセージ
Worksheets(hogehoge).Select
End Select
Exit Sub
エラーメッセージ:
MsgBox "該当のシートは存在しません。"
End Sub
On Error GoTo エラーメッセージ
の位置が不適切だったかについてはまだ確認してません。
あと、2つWorksheets(hogehoge).Select
を書かなければいけないのに違和感があります。
もうちょい修正点はありそうですね。
ともかく皆様ありがとうございました。
あとがき(というか雑記)
Progate→ドットインストールという流れでちょこっとプログラミング触ったあとだと、
Visual Basicも「ちょっと記法が独特だなー」という程度で、習得が速い気がする。
Excelの様々なプロパティと連携しているから定着率も良さそう。
あとQiitaをYahoo!知恵袋みたいに使ってすみませんでした
→(9/23追記)即日で3件もコメントを頂けるとは思っていませんでした。
ちゃんと課題も解決し、課題に関する違和感も指摘して頂き、さらにもっと効率的な書き方まで教えて頂けるとは…
優しい世界…