Excel VBAでワークシートをコピーするには、WorksheetオブジェクトのCopyメソッドを使う。最も基本的な書き方は Worksheets("Sheet1").Copy で、これだけでシート全体(セルの値・数式・書式・図形などを含む)を丸ごと複製できる。コピー先を指定したい場合は引数 After:= または Before:= を付け、別ブックへ複製することも可能である。本記事では、基本構文からコピー先の位置指定、コピー後のシート参照と名前変更、値だけのコピーとの違い、複数シートの一括コピー、そして実務でつまずきやすい落とし穴までを、最小限のコードとともに整理する。
| この記事の要点 |
|---|
|
基本:ワークシートをコピーする
ワークシートのコピーには、Worksheetオブジェクトに用意された Copy メソッドを使う。引数を一切指定しない場合、コピーされたシートは新しいブックとして開かれる。
|
' Sheet1 を新しいブックにコピーする Worksheets("Sheet1").Copy |
同じブックの中に複製を作りたい場合は、後述の After:= または Before:= を指定する。なお Worksheets("Sheet1") の代わりに、シートのインデックス番号(左から数えた位置)を使った Worksheets(1) や、シートのオブジェクト名を使った Sheet1 といった書き方でも同じ対象を指定できる。シート名は実行時に変更され得るため、堅牢にしたいときはオブジェクト名やインデックスを使う選択肢も検討するとよい。
コピー先の位置を指定する(After / Before)
同じブック内で、特定のシートの「後ろ」または「前」に複製を挿入したい場合は、引数 After:= または Before:= にコピー先の基準となるシートを渡す。After と Before は同時には指定できない。
|
' Sheet1 のコピーを Sheet1 の直後に挿入する Worksheets("Sheet1").Copy After:=Worksheets("Sheet1")
' Sheet1 のコピーを Sheet2 の直前に挿入する Worksheets("Sheet1").Copy Before:=Worksheets("Sheet2") |
ブックの末尾(いちばん右)に追加したい場合は、最後のシートの後ろを指定する。シート総数は Worksheets.Count で取得できる。
|
' Sheet1 のコピーをブックの末尾に追加する Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count) |
主な指定パターンを次の表にまとめる。
| 書き方 | コピー先 |
|---|---|
Worksheets("Sheet1").Copy |
新しいブックとして開く |
.Copy After:=Worksheets("Sheet2") |
Sheet2 の直後(同じブック内) |
.Copy Before:=Worksheets("Sheet2") |
Sheet2 の直前(同じブック内) |
.Copy After:=Worksheets(Worksheets.Count) |
ブックの末尾 |
.Copy Before:=Worksheets(1) |
ブックの先頭 |
コピー後のシートを参照する(ActiveSheet)
Copy メソッドの実行直後は、コピーによって新しく作られたシートがアクティブな状態になる。そのため、続けて ActiveSheet を参照すれば、いま作ったコピー先シートを操作できる。
|
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
' 直後はコピーで作られたシートがアクティブになっている ActiveSheet.Range("A1").Value = "コピーしました" |
後の操作で他のシートを選択する処理が入り得る場合は、コピー直後にオブジェクト変数へ控えておくと参照が安定する。
|
Dim ws As Worksheet Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count) Set ws = ActiveSheet
' 以降は ws で確実にコピー先シートを参照できる ws.Range("A1").Value = "コピーしました" |
コピーしたシートの名前を変更する
シート名は、Worksheetオブジェクトの Name プロパティに文字列を代入して変更する。コピー直後の ActiveSheet、または控えておいたオブジェクト変数に対して設定する。
|
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count) ActiveSheet.Name = "コピー結果" |
シート名にはExcelの仕様上の制約があり、すでに同じ名前のシートが存在する場合や、使用できない文字を含む場合はエラーになる。シート名に使えない文字や上限の長さなどの制約は後述のFAQでも触れる。
「値だけコピー」との違い(Range.Copy + PasteSpecial)
ここまでの Worksheet.Copy はシートそのものを増やす操作である。一方、「既存のシートに、別シートの計算結果の値だけを貼り付けたい」「数式ではなく確定値として残したい」という目的のときは、シートコピーではなくセル範囲のコピーを使う。Range.Copy でコピーし、貼り付け先で PasteSpecial を使うと、値・書式・数式などを選んで貼り付けられる。
|
' Sheet1 の A1:C10 の「値だけ」を Sheet2 の A1 起点に貼り付ける Worksheets("Sheet1").Range("A1:C10").Copy Worksheets("Sheet2").Range("A1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False ' コピーモードを解除 |
両者の使い分けの目安を次の表に示す。
| やりたいこと | 使うもの |
|---|---|
| シートを丸ごと複製してシート数を増やす | Worksheet.Copy |
| 既存シートに値だけ・書式だけを貼り付ける | Range.Copy + PasteSpecial |
PasteSpecial の主な貼り付け種別には、値のみの xlPasteValues、書式のみの xlPasteFormats、すべての xlPasteAll などがある。クリップボードを経由するため、貼り付け後は Application.CutCopyMode = False でコピーモードを解除しておくとよい。
ループで複数のコピーを作る
同じシートを複数枚に増やしたい場合は、繰り返し処理の中で Copy を呼び出す。名前が重複するとエラーになるため、ループ変数などを使ってシート名が一意になるようにするのが定石である。
|
Dim i As Long For i = 1 To 5 Worksheets("ひな型").Copy After:=Worksheets(Worksheets.Count) ActiveSheet.Name = "支店" & i Next i |
上の例では、「ひな型」シートをブック末尾に5枚コピーし、それぞれ「支店1」~「支店5」という名前を付けている。コピー先を毎回 After:=Worksheets(Worksheets.Count) にしているのは、ループのたびにシート総数が1枚ずつ増えるため、常にその時点での末尾を基準にして順番どおりに並べるためである。配列に用意した名前リストを使って、固定の名称を順に割り当てる書き方もよく用いられる。多数のコピーを作るときは、後述の ScreenUpdating を併用すると動作が速くなり、画面のちらつきも抑えられる。
つまずきやすい落とし穴
| よくある落とし穴と対処 |
|---|
|
画面更新の抑制とエラー処理を組み合わせた、実務向けのひな型を示す。
|
Sub CopySheets() Dim i As Long Application.ScreenUpdating = False On Error GoTo Cleanup
For i = 1 To 3 Worksheets("ひな型").Copy After:=Worksheets(Worksheets.Count) ActiveSheet.Name = "資料" & i Next i
Cleanup: Application.ScreenUpdating = True End Sub |
よくある質問(FAQ)
Q. コピーしたシートを必ず末尾(いちばん右)に置くには?
A. After:=Worksheets(Worksheets.Count) を指定する。Worksheets.Count はシートの総数を返すため、Worksheets(Worksheets.Count) は常にいちばん右のシートを指す。その「後ろ」に挿入することで、コピーは必ず末尾に置かれる。
Q. 別のブックへシートをコピーするには?
A. After:= または Before:= に、宛先ブックのシートを指定する。たとえば Worksheets("Sheet1").Copy After:=Workbooks("別ブック.xlsx").Worksheets(1) のように書く。宛先ブックはあらかじめ開いておく必要がある。引数を省略した Worksheets("Sheet1").Copy は、コピー内容を中身とする新しいブックを作る動作になる。
Q. シート名に使えない文字や長さの制限はある?
A. シート名にはExcelの仕様上の制約があり、長さの上限があるほか、: \ / ? * [ ] といった文字は使用できない。これらを含む名前や、空文字、既存シートと同じ名前を Name に設定しようとすると実行時エラーになる。ユーザー入力などからシート名を組み立てる場合は、禁止文字を除去・置換してから設定すると安全である。
Q. コピーすると数式の参照先がずれない?
A. シートを丸ごとコピーした場合、シート内のセル同士を参照する数式はコピー先シート内で完結するよう調整される。一方、他のシートを名前で参照している数式は、参照先のシート名がそのまま保持される。意図と異なる参照になっていないか、コピー後に重要なセルを確認するとよい。
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38