VBAの実行時エラー ‘9’:インデックスが有効範囲にありません。
これ、本当に見る機会が多い発生頻度の高いエラーだと思います!
さて、このエラーが発生する原因は何でしょうか? どうすればよいのでしょうか?
【この記事でわかることは】
・「インデックスが有効範囲にありません。」の発生原因
・実行時エラー ‘9’ が発生した場合の対処方法
はじめに
実行時エラーとは、VBA(マクロ)のコードは正しくても、実際には実行できない処理が発生している場合に表示されるエラーです。
実行時エラーが検出されると上の画像のようなメッセージが表示されます。
エラー番号 ‘9’ が「インデックスが有効範囲にありません。」というエラーです。
発生原因は
「インデックス」とは何かを理解しておきましょう。「インデックス(index)」をネットで調べると、一般的には「索引とか見出し」などですが、VBA(プログラミング)では、配列の添字(配列要素の番号)やコレクションのようにオブジェクトや変数を特定するための番号や名前です。
「インデックスが有効範囲にありません。」ということは、この配列やコレクションに存在していないインデックス番号や名前が指定されているということです。
※コレクションオブジェクトは、独自のコレクションを作成できる機能です。一番分身近なコレクションの例としては「WorkSheetsコレクション」があります。
エラー再現例
WorkSheetsコレクションの例
シート間でセルの内容を転記するだけのコードです。
Sub Sample01()
Worksheets(1).Range("a1") = Worksheets(2).Range("a1")
End Sub
シートが2つ以上ない場合(1つだけの場合)Worksheets(2)が無いので「実行時エラー ‘9’:インデックスが有効範囲にありません。」が発生します。
Workbooksコレクションの例
次の例は、先ほどのシートと同じブックの例です。2つ目のブックをアクティブにするコードです。
Sub Sample02()
Workbooks(2).Activate
End Sub
ブックが1つだけしか開いていない場合、Workbooks(2)が無いので「実行時エラー ‘9’:インデックスが有効範囲にありません。」が発生します。
Workbooksコレクションの既定プロパティにはブック名を指定できますが、指定した名前のブックが開いていない場合も同様のエラーになります。
配列の例
この例では「1,2,3,4,5」という1次元配列をA列のセルに書き込むコードです。
Sub Sample03()
Dim arr As Variant
Dim i As Long
arr = Array(1, 2, 3, 4, 5)
For i = 1 To 5
Cells(i, 1) = arr(i)
Next i
End Sub
A列のセルに1行目から順に書き込もうとしています。 ⇒ Cells(i, 1) = arr(i)
5行目に書き込もうとした際に配列のインデックス(5)が無いのでエラーが発生します。
配列のインデックスは、指定がない場合は「0」から始まることを考慮していないためエラーとなってしまうよくある例です。
発生時の対処方法例
エラーの基本的な対処法は、エラー箇所の特定とその原因となったコードをデバッグします。
・6行目のセルに配列の要素を書き込む部分で該当する配列要素のインデックスが無いのでインデックスエラーが発生!
・メッセージ内の[デバッグ]ボタンをクリックすると、VBEが表示され中断されているステートメントの問題部分が黄色く表示されて編集できる状態になっています。
・このエラーの原因は、配列のインデックスは「0」から始まるのに「1」からスタートしているループカウンターの変数をそのまま使っていたために発生しています。
・arr(i) を arr(i – 1) に修正すれば処理が進みます。
・ただし、エラー発生前すでにセルに書き込んでしまったデータは配列の違う要素「2,3,4,5,5」を書き込んでいるので注意してください! 再実行して正しいデータ「1,2,3,4,5」を書き込みましょう。
・エラーダイアログで [デバッグ] ボタンでなく[終了]ボタンをクリックした場合は、VBEは表示されずに処理は強制終了します。原因を探るには [デバッグ] ボタンをクリックして、どこで処理が中断したのかをしっかり確認して対処しましょう。
まとめ(おわりに)
今回の記事はいかがでしたか? お役に立てたなら幸いです(^^;
突然エラーメッセージが表示されたら、VBAを知らないユーザーの場合はびっくりして、どうしたらよいのかわからないと思います。経験者でも自分で作成したものならともかく、そうでない場合は面倒に巻き込まれた感は否めないですよね。
そうならないように、じゅうぶんにテストを重ねエラー対策をしっかり行うようにしたいですね。想定できるエラーに対して、エラー処理を設置する方法については改めて解説するようにしたいと思います。
エラー処理関連の記事
この記事と関連しているExcel VBAのエラー処理についての記事も是非ご覧ください。
★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★
過去記事のサンプルファイルをダウンロードできます
この記事で使用したサンプルの登録はありません。
過去の記事で使用したサンプルファイルをダウンロードできるようにページを設置していますので、こちら(このリンク先)からご利用ください