
毎回、シート数が変動するEXCELファイルの、表示されているシートのみ(非表示シート有)を、
別のブックにコピーして、セルの書式と値を貼付けし、
元ファイルのシート名と同じシート名を付けたいのですが、
どんなVBAを組めば良いでしょうか?
下記の様に作成してみましたが、ファイル自体がコピペされてしまう様で、
自分のイメージした通りに動きません・・・。
ご教授の程、宜しくお願いいたします。
Sub データ書き出し()
Dim ws As Worksheet
Dim i As Long
With ActiveWorkbook
i = Worksheets.Count
For j = 1 To i
ThisWorkbook.Worksheets(j).Cells.Copy
.Worksheets(j).Range("A1").PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next j
Application.CutCopyMode = False
.SaveAs "月別DATA_"
End With
End Sub
No.3ベストアンサー
- 回答日時:
質問の文言と提示のコードには矛盾点、疑問点がありますが、
要するに以下のようなことですか?
元ブック : ThisWorkbook
コピー先 : まとめ.xls
だと仮定して、、
●元ブックの表示シートを"まとめ.xls"にコピーする
●コピーするときは、"まとめ.xls”に既にコピーしてあるシートの次からコピーする
(要するに、まとめ.xlsのシートはコピーするたびに増えていくということです)
●コピーは書式と値のみにする
●コピーしたシート名は、元ブックのシート名と同じにする
(ま、これはシートをコピーすればいいわけですが)
もし、このようなことなら以下のコードでもできます。
'--------------------------------------------
Sub test()
Dim MatomeBK As Workbook
Dim MotoBK As Workbook
Dim Sht As Worksheet
Set MotoBK = ThisWorkbook
Set MatomeBK = Workbooks("まとめ.xls")
For Each Sht In MotoBK.Worksheets
If Sht.Visible = True Then
Sht.Copy After:=MatomeBK.Worksheets(MatomeBK.Worksheets.Count)
ActiveSheet.Cells.Copy
ActiveSheet.Cells(1).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End If
Next Sht
'● MatomeBK.Close True 'まとめ.xls の上書き保存&CLOSE
End Sub
'----------------------------------------------------
それから、コピー先にコピー元と同じシート名があったらどうするかなど
処理の流れを実際に即しても少し詳しく説明する必要があるでしょう。
以上です。
ご回答ありがとうございました。
お返事が遅くなってしまい、申し訳ありません。
無事にマクロを実行することが出来ました。
ご親切に教えて頂き、ありがとうございました。
No.8
- 回答日時:
#07です
>セルの書式と値を貼付けし
の意味は迷いますね。
もし数式は値に置き換えて、なおかつ書式や列の幅は元のシートのままにするという意味であれば、マクロは以下になります
Sub Macro1()
Dim wkArray()
Dim idx, cnt As Integer
For idx = 1 To Worksheets.Count
If Worksheets(idx).Visible Then
cnt = cnt + 1
ReDim Preserve wkArray(1 To cnt)
wkArray(cnt) = Worksheets(idx).Name
End If
Next idx
Worksheets(wkArray).Copy
For idx = 1 To Worksheets.Count
Worksheets(idx).Cells.Copy
Worksheets(idx).Range("A1").PasteSpecial _
paste:=xlPasteValues
Application.CutCopyMode = False
Next idx
End Sub
ただしファイルのセーブまでは書いていませんがあしからず。
No.7
- 回答日時:
>セルの書式と値を貼付けし
これって値貼り付けではなく、普通のコピーでよいのですか?
表示されているシート(.Visible=True)のみを別ブックにコピーするマクロの例です。お試しください。
Sub Macro1()
Dim wkArray()
Dim idx, cnt As Integer
For idx = 1 To Worksheets.Count
If Worksheets(idx).Visible Then
cnt = cnt + 1
ReDim Preserve wkArray(1 To cnt)
wkArray(cnt) = Worksheets(idx).Name
End If
Next idx
Worksheets(wkArray).Copy
End Sub
No.6
- 回答日時:
#1です。
すみません。
値の貼り付けが意図的なものかと思っていました。
書式も貼り付けるのであれば
'Workbooks(NewWorkBookName).Worksheets(1).Range("A1").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False '貼付け
↑の部分を↓に変更してください。
Workbooks(NewWorkBookName).Activate
ActiveSheet.Paste '貼付け
本当は
'Workbooks(NewWorkBookName).Worksheets(1).Range("A1").Paste
としたいところですが
メソッドが対応していない為構文エラーになります。
No.5
- 回答日時:
#1です。
度々すみません。
解決になるか分かりませんが元々のプログラムを動作するように修正しました。
Sub データ書き出し()
Dim ws As Worksheet
Dim j As Integer
Dim ThisWorkBookName As String
Dim NewWorkBookName As String
Dim ThisSheetName As String
Dim FilePath As String
Dim InWorkSheetCount As String
InWorkSheetCount = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1 '新しいブックのシート数を1とする
FilePath = ActiveWorkbook.Path & "\" '起動パス
ThisWorkBookName = ActiveWorkbook.Name 'コピー元の名前を格納
Application.DisplayAlerts = False '警告表示しない
Application.ScreenUpdating = False '画面更新しない
For j = 1 To Worksheets.Count 'シートの数分ループ
Workbooks.Add '新しいブックの追加
NewWorkBookName = ActiveWorkbook.Name '新しいブックの名前を格納
Workbooks(ThisWorkBookName).Activate 'コピー元をアクティブ
ThisSheetName = ThisWorkbook.Worksheets(j).Name 'コピー元シート名を格納
ThisWorkbook.Worksheets(j).Cells.Copy 'シート内全コピー
Workbooks(NewWorkBookName).Worksheets(1).Range("A1").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False '貼付け
Workbooks(NewWorkBookName).SaveAs Filename:=FilePath & ThisSheetName & ".xls" '起動パスにシート名で保存
Workbooks(ThisSheetName & ".xls").Close 'コピー済ファイルを閉じる
Next j 'ループ 戻る
Application.DisplayAlerts = True '警告表示する
Application.ScreenUpdating = True '画面更新する
Application.CutCopyMode = False 'コピー解除
Application.SheetsInNewWorkbook = InWorkSheetCount '新しいブックのシート数を実行前に戻す
MsgBox ("完了")
End Sub
ご回答ありがとうございます。
お返事が遅くなり、申し訳ございません。
このマクロを実行しましたところ、シートごとに、セルの値のみが貼り付けられたブックが出来てしまいました。
私の勉強不足だと思うので、追々勉強して、絶対に実行させたいと思っております。
avanzato様には、環境のことからいろいろ教えて頂き、とても勉強になりました。
本当にどうもありがとうございました。
No.4
- 回答日時:
#1です。
そもそもこのエラーは構文の誤りで発生していると言うわけではありません。
コピーメソッドを使用するとメモリーを消費します。
この時のメモリーはパソコンの物理メモリー・仮想メモリーと言うことではなくエクセル自体が自己動作用に確保しているメモリーです。
このメモリーの開放方法は対象エクセル自体を終了することで開放されます。
出来たり出来なかったりというのはその時のエクセル使用可能メモリーの残量が影響しています。
参考URLの
If iCounter Mod 100 = 0 Thenはループの100回目と200回目にだけ処理を実行するという意味です。
質問者様が今回行おうとしている対象シートが100未満であればこのIFは全てFalseになります。
今回の場合、自己のシートをコピーしブックとして保存終了する為 参考URLはあまり意味が無かったかもしれません。
質問者様の対象ブックがどれだけの大きさでどのくらいメモリーを消費しているか分かりませんが、もし明らかに無理がある感じでしたら処理の流れ自体を変更する必要があります。
例
(1)
自己ブックの保存をする。
↓
自己ブックのコピーファイルAを作成する。
↓
(2)
Aを開く。
↓
(3)
Aのシートを順次「新規ブック」に「移動」し、シート名で保存終了する。
↓
Aが開かれているか監視
開かれていないのなら(4)へ進む
↓
実行エラー1004を監視
エラーが無ければ(3)に戻る
エラーがあればAを保存終了した後(2)に戻る
↓
(4)
Aを削除
↓
終了
と言った感じになります。
実際にプログラムを作ったわけではありませんので確実と言えるか分かりませんが・・・。
No.2
- 回答日時:
#1です。
そのエラーについての原因と対策はこちらになります。
http://support.microsoft.com/kb/210684/ja
上記サイトの最下部に対策が載っていますのでお試しください。
恐らくパッっと読んだだけでは意味が分からないかと思いますので熟読してください。
(私も最初意味が分かりませんでした。)
教えていただいたサイトを熟読し、サイトにあった下記の部分を私なりに組み合わせてみました。
『 'Uncomment this code for the workaround:
'Save, close, and reopen after every 100 iterations:
If iCounter Mod 100 = 0 Then
oBook.Close SaveChanges:=True
Set oBook = Nothing
Set oBook = Application.Workbooks.Open("c:\test2.xls")
End If』
が、ある時は1シートずつブックが作成され、ある時は同じエラーが出てしまい、
ある時はファイルが勝手に閉じてしまって・・・。
私の勉強不足なのは重々承知ですが、対応をお教え頂けませんか?
No.1
- 回答日時:
こんにちは。
前にも同じ質問があり回答をしましたがこちらでいかがでしょうか?
Sub Sample()
Dim FilePath As String
Dim ObjWorkSheet As Worksheet
Dim SheetNm As String
FilePath = ActiveWorkbook.Path & "\"
Application.DisplayAlerts = False
For Each ObjWorkSheet In Worksheets
SheetNm = ObjWorkSheet.Name
Sheets(SheetNm).Copy
ActiveWorkbook.SaveAs Filename:=FilePath & SheetNm & ".xls"
ActiveWorkbook.Close
Next
Application.DisplayAlerts = True
MsgBox ("完了")
End Sub
ご回答ありがとうございます。
VBA初心者の為、さらに質問させてください。
Sheets(SheetNm).Copy
の所で、『Worksheetクラスのcopyメソッドが失敗しました』というエラーが出てしまいます。
これは何が原因でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) 別ブックからシートのコピー 3 2022/04/01 20:07
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの選択範囲以外を削除...
-
Excel 関数を使ってデータと一...
-
Excelの行をコピーして貼り付け...
-
EXCELのVBAでシートコピーをし...
-
VBA シートをコピー後、ボタン...
-
EXCELで別のブックから式をコピ...
-
PDFファイルをコピーしてエクセ...
-
EXCELファイルをコピーすると終...
-
エクセルでシートを「移動また...
-
エクセルシートを別のエクセル...
-
エクセルマクロで上書きして貼...
-
【Excel VBA】シートコピー時、...
-
【VBA】コピー&複数個所のペー...
-
ExcelVBAで、ユーザーフォーム...
-
EXCEL2007でシートをコピーする...
-
エクセルのページをシートごと...
-
Excel 数式の保護をしたセルを...
-
エクセルVBA 1行飛ばしで転記す...
-
エクセルのワークシートをUSBメ...
-
エクセルの1シートの内容を複...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの選択範囲以外を削除...
-
Excel 関数を使ってデータと一...
-
EXCELのVBAでシートコピーをし...
-
Excelの行をコピーして貼り付け...
-
EXCELで別のブックから式をコピ...
-
Excel シートのコピーの際、ペ...
-
Excel 数式の保護をしたセルを...
-
エクセルの1シートの内容を複...
-
エクセルシートを別のエクセル...
-
エクセルでシートを「移動また...
-
エクセルのワークシートをUSBメ...
-
【VBA】コピー&複数個所のペー...
-
シートが保護されていないのに...
-
PDFファイルをコピーしてエクセ...
-
ExcelVBAで、ユーザーフォーム...
-
【Excel VBA】シートコピー時、...
-
エクセルVBA 1行飛ばしで転記す...
-
【エクセル】プルダウン設定の...
-
エクセルのページをシートごと...
-
ページの設定を別シートにコピ...
おすすめ情報