こんばんは、今回の記事はExcel VBA マクロのユーザーフォーム(UserForm)でフォームを呼び出すと実行時エラーになった時どうしたかという記事になります。
VBAマクロで、ユーザフォームを表示させるマクロを記載していました。
デバッグするとここの部分で以下のエラーが出ました。
これだけでは、どこに問題があるのか分からず、結構検索したりいろいろ試したりとしました。どういう所を確認して行けばいいか?私のマクロの場合、どういう所が問題だったか?をまとめていきます。
もちろん、すべてのケースに当てはまるとは思いませんが、エラー解決の足掛かりになれば幸いです。それでは、いってみましょう!
「インデックスが有効範囲にありません」とは?
エラーメッセージにあったインデックスが有効範囲にありませんというエラーがどういう時に表示されるのかについてです。
これは、存在しないもの(存在しない名前や配列の添え字番号など)を参照しようとしたときに出るエラーのようです。
UserForm.Showで出た場合、どこを確認するのか
「Show」のところでマクロがとまってしまうという事は、ユーザフォームを表示させようとしたとき、参照できない”何か”があったと考えられました。
ユーザーフォーム側のコードに問題があるのかな?と思い、ユーザフォーム側のコードを確認することにしました。Microsoft Visual Basic for Application画面のリストにある、「UserForm1」などのShowできないフォームを右クリックして、「コードの表示」でコードが確認できます。
ユーザフォーム表示前にエラーとなっているはずとのことで、「UserForm_Initialize()」という初期化イベントの処理を見直しました。
見直した結果存在しないブックを参照していた
私のマクロの場合になりますが(マクロによって原因は異なると思います)、今回はブック名の指定で存在しないブックを取得しようとしていました。
UserForm_Initialize()の中のマクロでファイル名指定でWorkbookオブジェクトを取得する部分がありました。
Set wb = Workbooks("Book1.xlsx")
ただ、Book1.xlsxのファイル名をBook1_ver1.xlsxと変更したことで、今まで動いていたマクロが、名前変更きっかけで存在しないブック参照しているよ!というエラーとなっていたようです。
解決策としては、その時扱っているWorkbookの名前を都度取得するように(ファイル名を変更しても耐えうるように)変更しました。
Set wb = Workbooks(ThisWorkbook.Name)
これで私の場合は解決しました。UserFormを表示(Show)する時に関連するマクロ、今回のように初期化の処理などに不備がないかいま一度確認すると解決に近づくのかな、と思いました。
さいごに
いかがだったでしょうか。完全に原因が一致することはあまりないかもしれませんが、解決の足掛かりになれば幸いです。それでは、また!