VBAでシートのコピーに関する問題とエラーメッセージの解決方法

このQ&Aのポイント
  • VBAを使用してシートを別のワークブックにコピーする方法について質問します。マクロを実行すると、指定されたシート名のシートが作成されます。その後、コピーするシート名を配列に格納し、それを使用してシートをコピーしようとしています。しかし、実行時エラーが発生し、「インデックスが有効範囲にありません」というエラーメッセージが表示されます。
  • エラーメッセージによれば、配列参照のインデックスが有効範囲外であるということです。しかし、配列を直接指定する方法では正常に動作します。この問題の解決策は何でしょうか?初心者にとっては基本的な問題かもしれませんが、どなたか教えていただけますか?
  • VBAを使用してシートを別のワークブックにコピーしようとしていますが、配列を使用してオブジェクトを指定する場合にエラーが発生します。配列を直接指定する方法では正常に動作しますが、配列に格納してから指定する場合にエラーが発生します。このエラーの原因と解決方法をご教示ください。お願いいたします。
回答を見る
  • ベストアンサー

VBAの質問(シートのコピーについて)

VBAの質問(シートのコピーについて) VBAのシートのコピーについてご教授願います。 あるマクロを実行すると、以下のようなシートが作成されます。 シート名:aaaa シート名:bbbb シート名:cccc シート名:dddd 上記シート名のうち、aaaa、bbbb、cccc、ddddを別ワークブックへコピーしたく、以下のように マクロを書いております。 (既に配列strA()にaaaa、bbbb、cccc、ddddが入っております。) Dim strA() As String  ・・・  処理   ・・・ 'シートのコピー For i = 0 To UBound(strA) If i = 0 Then CopySheet = Chr(34) & strA(i) & Chr(34) ElseIf i > 0 Then CopySheet = CopySheet & "," & Chr(34) & strA(i) & Chr(34) End If Next i Sheets(Array(CopySheet)).Copy ---エラーメッセージ--------------- 上記処理を流すと、実行時エラー'9': インデックスが有効範囲にありません。 -------------------------------- しかし、以下のように配列を直接指定すると、正常にコピーされます。 'Sheets(Array(strA(0), strA(1),strA(2),str(3))).Copy 初歩的な問題かもしれませんが、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

質問のコードを使用するなら Sub test() Dim i Dim CopySheet Dim strA(2) strA(0) = "sheet1" strA(1) = "sheet2" strA(2) = "sheet3" 'シートのコピー For i = 0 To UBound(strA) If i = 0 Then CopySheet = strA(i) ElseIf i > 0 Then CopySheet = CopySheet & "," & strA(i) End If Next i MsgBox CopySheet Sheets(Split(CopySheet, ",")).Copy End Sub こんな感じにしないとね 上のコードを要約すると Sub test() Dim i Dim strA(2) strA(0) = "sheet1" strA(1) = "sheet2" strA(2) = "sheet3" 'シートのコピー Sheets(Split(Join(strA()))).Copy End Sub こんな感じです 参考まで

zuraoyaji
質問者

お礼

Sheets(Split(CopySheet, ",")).Copy  ↑ Splitを使ってやれば、簡単に出来るのですね。 文字列(CopySheet)を作るのに、必死になっていました・・・ 大変有難うございました。

その他の回答 (2)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

回答1、myRangeです。 >ご回答どおりにやってみましたが、NGでした。 配列に入っているシートがないのでは? ま、それは置いといて、 新しいブックで下記を試してみてください。 質問者のExcelも新しいブックではシートが3枚開くという前提。 違ったら適宜変更のこと。 Sub test()   Dim strA() As String   ReDim strA(1)   strA(0) = "Sheet2"   strA(1) = "Sheet3"   Sheets(strA()).Copy End Sub 以上です。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

  あっさりと   Sheets(strA()).Copy ではどうでしょうか。 以上です。

zuraoyaji
質問者

補足

ご回答どおりにやってみましたが、NGでした。 エラーメッセージは同じです。

関連するQ&A

  • SQLの書き方について教えてください。

    accessについて。 シートの中に列名name、列名friendnameがあります。 name,friendname aaaa,bbbb bbbb,cccc cccc,aaaa dddd,aaaa eeee,bbbb ffff,eeee ほしいデータは aaaa,bbbb,cccc bbbb,cccc,aaaa cccc,aaaa,bbbb dddd,aaaa,bbbb eeee,bbbb,cccc ffff,eeee,bbbb と友達の友達の名前がほしいのです。 SQLの書き方を教えてください。 よろしくお願いします。

  • シートコピーがわかりません(VBA)

    いつもお世話になっております。マクロを最近仕事で作り始めましたが、初心者ゆえ、四苦八苦しており、本日質問させていただくことになりました。 3枚目から最後のシートを別ブックにコピーするマクロを作りたいのですがどのようにしたらいいでしょうか。 複数のシートをコピーするのは Sheets(Array("1", "2", "3", "4", "5").Copy Before:=Sheets(13) というのはわかるのですが、「3枚目以降のシートすべて」とする方法を教えていただきたいと思います。 基本的なことかもわかりませんが、よろしくお願いします。

  • 配列の値を一行あけて出力

    配列の値を一行あけて出力したいのですが、うまくいきません。 ご教授お願いいたします。 <shell> #!/bin/bash ARRAY=("aaaa" "bbbb" "cccc") IFS=$'¥n'$'¥n' echo "${ARRAY[*]}" <現在の出力> aaaa bbbb cccc <期待する出力> aaaa bbbb cccc

  • VBA シートのコピー

    シートをコピーし、挿入をシートの末尾にする場合はどうなりますか? マクロを使ってやったときに、20のシートがあったため、下記のようになりますが、これだと、2回目以降にコピーしたとき20番目に挿入されて末尾には移動しないですよね。 そこは、どうしたらいいですか?? シート名「あああ」 Sheets("あああ").Copy After:=Sheets(20) お願いします。

  • excelシートから別のexcelシートへのコピー

    動作環境は、OS:XP、VB6+SP6です。 シート名がわかっている場合ですと Sheets(Array("sheet1", "sheet2")).Copy Before:=Workbooks("コピー先.xls").Sheets(1) のようにできるのですが、不明な場合はどうしたらよいのでしょうか? コピー元ワークブックのシート数とシート名が不明なので、まずコピー元のシート名を取得しました。 しかし文字列だと、上記Arrayの中に埋め込むことができません。 どなたかご存知でしたら教えてください。

  • Excel抽出のマクロかVBAを教えてください

    A列にxxxがあった場合、その上に存在するIDの値を抽出する方法を教えていただけますでしょうか? 例)xxxがあった場合、IDの値を抽出したい。 以下の場合、ID:1111とID:3333と表示したい。 (ID以降の値はランダムです) A列 ID:1111 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff ID:2222 aaaa bbbb cccc dddd eeee ffffff ID:3333 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff

  • SQLでの集計

    下記の様に、「複数のitemを買っているuserと購入されたitem」のテーブルと、 user item ---------------------------------- 田中 AAAA 田中 CCCC 田中 EEEE 北野 DDDD 北野 BBBB 北野 AAAA 小堺 CCCC 小堺 EEEE 松本 EEEE 松本 KKKK 松本 CCCC 松本 DDDD 浜田 BBBB 浜田 DDDD 下記の様な IDに紐付いた 「item」のテーブルから、 ID  item ---------------------------------- 1   AAAA 2   BBBB 3   CCCC 4   DDDD 5   EEEE 下記の様に各itemと各itemを買った場合に一緒に買われるitemの一覧を結果 として表示させたいのですが、クエリの作り方が思い浮かばず、困っています。 ※)可能であれば、買われたitemを表示する際にはbuy1から(左側から)同時購入 回数の多いitemを重複せずに並べて表示したい ID  item  buy1  buy3  buy4  buy5  buy6・・・・ ---------------------------------- 1  AAAA CCCC BBBB DDDD EEEE 2  BBBB DDDD AAAA 3  CCCC AAAA EEEE DDDD KKKKK 4  DDDD AAAA BBBB CCCC EEEE 5  EEEE AAAA CCCC KKKKK 尚、IDと紐付いているitem数は決まっていますが、買われるitemの種類は上記 の様にIDが1~5だけではなく、集計してみないと判らない状況です。 今の所、SQLはACCESS(2003)上にて手打ちしています。 以上、ご教示のほど、宜しくお願い致します。

  • ACCESSにて2つのテーブルの比較

    2つのテーブルA,テーブルBがあります。テーブルBのデータ以外のデータを選ぶにはどうのようにすれば良いのでしょうか? テーブルA data--- aaaa bbbb cccc dddd aaaa cccc テーブルB data--- aaaa bbbb 欲しい結果 テーブルA data--- cccc dddd cccc よろしくお願い致します。

  • UNIXで文字列分割

    UNIXでマルチバイトの文字列で分割したいです。 例) aaaa bbbb cccc dddd eeee ffff ↓ [bbbb]で分割 [1]aaaa [2] cccc dddd eeee ffff できればawkで処理をしたいと考えています。

  • PHP 多次元配列のソート

    $array = array( array("address" =>"eeee@dddd.ddd","name" => "あいう"), array("name" => "はざま","address" => "cccc@dddd.ddd"), array("name" => "かきく","address" => "tttt@ccc.eee"), array("name" => "さく","address" => "bbbb@dddd.ddd"), array("name" => "あか","address" => "aaaa@dddd.ddd") ); 上記のような多次元配列があった場合 sort($array); とすると 以下のようなデフォルトの配置が Array ( [0] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [1] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [4] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) ) 上記の並びが Array ( [0] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [1] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [4] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) ) nameキーの値をもとにあいうえお順にならびかえられます。 がこれをnameキーではなく addressキーで並び替えたいと思ったとき、 usort($array , function($a,$b){ if($a["address"]< $b["address"]){ return -1; }else{ return 1; } } ); と上記のようのおこなうと Array ( [0] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [1] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [2] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [3] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [4] => Array ( [name] => かきく [address] => tttt@ccc.eee ) ) とうまくaddressキーでabcdの順にソートできています。 次に usort($array , function($a,$b){ return strcmp($a["address"],$b["address"])? -1:1; } ); と上記のようにstrcmp関数を使うと Array ( [0] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [1] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [4] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) ) うまくソートできませんでした。 この、直接 $a, $bの大小を条件とした場合と strcmp — バイナリセーフな文字列比較をおこなうstrcmp とは、どのような処理の違いがあるのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう