Excel VBA の実行時エラー辞典
実行時エラー '9':インデックスが有効範囲にありません
シート名・ブック名の違い、配列の範囲外、未確保の配列を確認します。
よくある原因
- Worksheets に指定した名前が実際のシート名と違います。
- 別のブックを対象にしている、または指定したブックをまだ開いていません。
- 配列の下限・上限を超えて参照しています。
- 動的配列を ReDim する前に読み書きしています。
直し方
- シートの場合は対象ブックとタブの名前を確認し、ThisWorkbook などで対象を明記します。
- 配列の場合は Dim・ReDim の位置と、要素が確保されているか確認します。
- 確保済みの配列は LBound と UBound で範囲を調べ、その範囲で繰り返します。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
この配列の下限は 1 なので、0 番目の要素はありません。未確保の動的配列では LBound・UBound 自体も失敗します。
修正前
Dim names(1 To 2) As String, i As Long
For i = 0 To 2
Debug.Print names(i)
Next i
修正後
Dim names(1 To 2) As String, i As Long
names(1) = "入力": names(2) = "集計"
For i = LBound(names) To UBound(names)
Debug.Print names(i)
Next i
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- シート参照ならブック名とシート名、配列参照なら添字 i と上下限を比較します。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? i, LBound(names), UBound(names)
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。
関連エラー
- 実行時エラー '5':プロシージャ呼び出しが正しくありません
- 実行時エラー '91':オブジェクト変数または With ブロック変数が設定されていません
- 実行時エラー '1004':アプリケーション定義またはオブジェクト定義のエラーです