プロが教えるわが家の防犯対策術!

いつもお世話になります。
皆様にご教授いただき、ほぼ理想に近づいてきました。
今回ご教授いただきたいのは、作業中のブックの末尾に他のブックから4シートまとめてコピーして張り付けたいのです。現在は手作業で行っています。
作業中のブックは20シート位でその時によってシート数は変化します。sheet1のシート名は"シート一覧"、sheet2~sheet20位のシート名は”名簿””№”~"№(18)"位で一番末尾のシート名は"Sheet3"となっています。コピー元のブック名は”集計表”で4シートあり左から”集計表”、”表”、”表②”、”グラフ”のシート名です。”集計表”シートにデータが入るとその右の3シートのグラフや表が出来上がるようになっています。1シートずつ移動させると表やグラフがエラー表示となってしまうため、4シートまとめて移動したいのです。
いろいろやってみたのですが、うまくいきません。
上記の作業中のブックももともとはすべて1シートからなるブックを【エクセルアテンダント】というソフトで1ブックにまとめたものですが、ソフトを使用せず、VBAで上記作業とあわせてまとめることが出来るのであれば、その方がベストです。まとめることが出来るのであれば、”名簿”シートが先頭で”№”~”№()”の後ろに上記4シートにしたいのですが。まとめる前のブック名は”名簿”ブックの”名簿”シートと”診断書01”~”診断書18”(その時によって数は変化します)という名前のブックで1シートで出来ています。シート名はsすべて”№”です。この数あるブックをソフトでまとめると一番前に”シート一覧”というシートが、一番後ろに”Sheet3”というシートがついた、任意の名前のブックが出来上がるのです。ソフトを立ち上げたり移動したりと手間がかかることと、一度ファイル形式をxlsxからxlsに変換しないと1ブックにまとめることが出来ないのことがネックとなっています。
すべてデスクトップ上にありますが、同じフォルダにまとめることは可能です。
あわせて、ご教授いただければ、非常に助かります。
よろしくお願いいたします。

A 回答 (3件)

ANo2です



>(インデックスが有効範囲にありません)
このエラーは、ブック名やシート名が見つからない時に出ます。
具体的には、
Workbooks("コピー元.xlsx")や
Worksheets(Array("SheetA", "SheetB", "SheetC")が見つからない時です。

提示しましたコードは、単純にシートをコピーするだけのものですので、両方のブック(コピー元、コピー先)が開いた状態であることが前提です。
ブックが閉じた状態で実行した場合も、該当するブックが見当たらないので、上記のエラーになります。
ブックが閉じた状態から実行するには、その前にブックを開く処理が必要になります。
    • good
    • 0
この回答へのお礼

fujillin様

具体的な指摘ありがとうございます。

再度確認したところ、シート名が間違っていました。すみません。
シート名を変更し、実行したら問題なく実行できました。
ブックを開く処理も追加したところ、閉じている状態でも実行できました。
後はブックを閉じる処理を追加してみます。

ありがとうございました。

お礼日時:2017/06/28 19:50

ANo1です。



>sub () ・・・end subをつければよいのでしょうか?
とりあえずは、それでも動作するはずです。

再確認してみましたが、私の環境では『うまくいきます』ので『うまくいきませんでした。
』という情報からだけでは何ともわかりません。
    • good
    • 0
この回答へのお礼

fujillin様

さっそく回答いただき、ありがとうございます。

デスクトップ上にコピー元という名前のブックを作成(ファイル形式xlsxの為、コピー元ファイル形式だけxlsxに変更しました。)し、Sheet1,Shee2,Sheet3の3シートを確認し、他のブックに下記のコードを入れ実行すると実行時エラー9(インデックスが有効範囲にありません)と出てしまい、デバックで確認するとSet shs=の行が黄表示になります。

Sub テスト()
Set shs = Workbooks("コピー元.xlsx").Worksheets(Array("SheetA", "SheetB", "SheetC"))
Set ds = ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)

shs.Copy after:=ds

End Sub

何処かやり方がおかしいと思うのですが、わかりません。

ご教授お願いいたします。

お礼日時:2017/06/28 13:56

こんにちは



ご質問文を追いかけて読む気になれないので、斜め読みで、きちんと理解できていませんが・・・

>一度ファイル形式をxlsxからxlsに変換しないと1ブックにまとめる
>ことが出来ないのことがネックとなっています。
頻度やその他の状況にもよりますが、これが本質的なネックであるなら、すべてのファイルをxls形式にしてしまうという手段もあるのではないでしょうか?
まぁ、どちらかと言えば逆で、xlsxに統一する方が良さそうには思いますが。

>1シートずつ移動させると表やグラフがエラー表示となってしまうため~~
1シートずつコピーしても関数等の参照先が「元ブック」になるだけで、通常はエラー表示になることはないと思います。
INDIRECT関数などのように、文字列で参照を指定しているような部分に関しては、エクセルが自動変換してくれませんので、エラーの原因となる可能性はあります。
参照変換ができないような関数式が原因であるなら、VBAで処理しても同じことが起こるはずです。
(実際の状況が不明なので、何が原因かもわかりませんが…)

>他のブックから4シートまとめてコピーして張り付けたいのです。
?現在は手作業で行っています。
手作業でも、複数シートをまとめてコピーすることは可能です。
その操作を『マクロの記録』で記録すれば、基本的なコードは得られると思います。
(一般化しないと使えない可能性は高いですが、方法はわかるはずです)


とりあえず、
「コピー元」ブックのSheetA、SheetB、SheetCをマクロのあるブック(=ThisWorkbook)の末尾にコピーするマクロの一例を、以下に記しておきますのでご参考まで

Set shs = Workbooks("コピー元.xls").Worksheets(Array("SheetA", "SheetB", "SheetC"))
Set ds = ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)

shs.Copy after:=ds
    • good
    • 1
この回答へのお礼

fujillin様 こんにちは
回答していただき、ありがとうございます。
休みでお礼が遅くなり、すみません。

>頻度やその他の状況にもよりますが、これが本質的なネックであるなら、すべてのファイルをxls形式にしてしまうという>手段もあるのではないでしょうか?
>まぁ、どちらかと言えば逆で、xlsxに統一する方が良さそうには思いますが。
あるソフトで出来上がるファイルがxlsxなんです。

>1シートずつコピーしても関数等の参照先が「元ブック」になるだけで、通常はエラー表示になることはないと思います。
すみません。やり方が間違っていました。

>その操作を『マクロの記録』で記録すれば、基本的なコードは得られると思います。
(一般化しないと使えない可能性は高いですが、方法はわかるはずです)
実際に記録させ、実行をやってみたのですが、実行されませんでした。
閉じてるブックを開くところがマクロには記録されてない部分と、シートの末尾にコピーするとしたのですがafter sheet(21)と記録され、実際は枚数が都度変化するのでこの部分も問題が出るのではと思っています。

教えていただいたコードはあとsub () ・・・end subをつければよいのでしょうか?(初歩的な質問ですみません)
コピー元のところにコピー元ブックの名前を入れ、Sheet1~Sheet3のところにシート名を入れてみたのですがうまくいきませんでした。

よろしくお願いいたします。

お礼日時:2017/06/28 11:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!