VBAで「インデックスが有効範囲にありません」エラーが出る原因と対策

この記事はアフィリエイト広告を利用しています。
VBAで「インデックスが有効範囲にありません」エラーが出る原因と対策

ようこそ♪ささぽんのExcel教室へ。

今回は VBAにおける「インデックスが有効範囲にありません」エラーの原因と対策 をお届けします!

マクロを実行中に突然現れるこのエラーメッセージ。正直、「どういう意味?」ってなりますよね。
とくに、配列やリスト、シート名などを扱っているときによく出るエラーのひとつです。

この記事では、「インデックスが有効範囲にありません」の基本的な意味と、ありがちな原因、そしてエラーを防ぐコツまで、丁寧に解説していきます!

ささぽん

この記事は以下のような方におすすめです!
・VBAで突然「インデックスが有効範囲にありません」と出て困った方
・配列やコレクションでエラーになる方

・デバッグしても原因がよくわからず、対処法を知りたい方

このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。

読み終わるころにはきっと、
Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。

一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!

目次

1.エラー「インデックスが有効範囲にありません」とは?

◼︎エラーメッセージの意味と発生するタイミング

◼︎「インデックス」とは何か

2.よくあるエラー原因ベスト3とその理由

◼︎配列のインデックス指定ミスとエラーの流れ

◼︎シート・セル参照での存在チェック漏れ

◼︎リストやフォームコントロールでの空選択の落とし穴

3.デバッグのポイントとチェック方法

◼︎エラーが出たときにまず確認すべきこと

◼︎ステップ実行でエラー箇所を見つける

◼︎ローカルウィンドウやウォッチ式の活用

1.エラー「インデックスが有効範囲にありません」とは?

◼︎エラーメッセージの意味と発生するタイミング

「インデックスが有効範囲にありません」というエラーメッセージは、VBA(Visual Basic for Applications)を使っているときに、配列やリストなどで存在しない位置を指定した場合に表示されます。

たとえば、「配列の3番目の値を取り出したい」と思って “MyArray(2)” と書いたとしても、その配列に2番目までの要素しか存在しなければ、このエラーになります。

このエラーは主に以下のようなタイミングで発生します。

•配列の範囲外を指定したとき

•リストボックスやComboBoxで選択されていない項目にアクセスしたとき

•ワークシートやセルのコレクションで、存在しないシート名や行番号を指定したとき

見た目には「おかしくない」と思っても、内部的には存在しない位置を参照していることが原因です。

◼︎「インデックス」とは何か

「インデックス」とは、配列やリスト、セルなどで、特定の要素の位置を指定するための番号のことです。

たとえば、次のようなコードがあります。


Dim fruits(2) As String
fruits(0) = “りんご”
fruits(1) = “バナナ”
fruits(2) = “みかん”

このとき、“fruits(0)” や “fruits(2)” にある 0 や 2 がインデックスです。

この番号を使って、配列の中のどの要素を読み書きするかを指定します。

VBAでは、配列やシートなど、順番でアクセスするものの多くにインデックスが使われます

次の章では、こうしたインデックスの使い方でどんなミスが起きやすいのかを見ていきましょう。

2.よくあるエラー原因ベスト3とその理由

◼︎配列のインデックス指定ミスとエラーの流れ

配列でのエラーは、VBA初心者が最初につまずきやすいポイントのひとつです。

特にインデックスの範囲外を指定してしまうと、実行時に「インデックスが有効範囲にありません」というエラーが発生します。

たとえば次のコードを見てみましょう。


Dim colors(1) As String
colors(0) = “赤”
colors(1) = “青”
MsgBox colors(2)

この配列は 0 と 1 の2つの要素しか持っていませんが、“colors(2)” と書いたことで存在しない位置を参照しようとしたため、エラーになります。

こうしたミスを防ぐには、事前に配列の最大インデックスを確認する方法が有効です。

“UBound” 関数を使えば、配列の最後のインデックスを取得できます。

たとえば、配列の最後の値だけを表示したい場合は、次のように書きます。


Dim colors(1) As String
colors(0) = “赤”
colors(1) = “青”

Dim lastIndex As Integer
lastIndex = UBound(colors)

MsgBox colors(lastIndex)

このようにすれば、存在する範囲の中で正しく要素を取り出すことができるため、エラーを回避できます。

◼︎シート・セル参照での存在チェック漏れ

VBAでは、ワークシートやセルをインデックス番号(順番)で指定することができます。

しかし、存在しない番号を指定してしまうと、やはり「インデックスが有効範囲にありません」というエラーが出てしまいます。

たとえば、次のようなコードを考えてみましょう。


MsgBox Worksheets(5).Name

一見すると問題なさそうですが、もしブック内にシートが4枚しかなければ、5番目のシートは存在しないため、この行でエラーになります。

このようなケースを防ぐためには、参照しようとしているインデックスが、実際に存在しているかどうかを事前に確認する必要があります。


If Worksheets.Count >= 5 Then
 MsgBox Worksheets(5).Name
Else
 MsgBox “5番目のシートは存在しません”
End If

このように、「存在するかどうか」を確かめてからアクセスすることが、エラーを未然に防ぐポイントです。

◼︎リストやフォームコントロールでの空選択の落とし穴

フォームで使われる “ListBox” や “ComboBox” などのコントロールも、インデックスで項目を参照します。

しかし、ユーザーが何も選択していない状態で値を取り出そうとするとエラーになる場合があります。

たとえば、次のようなコードを見てみましょう。


MsgBox ComboBox1.List(ComboBox1.ListIndex)

このコードは、コンボボックスで選ばれている項目の値をメッセージボックスで表示する処理です。

しかし、もし何も選択されていなかった場合、“ComboBox1.ListIndex” は -1 になり、“List(-1)” を参照しようとするため、存在しないインデックスを指定したことになりエラーになります

このようなケースでは、事前に “ListIndex” をチェックすることが重要です。


If ComboBox1.ListIndex >= 0 Then
 MsgBox ComboBox1.List(ComboBox1.ListIndex)
Else
 MsgBox “項目が選択されていません”
End If

フォーム系のコントロールでは、「選択されていない=無効なインデックス」という認識を持つことが、エラー回避の鍵になります。

配列、シート、リストコントロールなど、インデックスを使う操作には共通して「指定先が存在するか?」という確認が必要です。

今回紹介した3つのケースでは、どれも実行前のチェックや関数(UBoundやCountなど)を使えば防げるエラーでした。

次章では、もしエラーが起きてしまったときにどう調べればよいか、VBAでのデバッグ方法と確認ポイントを紹介します。

3. デバッグのポイントとチェック方法

◼︎エラーが出たときにまず確認すべきこと

マクロを実行したときに突然「インデックスが有効範囲にありません」というエラーが出たら、まず落ち着いてエラーメッセージが出た行を確認しましょう。

VBAではエラーが発生すると、その行が黄色にハイライトされ、どこで止まったかを示してくれます。

この時点で、その行に書かれたインデックス指定が妥当かどうかを確認するのが第一歩です。

たとえば、配列やリストなどで「番号を指定して何かを取り出す」処理がある場合、その番号が適切かを次のような視点で見てみましょう。

•配列のサイズを超えていないか(UBoundと比較)

•シートの数より大きな番号を指定していないか

•ListIndexが -1 などの無効な値になっていないか

このように、「その場所、本当にある?」という視点でインデックスの妥当性を見直すことが、原因特定の第一歩となります。

◼︎ステップ実行でエラー箇所を見つける

VBAでは、マクロを1行ずつ確認しながら実行できる「ステップ実行」という機能があります。

これを使えば、どの行でエラーが発生するのかを正確に突き止めることができます。

ステップ実行の使い方は簡単です。

  1. エディタでマクロを開く
  2. F8キーを押す(または「デバッグ」メニューの「ステップイン」)
  3. 一行ずつ実行しながら、処理の流れや変数の値を確認する

たとえば、以下のような処理があるとします。


Dim fruits(1) As String
fruits(0) = “りんご”
fruits(1) = “バナナ”
MsgBox fruits(2)

ステップ実行を使えば、3行目までは問題なく進み、最後のMsgBoxの行で止まることで「ここが原因だ」とわかるわけです。

エラーの出る瞬間を目で見ながら追えるため、特に複雑な処理やループの中でのエラー確認に有効です。

◼︎ローカルウィンドウやウォッチ式の活用

エラーの原因をより詳しく調べたいときは、ローカルウィンドウやウォッチ式を使うのがおすすめです。

これらは、変数の中身やインデックスの値をリアルタイムで確認するための機能です。

● ローカルウィンドウ

ステップ実行中に、現在使っている変数が一覧表示され、その中身(値)や型が確認できます。

自動で更新されるため、処理の進行とともに変数の変化を追いやすいのが特徴です。

● ウォッチ式

特定の変数や式を指定して、その値を監視できます。

たとえば “fruits(2)” という式をウォッチに登録しておけば、「この値は存在するのか?」「今いくつ?」といったことがすぐにわかります。

使い方は以下の通りです。

•ローカルウィンドウ:「表示」メニュー → 「ローカルウィンドウ」

•ウォッチ式:「デバッグ」メニュー → 「ウォッチの追加」

これらのツールを活用すれば、「見えない変数の中身」を可視化しながら調査できるため、デバッグの効率がぐっと上がります。

このように、「インデックスが有効範囲にありません」というエラーが出たときは、焦らず「どこで止まったか」「何を参照していたか」を順に確認することが大切です。

4.まとめ|焦らず確認すれば怖くない!

「インデックスが有効範囲にありません」というエラーは、VBAに慣れてきた頃に多くの人が経験する定番のエラーです。

ですが、落ち着いて「どこで」「なにを」参照しようとしたかを見直すことで、必ず原因にたどりつけます。

以下に、今回紹介した3つの代表的な原因と、それぞれの対策をまとめました。

原因対策
配列の範囲外アクセスcolors(2) のように存在しない位置を参照UBoundで範囲確認
存在しないシート番号Worksheets(5) のように不在のシートを指定Worksheets.Countで確認
選択されていないリスト項目ComboBox1.ListIndex が -1ListIndex >= 0 を条件にする

また、デバッグの基本操作(ステップ実行やローカルウィンドウなど)も活用すれば、エラー原因を目で見て確かめることができます。

「どこかで何かが間違ってる」ではなく、「どのインデックスが不正か」を見るだけ

そう考えれば、このエラーは決して怖いものではありません。

事前に対策をすることと、エラーが起きた際の対処方法を知っておくことで便利にマクロを使えるようになりましょう!

\ Excelマクロ制作も承っています /

各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!

見積もり無料!超効率化!Excelマクロ開発します ルーティンワークの煩わしさに悩んでいる方へ