- ベストアンサー
Excel VBA 複数のブックの複数シートからデータをコピーするマクロの作成方法
- Excel VBAを使用して、複数のブックの複数シートからデータをコピーするマクロを作成しましたが、上手く動作しません。データの貼り付け部分に問題があり、訳の分からないデータが貼り付けられてしまいます。
- 質問者はVBA初心者であり、どこが間違っているのかわからない状況です。正しく動作させるための教えていただきたいです。
- 以下は質問者のやりたいことです。同じフォルダ内に複数のExcelファイルがあり、各ファイルには複数のシートがあります。各シートの構造は同じです。VBAを保存してあるExcelファイルも同じフォルダに置かれています。質問者は、指定したシートと範囲のデータを日付を付けた新しいシートにコピーしたいと思っています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
回答が遅くなりました。 もう自己解決されてるかもしれませんが、一応。 > 下記のように変更するだけでは動かないのです。 > 原.Cells(数, "H").Value = コピー.Range("B1:B6").Value 6個の値をどのように入れようとされているのか分かりませんが、もし元と同じ並びのまま入れるのなら、行数・列数をもとの範囲と合わせる必要があります(上記の例だと"B1:B6"なので6行1列)。 コードの書き方は色々でしょうが、上記例に近い形を取るなら 原.Cells(数, "H").Resize(6, 1).Value = コピー.Range("B1:B6").Value など。 もし縦横を入れ替える必要があるのなら、この書き方ではできません。 複数を一度に代入するのはあきらめてもとの質問のコードのように一つずつ入れていくか、次のようにコピー&ペーストの機能を利用して縦横を入れ替えるのが楽だと思います。 コピー.Range("B1:B6").Copy 原.Cells(数, "H").Resize(1, 6).PasteSpecial Paste:=xlPasteValues, Transpose:=True ここで、"Transpose"が縦横入れ替えのオプションです。
その他の回答 (3)
- puddingeater
- ベストアンサー率77% (28/36)
> 1.ご指摘のシートデータクリアなのですが、エラーになってしまうため、 > 原.Cells(2,1).Rsize(Rows.Count-1,Columns.Count).ClearContents Rsize でなく Resize です。 それから、混乱を避らすため"原."を付けるかどうか統一しておいた方がいいと思います。 Cells(2,1).Rsize(Rows.Count-1,Columns.Count).ClearContents にするか、 原.Cells(2,1).Rsize(原.Rows.Count-1,原.Columns.Count).ClearContents にするか。 > 2.いくつか除きたいシートをはずすマクロを作成したのですが、これはスルーされてしまいます。 >If コピー.Name<>"はじめに" Or コピー.Name<>"TAB" Then この場合<>を使うならOrでなくAndです。 If コピー.Name<>"はじめに" And コピー.Name<>"TAB" Then > また、シートどうやらもう一つ非表示(別表1)があり、全部で3つのシートを除きたいです。 表示しているシートでも非表示のシートでもやり方は同じです。 他の2つの条件に And コピー.Name<>"別表1" を付け足したらいいです。 > 3.ファイルですが、どうやら開いて作業しているThisWorkbookを再度読み込んでしまうので もとの質問にある、 > If フォルダ <> 集.Name Then 'book名がこのbookの名前でなければ これで集ファイルが除けるはずなのですがうまくいきませんか? 条件を増やしたらおかしくなったということでしょうか。 JEも除くのはシート名の判定と同じくJEのファイル名を条件に付け足すだけです。 If フォルダ <> 集.Name And フォルダ <> "JEまとめ.xls" Then それからNo2でうっかりForの直前に 数 = 1 を書いてますが、もう場所を直してもらってますかね。 Do Until より上にしてないとブックごとに"数"がリセットされてうまくいってないと思います。
補足
色々とアドバイスありがとうございます。 とっても助かりました。 問題なく動きました。 また、別の質問なのですが、このマクロを利用して(条件は同じ)今度は列単位のコピーをしたいのですが、下記のように変更するだけでは動かないのです。 何度もすみませんが、また、アドバイスいただけるとうれしいです。 With WorksheetFunction 原.Cells(数, "H").Value = コピー.Range("B1:B6").Value 原.Cells(数, "H").Value = コピー.Range("B10:B20").Value End With
- puddingeater
- ベストアンサー率77% (28/36)
おそらく"For 終" のループは要りません。 ------------------------------------- For 終 = 1 To 紙 数 = 数 + 1 'シートループ処理 For Each コピー In 開.Worksheets -------------------------------------- ここはこうしたかったんじゃないかと思います。 -------------------------------------- 'シートループ処理 数 = 1 For Each コピー In 開.Worksheets 数 = 数 + 1 -------------------------------------- それと、実行時に当日のシートが既にあった場合は使いまわしていますが、シート内容をクリアしなくても大丈夫でしょうか。 一度実行した後、フォルダ内のxlsファイルを減らしてから再実行すると前の結果が一部残ってしまうと思います。
補足
7981785さま アドバイスありがとうございます。 アドバイスにしたがって色々模索した結果、何とか使えるようになりました。 ありがとうございました。 ただ、まだいくつかの問題は残っていて、その部分について追加マクロをいただけないでしょうか。 問題は3つです。 1.ご指摘のシートデータクリアなのですが、エラーになってしまうため、はずしたのですが、出来れば入れたいのです。何がダメなのでしょうか。 '存在する場合はシートデータクリア 原.Cells(2,1).Rsize(Rows.Count-1,Columns.Count).ClearContents 2.いくつか除きたいシートをはずすマクロを作成したのですが、これはスルーされてしまいます。 If コピー.Name<>"はじめに" Or コピー.Name<>"TAB" Then また、シートどうやらもう一つ非表示(別表1)があり、全部で3つのシートを除きたいです。 どんなマクロを使ったらよいのでしょうか。 3.ファイルですが、どうやら開いて作業しているThisWorkbookを再度読み込んでしまうので(メッセージが出ます)、エラーになっているので、何とかしたいのです。 同じフォルダーに入っている除きたいファイルは2つあります。 集ファイル(ThisWorkbook)とjeという名前のファイルです。 何卒、アドバイス宜しくお願いいたします。 木村
- bin-chan
- ベストアンサー率33% (1403/4213)
パッと見ですが、複数のブック間でデータを扱うわりには 「xxのブックを指定する」が定義されていないように思います。 シートをselectする行の直前で、目的のブックを指定(select)する行を 加えてみてはいかが?
補足
bin-chanさま アドバイスありがとうございます。 折角アドバイスいただいたのですが、VBAを今回初めて書いたためいまひとつ解らないのです。 出来れば、追加のマクロをいただけると嬉しいです
お礼
本当に色々とアドバイス下さり、 ありがとうございました。 とっても助かりました。 また、何かございましたら、宜しくお願いいたします。