対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016 Excelマクロを作る際、よく見かけるエラーに 「実行時エラー'9' インデックスが有効範囲にありません。」 があります。 このサイト『インストラクターのネタ帳』のアクセスログでも、 「vba sheets インデックスが有効 excel2013」 「エクセルマクロ sheets(selectedvalue).
はじめに 前回、 マクロを作るまでの過程を詳らかにせんと書き始めた記事が色々端折った感じになりましたので、補足記事その1です。 やりたいこと ここに2つの Excel ブックがあります。 ファイルの名前 シート コピー元 コピー元1 コピー元2 コピー元3 Sheet1 Sheet2 Sheet3 [コピー元]の[コピー元1]シートを[]にコピーしたい。 (ちなみに「Book2」は「」で追加された状態です) 調べる とりあえず「 vba シート コピー」とでも検索しましょう。 次の書き方でシートをコピーできるという情報をゲット。 Worksheets ( "[シート名]"). Copy After: = Worksheets ( "[シート名]") 試す 実際に書いて実行してみます。 Sub bbb () Worksheets ( "コピー元1"). Copy After: = Worksheets ( "Sheet1") End Sub 怒られる インデックスが有効範囲にありません。 意味がわからない。 「 vba シート コピー インデックスが有効範囲にありません」で検索します。 ・・・・・・・・ なんとなく、シートの指定がおかしいのかな? シートの指定方法 「 vba シート指定」で、シート名ではなくシートのインデックスで指定できるという耳寄りな情報をゲット。 Worksheets ( "コピー元1"). Copy After: = Worksheets ( 1) お、実行されましたよ コピー元1 コピー元1(2) ヤッタネ!! ・・・いや、そうじゃないんだよ。 他のブックにコピーしたいんだよー 「 vba 他のブックにシートをコピー」で仕切り直しです。 Worksheets ( "コピー元1"). Copy After: = Workbooks ( "Book2"). Worksheets ( 1) Sheet1 コピー元1 いやー、できたできた。 余韻に浸る よーし。もう1回やってみようかな。 コピーしたシートを消して... インデックスが有効範囲にありません。 どゆこと? さっきはできたじゃん! 俺たちうまくいってたじゃん! 「 vba さっきはできたのにできない」で検索します。 ・・・・・・・・ いやあ、サスガに出てこないですね。 でもちょい待ち。 このエラー、さっきも出ましたな。 Worksheets ( 1).
サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、 Office VBA のサポートおよびフィードバック を参照してください。
1 bonaron 回答日時: 2016/10/19 10:47 変数名を「book1」などとするから混乱するのですよ。 例えば「objBook」とすればイメージが掴みやすくなりませんか? Dim objBook As Workbook Set objBook = Activeworkbook ・・・ SaveChanges:=False > カッコの中の書き方が人それぞれですが、 人それぞれではなく、カッコの中が何を表しているかによります。 ◆ネットでは、workbook(book1)〜 '正しくは Workbooks ですよ この場合 book1 は ワークブック名を表す文字列です。 Dim strBook As String strBook = "管理台帳" Workbooks(strBook) ◆もしくはworkbook("")など これは上記の 変数を使わず、ダイレクトに文字列で指定したケースですね。 Workbooks("管理台帳") クローズするのは Workbook オブジェクトですから、 単体の Workbook オブジェクトを取得するいずれかの書き方をすれば良いのです。 【参考】 Workbook オブジェクト (Excel) … お探しのQ&Aが見つからない時は、教えて! gooで質問しましょう! このQ&Aを見た人はこんなQ&Aも見ています
エラーメッセージの意味が分からない 根本原因の1つはエラーメッセージを読んでも意味が分からないということです。 意味が分からないことには理由があります。それは メッセージの日本語がおかしい ためです。 「実行時エラー '9': インデックスが有効範囲にありません。」というエラーメッセージを初めて見たときに、配列やコレクションのエラーだと気付くのはかなりプログラミングに慣れた人でしょう。 このメッセージは主語が間違っています。本当の主語は「インデックス」ではなく「配列」です。実際は配列だけでなくコレクションなども対象なのですがエラーの概念は同じなので、ここではまとめて配列とします。 もしエラーメッセージが「 配列の番号が配列の範囲(要素数)を超えているため配列への参照や設定ができません 」と書いてあればどうでしょうか。初めてそれを見ても理解できて、あとは自分で対応できる方は結構多いのではないかと思います。 主語がないと意味が分かりませんからね。 2.
Activate 正しいサンプルはこちらですね。 'CheetをSheetに訂正 このように、9エラーが発生した場合は逐次書き直すことが必要です。しかしそれ以前の問題として、見分けがつきにくかったり、取り回しが悪いシート名・変数名を使うべきではありません。理想は 自分以外の人が見てもすぐに意味が理解でき、使うことのできる変数名 です。 ココらへんはプログラミングの言語を問わない、読みやすいコードの話になってきます。大規模なプログラムを開発する予定のある人、複数人でコードを使い回す必要がある人は言語そのものの勉強とは別に、読みやすいコードの書き方も学んでおくと後々役に立つでしょう。 まとめ いかがでしたか? 今回は VBAでシートをアクティブ化する基本的な方法 かよくあるエラーの対策方法 までをご紹介しました。今の時代、大体のエラーに対するわかりやすい対処法はネット上に公開されています。プログラミングを学習していく中でいろいろなエラーに遭遇するかと思いますが、自分に合ったわかりやすい解説を探しつつ、じっくりエラーと向き合っていっていただければ、と思います。 この記事が皆様のエラー解決の一助となれば幸いです。お相手はExcelと付き合い始めて20年、今も裏でサブPCにOfficeをインストール中の平山でした。 書いた人 フリーのエンジニア・ライター。 プログラミング、ライティング、マーケティングなど、あらゆる手段を駆使して、 ハッピーなフルリモートワーカーを目指し中。 最近興味がある分野は深層強化学習。 積みゲー、積ん読がどんどん増加しているのがここ数年の悩み。 実は侍エンジニア塾の卒業生だったりします。
よろしくお願いします。 Excel ・ 10, 186 閲覧 ・ xmlns="> 100 ReDimで多次元配列を変える場合、変更出来るのは、最後の要素分だけだと思いますが? Col * xの方は良いけど Gyo * vの方はダメ。 そうじゃないと、データの並び自体を変えなければ維持できません。 A_A_A B_B_B これに C_C_C を追加するのはいいが 横に増やすと A_A_A_B B_B_C_C C_C ということになるので、これを正しくするためには、データの並びに間隔を開けなければならなくなる。 A_A_A_空 B_B_B_空 C_C_C_空 これは認められていません。 ThanksImg 質問者からのお礼コメント ありがとうございました。 理解できました。 お礼日時: 2011/11/5 8:26 その他の回答(1件) ReDimのヘルプより抜粋 ========================= キーワード Preserve を指定した場合、変更できるのは、 動的配列の最後の次元のサイズに限られます。 最後の次元以外は、同じサイズにしておかなければなりません。