may the VBA be with you

Excel VBAとか業務自動化とか

VBAなんだかんだ その3 新しく作ったブックにシートをコピーして保存して閉じる

やりたいこと

「Workbooks.Add」で新規に作ることができ、
vba-belle-equipe.hatenablog.com
vba-belle-equipe.hatenablog.com
ができるようになったので、そこまでを通しでいってみましょう。

つなげて書いてみる

Sub test()
  Workbooks.Add
  Workbooks("コピー元.xlsx").Worksheets(1).Copy After:=Workbooks("Book2").Worksheets(1)
  Workbooks("Book2").SaveAs Filename:="C:\test\test.xlsx"
  Workbooks("Book2").Close
End Sub

どうでしょうか。

テスト

インデックスが有効範囲にありません。

おや。例のやつですね。

よく見ると、新規に作ったブックが「Book1」になっています。

2回目に作ったら「Book2」になるようですが、書き方を考えないといけませんね。

新規作成したブックを指定する

「workbooks.addしたブックの名前を取得」あたりで検索しましょう。

  Dim wb As Workbook
  Set wb = Workbooks.Add
  'ブックの名前= wb.name

作成すると同時に変数に入れるか

  Dim wbName As String
  Workbooks.Add
  wbName = ActiveWorkbook.Name
  'ブックの名前= wbName

作成されたものを「ActiveWorkbook」で指定することもできるみたいですね。

やり直し

Sub test()
  Dim wb As Workbook
  Set wb = Workbooks.Add
  Workbooks("コピー元.xlsx").Worksheets(1).Copy After:=Workbooks(wb.name).Worksheets(1)
  Workbooks(wb.name).SaveAs Filename:="C:\test\test.xlsx"
  Workbooks(wb.name).Close
End Sub

と、

Sub test()
  Workbooks.Add
  Workbooks("コピー元.xlsx").Worksheets(1).Copy After:=ActiveWorkbook.Worksheets(1)
  ActiveWorkbook.SaveAs Filename:="C:\test\test.xlsx"
  ActiveWorkbook.Close
End Sub

どっちもいけますね。

シートの位置が気になる

いけました、が、

ファイルの名前 シート
test.xlsx Sheet1コピー元1 Sheet2 Sheet3

なんとなくシートが入る位置に違和感がありますね。

  Worksheets(1).Copy After:=Worksheets(0)

インデックスが有効範囲にありません。

さすがにダメですか。

やり直し

vba ワークシート コピー 左端」でいってみましょう。

  Worksheets(1).Copy Before:=Worksheets(1)

「Before」でよかったんや。

完成

ということで、

Sub test()
  Workbooks.Add
  Workbooks("コピー元.xlsx").Worksheets(1).Copy Before:=ActiveWorkbook.Worksheets(1)
  ActiveWorkbook.SaveAs Filename:="C:\test\test.xlsx"
  ActiveWorkbook.Close
End Sub

「新しく作ったブックにシートをコピーして保存して閉じる」をクリアです。