ExcelでマクロやVBAを実行した際に「インデックスが有効範囲にありません」と表示されると、どのセルやシートを直せばよいのか分からず作業が止まりがちです。
このエラーは、VBAが指定したワークシート、ブック、配列、コレクションなどを見つけられない場合に起こります。
特に多いのは、シート名の変更、対象ブックの開き忘れ、配列の番号指定ミス、コピーしたマクロ内に残った古い名前です。
「インデックスが有効範囲にありません」は、指定先が存在しないことを知らせるVBA実行時エラーです。
まずはエラー行を確認し、シート名、ブック名、番号、配列の範囲を順番に照合しましょう。
この記事では、Excelで表示されるインデックスエラーの原因と、状況別に確認したい対処法を詳しく解説します。
エクセルのインデックスエラーを止める確認方法【エラー行の特定】
それではまず、エラーが発生したVBAの行を特定する方法について解説していきます。
| 項目 | 確認例 | エラーになりやすい状態 |
|---|---|---|
| 対象シート | 売上集計 | 売上集計表へ変更済み |
| 対象ブック | 集計.xlsm | ブックが閉じている |
| 配列番号 | 1から3 | 4を指定している |
デバッグ画面で停止した行の確認
VBA実行時エラーのダイアログが表示されたら、「終了」ではなく「デバッグ」を選択します。
Visual Basic Editorが開き、問題になった命令が黄色で表示されます。
黄色になった行は原因そのものとは限りませんが、VBAが存在しない対象を参照しようとした場所を示す重要な手掛かりです。

たとえば Worksheets(“売上”) が黄色なら、現在のブックに「売上」という名前のシートがあるかを確認します。
変数に入っている名前が違うこともあるため、固定文字列だけでなく、変数の中身も確認しましょう。
エラー画面で慌ててVBAを閉じず、まず黄色の行を控えることが解決への近道です。
VBEでプロジェクトと実行対象の確認
複数のExcelファイルを開いていると、意図しないブックのマクロを実行している場合があります。
Visual Basic Editorの左側にあるプロジェクトエクスプローラーで、マクロが入っているブック名を確認してください。

PERSONAL.XLSBやアドインに保存したマクロでは、ActiveWorkbook と ThisWorkbook の違いが特に重要です。
ActiveWorkbookは現在操作中のブックを指しますが、ThisWorkbookはコードが保存されているブックを指します。
想定と異なるブックが対象になると、そこにないシート名を指定してエラーになることがあります。
エラー前後の処理と変数の確認
エラー行だけを直しても、直前の処理で変数に誤った値が入っていれば再発します。
VBEのメニューから「表示」「ローカルウィンドウ」を開くと、停止時点の変数値を確認できます。
シート名を格納する変数が空欄になっていないか、配列の添字が想定外の値になっていないかを見ましょう。
データの最終行を取得する処理が空白列で失敗し、後続の番号計算がずれるケースもあります。
【操作のポイント】黄色の行、対象ブック名、変数の値を同時に確認すると、修正箇所を絞り込みやすくなります。
ワークシート名とブック名の照合【参照先の修正】
続いては、最も発生件数が多いワークシート名とブック名の不一致を確認していきます。
| VBAの指定 | 実際のタブ名 | 判定 |
|---|---|---|
| 売上 | 売上 | 一致 |
| 売上 | 売上集計 | 不一致 |
| 2026年売上 | 2026年 売上 | 空白文字に注意 |
シートタブの表示名とコードの文字列
次のようにシート名を文字列で指定している場合、Excelのシートタブに表示されている文字と完全に一致する必要があります。
Worksheets("売上集計").Range("A2").Value = "確認済み"
「売上集計」を「売上集計表」に変更した後でコードを修正していないと、インデックスエラーになります。
全角と半角の空白、似た記号、末尾の空白も別の文字として扱われます。

シート名をコピーしてVBAの文字列へ貼り付けると、見た目では分かりにくい入力ミスを減らせます。
シートタブを右クリックして名前を確認し、コード内の Worksheets の括弧内と一文字ずつ照合してください。
WorksheetsとSheetsの使い分け

Worksheetsは通常のワークシートだけを対象にします。
一方でSheetsは、グラフシートを含むすべてのシートを対象にします。
シート番号で参照する際に、グラフシートの追加や削除によって順番が変わると、Worksheets(3) のような指定は意図しないシートを指すことがあります。
また、存在するワークシート数より大きな番号を指定すれば、インデックスが有効範囲にありませんというエラーになります。
変更されやすいブックでは、番号よりも名前やコードネームによる参照が安全です。
開いているブックとフルネームの確認
別ブックを指定する場合は、ファイル名だけでなく拡張子も含めて一致させます。
Workbooks("月次集計.xlsm").Worksheets("入力").Range("B2").Value = "完了"
実際のファイル名が「月次集計.xlsx」なら、このコードは対象ブックを見つけられません。
ファイルを保存し直して拡張子が変わった場合や、同名ファイルが複数ある場合にも注意が必要です。
未保存ブックは Book1 のような仮の名前になっているため、保存前後で参照名が変化します。
【操作のポイント】シート名、ブック名、拡張子、空白の有無を実ファイルと照合してからコードを直しましょう。
配列とコレクションの番号範囲【添字の修正】
続いては、配列やコレクションで発生する番号指定の問題を確認していきます。
| 項目 | 有効な番号 | 無効な番号例 |
|---|---|---|
| Array関数の配列 | 0から2 | 3 |
| Worksheets | 1からシート数 | 0 |
| Cells | 1以上 | 0 |
| A | B | C | |
| 1 | 番号 | 値 | |
| 2 | 0 | 東京 | |
| 3 | 1 | 大阪 | |
| 4 | 2 | 名古屋 |
Array関数の開始番号
VBAのArray関数で作成した配列は、通常は0番から始まります。
Dim arr As Variant
arr = Array("東京", "大阪", "名古屋")
MsgBox arr(0)
上記では arr(0) が東京、arr(1) が大阪、arr(2) が名古屋です。
存在しない arr(3) を参照すると、インデックスが有効範囲にありません と表示されます。
配列の最後の番号を決め打ちせず、UBound関数で上限を取得する方法が実務では有効です。
配列の繰り返し処理では、For i = LBound(arr) To UBound(arr) と書くと、開始番号と終了番号の違いに対応できます。
For文の終了値とデータ件数
Excelの表を配列へ読み込む処理では、件数に応じてループ回数を計算します。
1行目をヘッダーとした場合、A列の2行目から最終行までを対象にする数式的な考え方は、対象件数が最終行から1を引いた値になります。
対象件数 = 最終行 - 1
データ行番号 = 2行目から最終行
たとえば最終行が10行目なら、データは2行目から10行目までの9件です。
最終行の取得結果が1で、データがない状態なのに配列の先頭要素を参照すると、想定外のエラーにつながることがあります。
空の表を処理する可能性があるマクロでは、ループ前に件数を判定することが大切です。
CollectionとDictionaryの存在確認
Collectionの Item 番号は1番から始まります。
Collectionが3件しかないのに Item(4) を取得すれば、同じインデックスエラーが起こります。
Dictionaryでは、存在しないキーを参照するより前に Exists メソッドで確認すると安全です。
If dict.Exists("商品コード") Then
MsgBox dict("商品コード")
End If
番号を使う処理では Count、配列では LBound と UBound、キーでは Exists を使う習慣が再発防止になります。
【操作のポイント】配列とCollectionは開始番号が異なるため、ループの最初と最後を固定値で書かないようにしましょう。
参照方法とオブジェクト変数の整理【VBAコードの見直し】
続いては、参照先を明確にするVBAコードの整理方法を確認していきます。
| 参照方法 | 特徴 |
|---|---|
| ActiveWorkbook | 操作中のブックに左右される |
| ThisWorkbook | コード保存先のブックを指す |
| 変数で保持 | 参照先を統一しやすい |
Option Explicitによる変数名の確認
モジュールの先頭にOption Explicitを記述すると、宣言していない変数名を使った際にコンパイルエラーで知らせてくれます。
sheetName と sheetname のような小さな入力差はVBAでは同じ扱いになりやすいものの、変数へ意図しない値を代入する処理は注意が必要です。
特に文字列変数にシート名を入れる場合は、代入されるタイミングと値を確認しましょう。
変数名、ブック名、シート名の役割を分けて記述すると、後からコードを修正する際にも参照ミスを見つけやすくなります。
オブジェクト変数への代入
対象シートを何度も書く場合は、Worksheet型の変数へ一度代入する方法があります。
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A2").Value = "処理開始"
このように書くと、どのシートを処理しているかが分かりやすくなります。
Setの右側でエラーになるなら、入力というシート名またはThisWorkbookの参照先を確認する場面です。
複数のブックを扱うマクロでは、Workbook型の変数も用意して参照を明示するとよいでしょう。
コードネームを使う場合の注意
VBEのプロパティウィンドウに表示されるコードネームは、シートタブの表示名とは別の名前です。
Sheet1.Range(“A2”) のようにコードネームで参照すれば、タブ名を変更してもコードは動作します。
ただし、別ブックへシートをコピーしたり、コードネームを変更したりすると参照関係が変わる可能性があります。
利用者が頻繁にタブ名を変更する帳票ではコードネームが便利ですが、保守担当者が理解できる命名にすることも重要です。
【操作のポイント】ActiveWorkbookへの依存を減らし、ThisWorkbookまたはオブジェクト変数で対象を明示しましょう。
データ更新後のエラー予防【運用時の確認】
続いては、ファイル更新や運用変更による再発を防ぐ方法を確認していきます。
| 変更内容 | 確認したい箇所 |
|---|---|
| シート名変更 | Worksheetsの指定文字列 |
| 列の追加 | 最終列、配列の列番号 |
| 別年度ファイルへ複製 | ブック名、保存先、外部参照 |
シート削除とテンプレート複製
月別シートや担当者別シートを削除した後、削除前の番号を前提とするマクロは動かなくなります。
たとえば Worksheets(12) を12月シートとして使う設計は、途中にシートを追加しただけでも崩れる可能性があります。
テンプレートを複製する際は、マクロが前提にしているシート構成を維持することが大切です。
不要なシートを削除する前には、VBEでそのシート名や番号が使われていないか検索しましょう。
入力データが空の場合の分岐
入力シートの1行目をヘッダーとして、2行目以降に明細を入力する帳票を考えます。
A列の最終行を取得して処理する場合、ヘッダーしかないと最終行は1になります。
この状態で2行目がある前提の処理を始めると、配列やRangeの指定が想定外になることがあります。
最終行が1以下なら処理を終了する、または「入力データがありません」と表示する分岐を用意すると安全です。
空欄、結合セル、数式だけが入ったセルも最終行の判定へ影響するため、実際の帳票でテストすることをおすすめします。
エラー処理とログの記録
想定外の状態でマクロが停止しても、利用者が原因を判断できるようにエラー処理を設ける方法があります。
ただし、On Error Resume Next を広範囲に書くと、本来直すべきインデックスエラーを見逃すおそれがあります。
エラーを無視するのではなく、対象シートや対象キーの存在を事前に確認する設計が基本です。
業務用のマクロでは、発生日時、処理対象、エラー番号を別シートへ残す運用も有効です。
【操作のポイント】シート構成の変更、空データ、年度更新を想定した分岐を用意すると、利用時の停止を減らせます。
まとめ エクセルでインデックスが有効範囲にありませんと表示される原因と対処法
Excelの「インデックスが有効範囲にありません」は、VBAが存在しないシート、ブック、配列要素、Collection項目などを参照した際に表示されるエラーです。
最初にデバッグを選択して黄色で表示された行を確認し、参照している対象を特定しましょう。
最も多い原因は、シートタブ名とWorksheetsで指定した文字列の不一致です。
ブック名や拡張子、全角半角の空白、コピー後に残った古いシート名も見直してください。
配列ではLBoundとUBound、CollectionではCount、DictionaryではExistsを利用すると、範囲外の指定を防ぎやすくなります。
また、ActiveWorkbookに依存せず、ThisWorkbookやオブジェクト変数を使って対象を明確にすると、複数ブックを開く運用でも安定します。
原因確認の順番は、エラー行の特定、シート名とブック名の照合、配列や番号の範囲確認、空データと運用変更の確認です。
修正後は、通常の入力データだけでなく、データが空の場合やシートを追加した場合にもマクロをテストしておきましょう。