シートを新規ブックにコピーする手順
Excel上でシートを新規ブックにコピーする場合、シートを右クリックして「移動またはコピー」ダイアログで、「新しいブック」を選択して、「コピーを作成する」にチェックしてOKを押せば、新規ブックにシートがコピーされた状態で作成されます。
これをVBAで実施する場合には、「新規ブックの作成」と「作成した新規ブックへのシートのコピー」の2つの処理が必要です。
・VBAでブックの新規作成を行う(Workbooks.Add)
・VBAでシートのコピーを行う(Worksheet.Copy)
それぞれの詳細については上記に書いていますが、以下では「新規ブックの作成」と「新規ブックへのシートのコピー」の2つの処理を合わせて書く場合はどう書いたらについて順を追って説明します。
新規ブックの操作はWorkbookオブジェクトを利用する
新規ブックの作成は「Workbooks.Add」メソッドで行います。
「Workbooks.Add」メソッドは、戻り値として作成した新規ブックのWorkbookオブジェクトが返ります。
新規ブックに対する操作を行う場合は、以下のように「Workbooks.Add」メソッドの戻り値を取得しておく必要があります。
1 2 3 4 5 6 |
Sub WorkbookAdd() Dim wbNew As Workbook '// 新規ブック '// 新規ブックの作成 Set wbNew = Workbooks.Add End Sub |
アクティブブックのシートを新規ブックにコピーする
上記のように、作成した新規ブックのWorkbookオブジェクトを保持したあと、他のブックからシートをコピーするには「Workbook.Worksheets.Copy」メソッドを使います。
「Workbook.Worksheets.Copy」メソッドはWorksheetsオブジェクトを指定しており、なんらかのブック(Workbook)のシートであることを指定する必要があります。
以下はマクロを実行したときのアクティブブックの一番左のシートを、新規ブックにコピーする場合のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub CopySheetToNewBook() Dim wbActive As Workbook '// アクティブブック '// アクティブブックをWorkbookオブジェクトにセット Set wbActive = ActiveWorkbook Dim wbNew As Workbook '// 新規ブック '// 新規ブックの作成 Set wbNew = Workbooks.Add '// アクティブブックの一番左のシートを、新規ブックの一番右のシートとしてコピー Call wbActive.Worksheets(1).Copy(After:=wbNew.Worksheets(wbNew.Worksheets.Count)) '// シート名を指定したい場合 'Call wbActive.Worksheets("Sheet1").Copy(After:=wbNew.Worksheets(wbNew.Worksheets.Count)) '// 一番右のシートをコピーしたい場合 'Call wbActive.Worksheets(wbActive.Worksheets.Count).Copy(After:=wbNew.Worksheets(wbNew.Worksheets.Count)) End Sub |
アクティブブックのコピーするシートを名前で指定したい場合は「Call wbActive.Worksheets(1).Copy」の部分を「Call wbActive.Worksheets(“Sheet1”).Copy」のように””でシート名を指定します。1と書くと一番左のシートで、wbActive.Worksheets.Countと書くと一番右のシートを指定できます。
上のコードではWorkbookオブジェクトを2つ用意しています。1つはコピー元のアクティブブック用で、もう1つが新規ブック用です。新規ブック用は先のサンプルコードと同じです。
シートのコピーは、「どのブックからどのブックへコピーするのか?」という点が大事になってきます。
そのため、まずコピー元のアクティブブックのWorkbookオブジェクトを保持しています。
そして、新規ブックを作成し、保持しておいたアクティブブックのシートを新規ブックにコピーしています。
Copyメソッドの引数にAfterを指定していますが、これは、Afterで指定したシートの右側にコピーする、という意味になります。Before:=で指定すれば左側になります。
引数の設定方法などは「VBAでシートのコピーを行う(Worksheet.Copy)」に詳しく書いています。
アクティブブックのシートをコピーする場合の注意点
アクティブブックのシートをコピーする場合の注意点が1つあります。
上記コードでは、まずアクティブブックのWorkbookオブジェクトを取得し、そのあとに新規ブックの作成(Workbook.Add)を行っていますが、この順序であることが大事になってきます。
Workbooks.Addメソッドで新規ブックを作成すると、作成した新規ブックがアクティブになります。この時点で元々アクティブだったブックがアクティブブックではなくなります。
そのため、コピー元のブックがアクティブブックであることを前提とするようなコードを書く場合には、新規ブックを作成する前にコピー元ブックのWorkbookオブジェクトを取得しておく必要があります。
後述しますが、アクティブブックではなくブックのファイル名でもコピー元ブックを指定することは可能ですので、この問題はアクティブブックをコピー元にする場合のみ考慮する内容です。
開いている既存ブックのシートを新規ブックにコピーする
上のコードはアクティブブックのシートをコピーする場合ですが、開いているブックの名前を指定することも可能です。
「Workbooks(“開いているブック名”)」で指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub CopySheetToNewBook2() Dim wb As Workbook '// コピー元ブック '// コピー元ブックをWorkbookオブジェクトにセット Set wb = Workbooks("abc.xlsx") Dim wbNew As Workbook '// 新規ブック '// 新規ブックの作成 Set wbNew = Workbooks.Add '// コピー元ブックの一番左のシートを、新規ブックの一番右のシートとしてコピー Call wb.Worksheets(1).Copy(After:=wbNew.Worksheets(wbNew.Worksheets.Count)) End Sub |
この書き方は開いているブックであることが前提です。開いていない場合はエラーになります。
開いていないブックのシートを新規ブックにコピーする
開いていないブックのシートをコピーする場合は、一度そのブックを開く必要があります。そして処理が終わったらブックを閉じます。
以下はブックパスを指定してWorkbooks.Openメソッドを使ってブックを開き、その戻り値として開いたブックのWorkbookオブジェクトを取得しています。あとは上のサンプルコードと同じです。
新規ブックに自動生成されるSheet1シートはいらないので削除する処理も追加しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub CopySheetToNewBook3() Dim wb As Workbook '// コピー元ブック Dim sFilePath As String '// ブックのファイルパス sFilePath = "D:\test\abc.xlsx" '// コピー元ブックを開き、Workbookオブジェクトにセット Set wb = Workbooks.Open(sFilePath) Dim wbNew As Workbook '// 新規ブック '// 新規ブックの作成 Set wbNew = Workbooks.Add '// コピー元ブックの一番左のシートを、新規ブックの一番右のシートとしてコピー Call wb.Worksheets(1).Copy(After:=wbNew.Worksheets(wbNew.Worksheets.Count)) '// Sheet1シートを削除 Application.DisplayAlerts = False Call wbNew.Worksheets("Sheet1").Delete Application.DisplayAlerts = True '// 開いたブックを閉じる Call wb.Close End Sub |
新規ブックからSheet1を削除
新規ブックを作成すると、”Sheet1″シートが作成されます。
作成されるシートの数はExcelの設定によって異なりますが、Microsoft365の標準設定では”Sheet1″シートが作成されます。古いExcelの場合は3つシート作成されます。
他のブックから新規ブックにシートをコピーした場合、”Sheet1″シートは不要なことがほとんどだと思いますので、削除したい場合には上のサンプルのように、”Sheet1″シートの削除を行います。
なお、単純にWorksheets.Deleteメソッドを実行すると、Excel上でシートを削除するときと同じように「削除しますか?」というダイアログが出ますが、VBAで自動化する場合は邪魔なのでApplication.DisplayAlerts = Falseで表示しないようにしています。
1 2 3 4 |
'// Sheet1シートを削除 Application.DisplayAlerts = False Call wbNew.Worksheets("Sheet1").Delete Application.DisplayAlerts = True |