「配列の最後は最大要素数から1を引いた番号を指定する」, もしこれを見てモヤモヤする部分が少しでもあるなら、それがこのエラーの根本原因です。, 配列に、”aaa”と”bbb”と”ccc”の3つを入れてある場合、要素数は3になります。これは分かると思います。, このコードの1行目には配列の要素数を3と指定し、2行目で配列番号3を指定しています。, コードだけを見ると要素数と最大要素番号がずれていることに気が付かないことがあります。, 大事なことなので繰り返し書きますが、配列が0開始ということは、配列の最後の番号が要素数から1引いた数ということであることを覚えておきましょう。, ここがこのエラー発生の根本原因だということを知っているのといないのとではコードの精度は違ってきます。, 一度でいいのでサイトや本を見るだけでなく、自分で配列の絵と各要素の番号の絵を書いてみることをお勧めします。, そして、配列の最後の要素と配列の要素数の関係を確認しましょう。その一度が今後の配列の理解に大きく役立ちます。, VBAの実行時に「実行時エラー ‘9’: インデックスが有効範囲にありません。」というエラーになることがあります。, 例えば、日曜日から土曜日までの7日間の配列を用意する場合、配列の要素は7つの領域を用意することになります。, ところが誤って6つしか領域が用意されていない状態の場合に、7つ目の領域にアクセスするとエラー9になります。. Excel VBA マクロのエラー 9 「インデックスが有効範囲にありません。」の対処法を紹介します。配列やコレクションのインデックスが要素数より大きいときに発生します。存在しない名前をコレクションに指定しても発生します。 ョン内で配列に次元が割り当てられていません。配列の 宣言で、配列の上限と下限を確認します。次元が変更された配列を使用する場合は、 UBound 関数および LBound 関数を使用して、配列へのアクセスを調整します。インデックスが 変数として指定されている場合は、変数名のスペルを確認します。, 配列を宣言しましたが、要素数を指定していません。たとえば、次のコードではこのエラーが発生します。. I've got some prehistorical code that I have to check if it is still working with Office 2016. (adsbygoogle=window.adsbygoogle||[]).push({}); エラーの対応方法は、配列設定時や参照時のループ終了条件を正しく設定することでほとんど解決します。, 配列のループ処理であればForループとUBound関数やFor Each構文を使うのが分かりやすくていいと思います。, 12行目のFor Eachで配列の各要素値を取得する方法です。この方法が一番簡単です。, Doループなどの終了条件がないループ構文を使う場合は、配列処理を行う前に終了条件を書くようにする、などのルールを決めておくとよいです。, しかし、どうしてもDoループなどを使う必要がある場合は、終了条件をどこに書くかを自分の中で決めておいた方がよいです。, 終了条件をループの先頭に書いたり最後に書いたり途中に書いたり、とバラバラだと、都度終了判定が > なのか >= なのかなどを考えなければなりません。, もちろん例外はありますが、基本的なルールを決めておいた方が本件エラーに悩まされることは少なくなります。, 大事なことなので繰り返し書きますが、配列が0開始ということは、配列の最後の番号が要素数から1引いた数ということである, エラー91対応方法(オブジェクト変数または With ブロック変数が設定されていません。). At last I want to remove WS-A-Copy from the original workbook A, but when I try to delete this sheet, I get a runtime error 9 (Subscript out of range). 『実行時エラー '9' インデックスが有効範囲にありません。』の対処方法についてです。配列の操作時やブック、シートの操作で本エラーが発生したときの原因と解決方法について説明します My excel 2013 compiler wouldn't pass them, For your own sake, fully qualify the workbook variables and dont use select or activate. エラー '9': インデックスが有効範囲にありません。 と出るときは、名前かインデックス番号のどちらかを、 存在しないものを指定していると、案内しているわけです。 これはブックでもセルでも同じことです。 で、 >With ws > .Name = rngName(.Index).Value activeworkbook.Name" in the Immediate Window right before the error occurs). 9エラーを出すサンプルは下のようになります。 Sub Test() Worksheets("Cheet1").Activate End Sub. ActiveWorkbook.Pathでパス名を取得して、同じフォルダ内の別のエクセルシートを開きたいのですが、見つかりませんと、エラーになります。ただしそのエクセルを直接開いて名前を付けて同名で上書き保存をすると取得できるようになるので Excel 2013 で下記のマクロを実行しているときに 実行時エラー'9':インデックスが有効範囲にありません と出ます。 Sub test() Workbooks("Book2.xlsm").Worksheets("Sheet1").Visible = False End Sub 「Sheet1」があるのにも関わらず、上記のようなエラーが出ます。 どうすれば「Sheet1」 With Office 2013 it is working like a charm, but now with the new version I get an error. Licensed under cc by-sa 3.0 with attribution required. But why do I get this runtime error? Its probable that this is contributing to the error. Thanks in advance! Its probable that this is contributing to the error – RGA 25 7月. I'm also checking if the Sheet exists in the current Workbook. 何度もこのエラーに遭遇するのには理由がある エラー9「インデックスが有効範囲にありません」は、例えば配列の要素数が3なのに4つ目にアクセスするなどの配列の範囲外へアクセスや、vbaの各種コレクションに含まれない値を指定し … activeworkbook.Nameを」エラーが発生する直前に、イミディエイトウィンドウにタイプデバッグモード)私は右のワークブックAを使用している場合 . 「配列の2番目を指定するときは番号は1を設定する」 Afterwards I copy WS-A-Copy to a new Workbook B (creating WS-B). 皆さんは、VBAでアクティブワークブックを操作する方法を知っていますか?複数のブックを使った処理を作る場合、アクティブになっているブックを操作するケースはよくあります。 そこで今回は、 ActiveWorkBookとは ThisWorkBookとActiveWorkBookの違い サンプルコードを使った具体的な使い方 That's what I'm trying: In Workbook A I've got a worksheet WS-A that I want to copy to a new Workbook B. 162016-07-25 09:27:11 M. Schaetzl, how did you get through variables named like that? WS-A-Copy.Delete, 作成 25 7月. So both are true. 162016-07-25 09:46:29 Anonymous. 162016-07-25 09:40:30, You should simplify you code by setting references to the objects instead of referencing them by name. I'm already checking if I'm using the right Workbook A (debug mode - type "? And why does this sheet WS-A-Copy still get deleted in Workbook A? My excel 2013 compiler wouldn't pass them – user3598756 25 7月. 上のコードは設定時のエラーの例ですが、配列の値を参照しようとした場合もエラーになります。 Before that I'm creating a copy of WS-A (called WA-A-Copy) in Workbook A and make some changes. And why is this a problem in Office 2016, but with Office 2013 it's fine? Changing this WS-A-Copy = ActiveSheet.Name to Set WS-A-Copy = ActiveSheet will allow you to delete the worksheet without referencing the workbook that it is in. 作成 25 7月. 162016-07-25 09:39:24, For your own sake, fully qualify the workbook variables and dont use select or activate. Can anybody give me a hint? エラー9「インデックスが有効範囲にありません」は、例えば配列の要素数が3なのに4つ目にアクセスするなどの配列の範囲外へアクセスや、VBAの各種コレクションに含まれない値を指定した場合などの存在しない引数が原因なのですが、その原因を知っていてもなぜか同じようにこのエラーを発生させてしまう方がいます。, このページでは、エラー自体についての説明ももちろん書いていますが、そもそもなぜこのエラーを発生させてしまうのかという根本原因についても書いています。, その根本原因を知っているかどうかで今後このエラーに対する対応が劇的に速くなるはずです。, そのためVBAに詳しくこのエラーには慣れている方は、ネットで調べるまでもなく自分で解決していることが多いでしょう。, このエラーについて説明しているサイトのほぼ全てが、「配列と要素数」というエラー自体のキーワードについて説明していると思いますが、それはそういうエラーが発生したという事象にすぎません。, おそらく今ここを見ている方は今から説明する2つの根本原因のどちらか、もしくは両方について知らなかったり慣れていないのではないかと思います。, 1つはエラーメッセージの意味が分からないということ。もう1つは配列の最後の番号が分からないことです。, 「実行時エラー ‘9’: インデックスが有効範囲にありません。」というエラーメッセージを初めて見たときに、配列やコレクションのエラーだと気付くのはかなりプログラミングに慣れた人でしょう。, 実際は配列だけでなくコレクションなども対象なのですがエラーの概念は同じなので、ここではまとめて配列とします。, もしエラーメッセージが「配列の番号が配列の範囲(要素数)を超えているため配列への参照や設定ができません」と書いてあればどうでしょうか。, 初めてそれを見ても理解できて、あとは自分で対応できる方は結構多いのではないかと思います。, 通常は配列が0開始であるということは理解されていると思いますが、では配列の最後は?と聞かれたときにすぐにこたえられるかどうかです。, もし答えられないのであれば、配列の先頭が0である、ということと同じぐらいに、配列の最後は要素数マイナス1、と覚えておきましょう。, このエラーが発生するのはほとんどがループ処理の終端処理をミスしていることによります。, 言い方を変えるとループの終了条件と配列の最後を一致させることができていない、ということになります。, 「配列の先頭は1ではなく0から始まる」 how did you get through variables named like that?