• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【VBA】シート順番に新規ブックにコピーする方法)

【VBA】シート順番に新規ブックにコピーする方法

このQ&Aのポイント
  • VBAを使用して、指定されたブック内の「入力用」以外のシートを新しいブックにコピーする方法について質問です。
  • 具体的には、1シートごとに新しいブックを作成し、値を貼り付け、ファイル名をシート名+mmdd形式で保存したいです。
  • また、ブック内の「入力用」以外のシートが今後増える可能性があるため、コードが柔軟に対応できるようにしたいです。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.5

回答No.3ですが、回答したマクロに誤記がありました。ごめんなさい。その他下記に差し替えておこなってください。 sub macro1r1()  dim w as worksheet  application.screenupdating = false  for each w in activeworkbook.worksheets   if w.name <> "入力用" then    on error goto errhandle    w.copy    on error goto 0    activesheet.usedrange.value = activesheet.usedrange.value    '下記一行誤記訂正。いわずもがなですが「正しい保存場所」にマクロを修正の事    activeworkbook.saveas filename:="C:\aaa\" & activesheet.name & format(date, "mmdd") & ".xls"    activeworkbook.close retpos:   end if  next  application.screenupdating = true  exit sub errhandle:  resume retpos end sub で。 >w.copyのところでエラー 単純なシートのコピーができない? マクロのせいだとはあんまり考えにくいです。 >このうち、"入力用"以外のシートに下記の処理をしたいのです。 たとえば「非表示にしたシート」がブックに含まれているとかかもしれません。

rihitomo
質問者

お礼

何度も投稿いただきありがとうございます。 おかげさまで解決いたしました。

rihitomo
質問者

補足

仰るとおりでした! 非表示にした"data"シートがありました。 正しくは "入力用"と"data"シート以外のシートに下記の処理をしたいのです。ということになります・・・

その他の回答 (5)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.6

>正しくは"入力用"と"data"シート以外のシートに下記の処理をしたいのです 回答No5で既に対処済みですが? (もっとも,あまりお薦めできる対処ではありませんでしたが) 敢えて「入力用とdataを除外」とだけ限定したいのでしたら,No.3のマクロをその旨修正するだけでも構いません。 if w.name <> "入力用" and w.name <> "data" then

rihitomo
質問者

お礼

No.3で既にできていました。 失礼しました。 そして複数条件の場合も教えていただきありがとうございます。

回答No.4

'シート(指定されたものを除く)をコピーし、それぞれ名前を変更してブックで保存する Option Explicit Sub CopySheetsEachBooks() 'Const xPath0 = "d:\tmp\" Const xPath0 ="C:\aaa\" Const xExcept = "入力用" Const xMode = False Dim xSheet As Worksheet Dim xPath As String Dim xName As String Dim xExtent As String Dim xLast As Long Dim nn As Long Debug.Print vbNewLine & Now & " :Here We 5!" Application.ScreenUpdating = False Application.DisplayAlerts = False xExtent = Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".")) If (xPath0 = Empty) Then xPath = (ThisWorkbook.Path & "\") Else xPath = xPath0 End If For Each xSheet In ThisWorkbook.Sheets If (xSheet.Name <> xExcept) Then '引数を省略すると、新規ブックが自動的に開いてシートだけがコピーされ、新規ブックがアクティブになる。当然、シートはソレだけ、、、 xSheet.Copy ActiveSheet.UsedRange.Clear Application.CutCopyMode = False xSheet.UsedRange.Copy With Range("A1") ' .PasteSpecial xlPasteValuesAndNumberFormats 'Excel2000はコォ~なっちゃう、、、 .PasteSpecial xlPasteFormats .PasteSpecial xlPasteValues End With 'ブック名を変更して保存 ActiveWorkbook.SaveAs Filename:=(xPath & xSheet.Name & Format(Date, "mmdd") & xExtent) ActiveWorkbook.Close End If Next Application.CutCopyMode = False Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub

rihitomo
質問者

お礼

ありがとうございます。 難しいコードがたくさんあるので自分でも勉強してみます!

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.3

シートをコピーし 値に直して(*) 名前を付けて保存する *:書式のみ用意した空の雛形シートを用意できていれば、雛形シートのコピー&値転記の手順にできます。 *:実は「入力用」シートにリンクする数式だけを値化すればよいだけなら、別の考え方もありますが今回はとりあえずそれは考えない事に。 sub macro1()  dim w as worksheet  application.screenupdating = false  for each w in activeworkbook.worksheets   if w.name <> "入力用" then    w.copy    activesheet.usedrange.value = activesheet.usedrange.value    activeworkbook.saveas filename:="C*\aaa\" & activesheet.name & format(date, "mmdd") & ".xls"    activeworkbook.close   end if  next  application.screenupdating = true end sub

rihitomo
質問者

お礼

何度も投稿いただきありがとうございます。 おかげさまで解決いたしました。

rihitomo
質問者

補足

ありがとうございます。 このコードですとw.copyのところで 実行時エラー'1004': 'Copy'メソッドは失敗しました:'_Worksheet'オブジェクト と出てしまいます。 何かこちらで指定してないことなどありましたでしょうか。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

手抜きのサンプルです。 保存前に同名ファイルの有無位はチェックした方が良いかな。 Sub test()   Dim objSh As Object   For Each objSh In ActiveWorkbook.Sheets     If objSh.Name <> "入力用" Then       objSh.Copy       Cells.Copy       Cells.PasteSpecial Paste:=xlPasteValues       Range("A1").Select             ActiveWorkbook.SaveAs Filename:="C:\aaa\" & objSh.Name & Format(Now(), "MMDD") & ".xls"       ActiveWindow.Close     End If   Next End Sub

rihitomo
質問者

お礼

ありがとうございます。 ↓の方の補足欄にも記入しておりますが、シートにはそれぞれ書式が設定されており、その書式は生かしたいのです。 説明不足で申し訳ありません。

  • gt-t
  • ベストアンサー率41% (7/17)
回答No.1

こんにちは、こんな感じで。 Sub qa8085962()  Dim lSNW As Long  Dim wbN As Workbook  Dim wsC As Worksheet  Dim strFPath As String  Dim strD As String  lSNW = Application.SheetsInNewWorkbook '現在の新規bookのシート数を確認  strFPath = "C:\aaa" '保存先  strD = Format(Now(), "MMdd") '今日の日付をMMDDに  Application.SheetsInNewWorkbook = 1 '新規bookのシート数を1に変更  For Each wsC In ThisWorkbook.Worksheets   If wsC.Name <> "入力用" Then    Set wbN = Workbooks.Add    wsC.Range(wsC.Range("a1"), wsC.UsedRange.Address).Copy    wbN.Worksheets(1).Range("a1").PasteSpecial Paste:=xlPasteValues    wbN.SaveAs Filename:=strFPath & "\" & wsC.Name & strD & ".xls", FileFormat:=56 'FileFormatはexcel2007以降用    wbN.Close    Set wbN = Nothing   End If  Next  Application.SheetsInNewWorkbook = lSNW '新規bookのシート数を元に戻す End Sub

rihitomo
質問者

お礼

シート名の取得はnameプロパティを使えばよかったんですね。 自分でも使っていながら気づきませんでした。ありがとうございます。

rihitomo
質問者

補足

失礼しました。 私の説明が悪かったです。 シートにはそれぞれ書式が設定されており、その書式は生かしたいのです。 ThisWorkbook.ActiveSheet.Copy で、新規ブックにペーストしてから、それを値に直す方法はありますでしょうか。 そして、excelのバージョンもお伝えしておりませんでした。 Excel2003になります。

関連するQ&A