何度もこのエラーに遭遇するのには理由があるエラー9「インデックスが有効範囲にありません」は、例えば配列の要素数が3なのに4つ目にアクセスするなどの配列の範囲外へアクセスや、VBAの各種コレクションに含まれない値を指定した場合などの存在しない引数が原因なのですが、その原因を知っていてもなぜか同じようにこのエラーを発生させてしまう方がいます。このページでは、エラー自体についての説明ももちろん書いていますが、そもそもなぜこのエラーを発生させてしまうのかという根本原因についても書いています。VBAではこのエラーにはまることがとても多いのです。その根本原因を知っているかどうかで今後このエラーに対する対応が劇的に速くなるはずです。エラーの根本原因このエラーは非常に多発するエラーです。そのためVBAに詳しくこのエラーには慣れている方は、ネットで調べるまでもなく自分で解決していることが多いでしょう。このエラーについて説明しているサイトのほぼ全てが、「配列と要素数」というエラー自体のキーワードについて説明していると思いますが、それはそういうエラーが発生したという事象にすぎません。問題の根本はそこではありません。今ここを見ている方は今から説明する2つの根本原因のどちらか、もしくは両方について知らなかったり慣れていないのではないかと思います。根本原因は2つあります。1つはエラーメッセージの意味が分からないということ。1つは配列の最後の番号が分からないことです。エラーメッセージの意味が分からない根本原因の1つはエラーメッセージを読んでも意味が分からないということです。意味が分からないことには理由があります。それはメッセージの日本語がおかしいためです。インデックスが有効範囲にありません。」というエラーメッセージを初めて見たときに、配列やコレクションのエラーだと気付くのはかなりプログラミングに慣れた人でしょう。このメッセージは主語が間違っています。本当の主語は「インデックス」ではなく「配列」です。実際は配列だけでなくコレクションなども対象なのですがエラーの概念は同じなので、ここではまとめて配列とします。エラーメッセージが「配列の番号が配列の範囲(要素数)を超えているため配列への参照や設定ができません」と書いてあればどうでしょうか。それを見ても理解できて、あとは自分で対応できる方は結構多いのではないかと思います。主語がないと意味が分かりませんからね。配列の最後の番号が要素数から1引いた数であることを強く認識できていないもう1つの根本原因は配列の最後の番号が何になるのか分からないという点です。通常は配列が0開始であるということは理解されていると思いますが、では配列の最後は?と聞かれたときにすぐにこたえられるかどうかです。答えられないのであれば、配列の先頭が0である、ということと同じぐらいに、配列の最後は要素数マイナス1、と覚えておきましょう。このエラーが発生するのはほとんどがループ処理の終端処理をミスしていることによります。言い方を変えるとループの終了条件と配列の最後を一致させることができていない、ということになります。以下に配列の説明を3つ書いていますが、概念としては同じことを言っています。「配列の最後は最大要素数から1を引いた番号を指定する」もしこれを見てモヤモヤする部分が少しでもあるなら、それがこのエラーの根本原因です。配列に、”aaa”と”bbb”と”ccc”の3つを入れてある場合、要素数は3になります。これは分かると思います。配列の番号は0、1、2です。これもわかると思います。配列の最後の番号の2とは何の数字なのか理解できているでしょうか。要素数と最後の番号は1ずれているという点です。