みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3ワークシート

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

投稿日時 - 2012-05-28 22:05:53

QNo.7501821

困ってます

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

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめる。
 新規ブックのオープンをtestwriteを呼ぶ前に1度だけ行い、
 testwriteの中ではその新規ブックに対してシートを追加していく。
 そしてtestwriteの処理が全部終わったら、
 新規ブックの全シートを1度に「記録シートYYYY/MM/DD.xls」にコピーする。

それでも駄目でしたら、以下の回答No.1を試してみてください。
http://okwave.jp/qa/q1822561.html

投稿日時 - 2012-05-30 23:22:30

補足

連絡が遅くなり、真に申し訳ありません。

プログラムの初めにBOOKオブジェクトを作成し
全てのワークシートをコピーする処理を全て終えてから
プログラムの終わりでBOOKの保存を行ったら

無事、処理が終了しました。

何回も助けて頂き、有難うございました。
大変、勉強になり、助かりました。

貴重な時間を割いて頂きまして
有難うございました、お世話になりました。

投稿日時 - 2012-07-10 21:44:22

お礼

何回も回答ありがとうございます。

非常に助かり、勉強になりました。

時間の都合で解決するのに時間が約一週間程かかりそうです。
何回も見に来て頂いてると申し訳ないので。

評価の方も遅れて申し訳ありません。


解決次第、ここにまた連絡させて頂きます。

機会があり、宜しければ、また宜しくお願いいたします。

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

助かりました。

投稿日時 - 2012-05-31 22:48:43

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

確認ですが、このtest_write()は、
For文の中でワークシート数の回数だけ呼ばれるようになってますか?

だとすると、このtest_write()の中で
・ワークブック追加
・そのワークブックをbooknameという名前で保存
という処理を行ってしまうと、
test_write()が行われるたびに
・新しいワークブックを開いて、そこにsheetnameという名前のシートを追加
・そのワークブックをbooknameという名前で新規保存/上書き保存
という処理をしていることになります。
やっぱり上書きですね。

それを避けるためには、
・test_write()の最初ではWorkbooks.Addを行わない
・If Bookkensaku(bookname) = True Then
 の下でWorkbooks.Open()を実行
・上記のIf文に対応するElseの下でWorkbooks.addを実行
で、いけると思います。

投稿日時 - 2012-05-30 01:31:15

お礼

詳細な回答有難うございます。

workbookをaddしbookを保存した後の

bookが存在する場合にシートをコピーする

mastersheet.Copy after:=cbook.worksheets(cbook.worksheets.Count)

の所でオートメーションエラーがでます。

考えられる原因が

複数のセル・シートを何回もコピーする場合にでるらしいです。


一度、コピーしたいシートを配列に入れるなどして対処できるみたいなのですが。
ワークシート自体をコピーしたいので
配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

Redim wsheetdata() as worksheets

ワークシートの配列にデータを入れて

for i = 0 to 10

wsheetdata(i).copy after:=cbook.worksheets(cbook.worksheets.Count)


Next i

ご教授宜しくお願いします。

投稿日時 - 2012-05-30 21:32:45

ANo.1

そうですね、多分上書きされてますね。

回答者側がソースコードを1から考えて提示するより、質問者さまが作られたソースコードを提示していただければ、何が問題か分かりやすいですし、お互い勉強になると思うのですが、いかがでしょう?

投稿日時 - 2012-05-29 02:16:04

補足

回答ありがとうございます。

そうですね、提示した方が勉強になると思います。

申し訳ありません。


ソースコードの一部を提示します。

Sub testwrite(ByVal wflag As String)
Dim cbook as workbooks
Dim mastersheet as worksheets
Dim bookname sheetname as string
Dim hizuke as date

Set cbook = Workbooks.Add
Select Case wflag

Case 処理1
処理1実行

Case 処理2
 
        処理2実行
End Select
  
   hizuke = date      
      
bookname = "記録シート" & Format(hizuke, "long date") & ".xls" 保存するBOOK名
sheetname = mastersheet.Range("h1").Value シート名の変更に使います。

   If Bookkensaku(bookname) = True Then 
      ↑ Bookkensaku BOOKが存在するか探してあるならTRUEを返しています。

   BOOKがあって上書きする処理です。
     
mastersheet.Copy after:=cbook.worksheets(cbook.worksheets.Count)
cbook.ActiveSheet.Name = sheetname
cbook.Save Filename:=bookname

Else
新規にBOOKを作成して作るときの処理です。

mastersheet.Copy after:=cbook.worksheets(cbook.worksheets.Count)
cbook.ActiveSheet.Name = sheetname
cbook.SaveAs Filename:=bookname



上書きも新規の状態のmastersheet.Copyメソッドでワークシートが上書きされてしまいます。
上記の処理をFor ~ NEXTで何回も処理しワークシートを追加コピーしていき
BOOKを保存する処理を作りたいと思います。

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

投稿日時 - 2012-05-29 22:29:28

お礼

回答ありがとうございます。
助かります。

ご教授よろしくお願い致します。

投稿日時 - 2012-05-29 22:31:20

あなたにオススメの質問