更新日:、 作成日:

VBA シートをコピーする

はじめに

Excel VBA マクロでシートをコピーする方法を紹介します。

Sheets.Copy または Worksheets.Copy メソッドから、シートをコピーできます。

位置を指定したり、別ブックなどにコピーできます。

シートを追加するには「シートを追加する」をご覧ください。
シートを指定して取得するには「シートを取得する」をご覧ください。

シートをコピーする

sheet1

Sheets の引数にインデックスかシート名を指定すると、そのシートをコピーできます。

1 番左のシートをコピーするには Sheets(1).Copy または Worksheets(1).Copy を入力します。1 番左のシートが 1 です。

Sheets(1).Copy        ' 1 番左のシートをコピー
Sheets("Sheet1").Copy ' シート「Sheet1」をコピー

Worksheets(1).Copy        ' 1 番左のシートをコピー
Worksheets("Sheet1").Copy ' シート「Sheet1」をコピー

コピーしたシートを持つ新しいブックが作成されアクティブになります。

4

同じブックの位置を指定

位置を引数で指定して、同じブックにコピーできます。

引数には次のものがあり、すべて省略できます。

引数「Before」指定したシートの左側にコピーします。引数「After」と一緒に指定できません。
引数「After」指定したシートの右側にコピーします。引数「Before」と一緒に指定できません。
Call Sheets(1).Copy(Before:=Sheets(2))       ' 2 番目のシートの左側にコピー
Call Sheets(1).Copy(After:=Sheets("Sheet2")) ' シート「Sheet2」の右側に追加
5

Sheets と Worksheets の違いはワークシート以外を取得するかどうかです。

  • Sheets:すべてのシートを取得
  • Worksheets:ワークシートのみ取得(グラフシートなどは取得しない)

このため グラフシートなどは Worksheets.Copy ではコピーできません。

1 番左や右にコピー

シートを 1 番左にコピーするには、引数に Before:=Sheets(1) を入力します。

シートを 1 番右にコピーするには、引数に After:=Sheets(Sheets.Count) を入力します。

Call Sheets(1).Copy(Before:=Sheets(1))           ' 1 番左にコピー
Call Sheets(1).Copy(After:=Sheets(Sheets.Count)) ' 1 番右にコピー

複数のシートをコピー

1 番目と 2 番目のシートをコピーするには Sheets(Array(1, 2)).Copy または Sheets(Array("Sheet1", "Sheet2")).Copy のように入力します。

Sheets(Array(1, 2)).Copy               ' 1 番目と 2 番目のシートをコピー
Sheets(Array("Sheet1", "Sheet2")).Copy ' シート「Sheet1」と「Sheet2」をコピー

Worksheets(Array(1, 2)).Copy               ' 1 番目と 2 番目のシートをコピー
Worksheets(Array("Sheet1", "Sheet2")).Copy ' シート「Sheet1」と「Sheet2」をコピー

引数に配列でインデックスやシート名を指定します。

すべてのシートをコピー

すべてのシートをコピーするには Sheets.Copy または Worksheets.Copy を入力します。

Call Sheets.Copy
Call Worksheets.Copy

コピーしたシートを編集する

コピーしたシートはアクティブになります。ActiveSheet でアクティブシートを取得できます。

Call Worksheets(1).Copy(After:=Worksheets(1))
Dim ws As Worksheet
Set ws = ActiveSheet ' コピーしたシートがアクティブになっている

' そのシートに対して編集
ws.Name = "コピー"
6

アクティブシートをコピーする

アクティブシートをコピーするには ActiveSheet.Copy を入力します。

Call ActiveSheet.Copy
Call ActiveSheet.Copy(After:=ActiveSheet) ' アクティブシートの右にコピー

アクティブシートとは、開いているシートのことです。

選択シートをコピー

アクティブブックの選択しているシートをコピーするには ActiveWindow.SelectedSheets.Copy を入力します。複数のシートが選択されているときは、そのすべてのシートをコピーします。

Call ActiveWindow.SelectedSheets.Copy           ' 選択しているすべてのシートをコピー
Call ActiveWindow.SelectedSheets(1).Copy        ' 選択している 1 番左のシートをコピー
Call ActiveWindow.SelectedSheets("Sheet2").Copy ' 選択しているシート「Sheet2」をコピー

VBA を実行しているブックの選択しているシートをコピーするには ThisWorkbook.Windows(1).SelectedSheets.Copy を入力します。

' このコードを実行しているブックの選択シートをコピー
Call ThisWorkbook.Windows(1).SelectedSheets.Copy
' このコードを実行しているブックにコピー
Call ThisWorkbook.Windows(1).SelectedSheets.Copy(After:=ThisWorkbook.ActiveSheet)

' 開いているブック「Book1.xlsx」の選択シートをコピー
Call Workbooks("Book1.xlsx").Windows(1).SelectedSheets.Copy

SelectedSheets のインデックスは、選択している中で 1 番左のシートが 1 です。

ブックの指定について詳しくは下記の「別ブックのシートをコピーする」をご覧ください。

新しいブックを保存

コピーして作成されたブックはアクティブになります。ActiveWorkbook でアクティブブックを取得できます。

Application.DisplayAlerts = False ' メッセージを非表示

Call Worksheets(1).Copy   ' 新しいブックにコピー
Call ActiveWorkbook.SaveAs("D:\NewBook.xlsx", xlOpenXMLWorkbook) ' 名前を付けて保存
Call ActiveWorkbook.Close ' 新しいブックを閉じる

Application.DisplayAlerts = True  ' メッセージを表示
ブックを保存するには「ワークブックを保存する」をご覧ください。

別ブックのシートをコピーする

ブックを指定しないシートの操作はすべて「アクティブブック」に対して行われます。

  • アクティブブック:開いているすべてのブックの中で一番手前に表示されているブックです。
  • VBA を実行しているブック:実行している VBA のコードがあるブックです。

アクティブブック

ブックを指定しないシートの操作は、アクティブブックを表す ActiveWorkbook. が省略されています。

' どちらも同じコード
Call Sheets.Add
Call ActiveWorkbook.Sheets.Add
ショートカットや VBA の IDE から実行したときに、別ブックがアクティブになっていることがあります。

VBA を実行しているブック

VBA を実行しているブックに対して操作するには ThisWorkbook を入力します。

' VBA を実行しているブックに対して操作
Call ThisWorkbook.Sheets.Add
Call ThisWorkbook.Worksheets.Add

ブックを指定

ブックを指定するには Workbooks の引数にブック名またはインデックスを指定します。

ブック「Book2.xlsx」を指定するには Workbooks("Book2.xlsx") を入力します。

' ブック「Book2.xlsx」のシート「Sheet2」の前にコピー
Call Sheets(1).Copy(Before:=Workbooks("Book2.xlsx").Sheets("Sheet2"))

' 2 番目のブックの 2 番目のシートの後ろにコピー
Call Sheets(1).Copy(After:=Workbooks(2).Sheets(2))

Workbooks のインデックスは、ブックを開いた順番に 1 からスタートします。