VBAで自動化 VBA一覧 シート追加 セル・シート・ブック操作

【VBA】複数シートを一括追加する方法|複数枚の作成と実務での使い分け

Excel VBAで帳票や作業用シートを自動作成していると、「新しいシートを1枚追加する」のではなく、複数のシートをまとめて追加したい場面があります。

たとえば、月次処理の開始時に作業用シートを3枚準備したり、入力用・確認用・出力用といった複数のワークシートを一度に作成したりするケースです。

VBAではWorksheets.Addを繰り返し実行することでも複数シートを作成できますが、追加する枚数が決まっている場合は、Count引数を指定して一括追加する方法もあります。

ただし、単純に「複数枚追加できればよい」と考えると、追加位置やシート名、その後の処理で扱うシートを正しく特定できず、思わぬシートを操作してしまうことがあります。

この記事では、VBAで複数のシートを追加する基本から、一括追加と繰り返し処理をどのように使い分けるべきかまで、実務で扱いやすい考え方とあわせて解説します。

✅ VBAで複数シートを一括追加する基本

VBAで複数のシートを追加するときに最初に理解しておきたいのが、Worksheets.Addでは1枚ずつ追加するだけでなく、複数枚をまとめて追加できるという点です。複数枚だからといって、必ずFor文を使わなければならないわけではありません。特に追加枚数が最初から決まっている処理では、Countを指定した方がコードを簡潔にできます。

一方で、一括追加とループによる追加は、できることが完全に同じというわけではありません。後からシートごとに名前や設定を変更する場合は、追加後の扱い方まで考えて方法を選ぶ必要があります。ここを区別しておくと、必要以上に複雑なコードを書かずに済みます。

・Worksheets.Addで複数枚をまとめて追加する方法

Worksheets.Addには、追加するワークシートの枚数を指定するCount引数があります。

たとえば、現在のブックへワークシートを3枚追加するだけであれば、次のように記述できます。

Sub AddMultipleWorksheets()

    ' ワークシートを3枚まとめて追加
    Worksheets.Add Count:=3

End Sub

このコードを実行すると、ワークシートが3枚追加されます。

Worksheets.Addを3回記述する必要はありません。

基本的な流れは次のとおりです。

  1. VBAエディターを開く
  2. 標準モジュールにコードを記述する
  3. Worksheets.AddのCountに追加したい枚数を指定する
  4. マクロを実行する
  5. 指定した枚数のワークシートが追加されたことを確認する

追加枚数が固定されている場合は、この書き方が非常に分かりやすい方法です。

たとえば「処理開始時に必ず作業用シートを3枚用意する」と仕様で決まっているのであれば、無理にループ処理へ置き換える必要はありません。

コードを短くできるだけでなく、「3枚のシートを追加する処理」であることをコードからすぐに判断できます。

・Count引数を使って追加枚数を指定する考え方

Countには、追加したいシート数を指定します。

構文をシンプルに表すと、次のようになります。

Worksheets.Add Count:=追加する枚数

たとえば5枚追加する場合は、次のように変更できます。

Sub AddFiveWorksheets()

    Const ADD_SHEET_COUNT As Long = 5

    ' 指定した枚数のワークシートをまとめて追加
    Worksheets.Add Count:=ADD_SHEET_COUNT

End Sub

数値を直接Count:=5と記述しても問題ありません。

ただし、実務で「追加枚数が仕様として意味を持つ」「後から枚数が変更される可能性がある」といった場合には、定数として分けておく方法もあります。

ADD_SHEET_COUNTという名前を見れば、その数値が「追加するシート数」を意味していることが分かります。

また、5枚から6枚へ変更する場合も、定数部分を修正するだけで対応できます。

一方、1か所でしか使用せず、今後も変更されない単純な処理であれば、

Worksheets.Add Count:=5

と直接指定した方が読みやすいこともあります。

実務では「変数や定数にすれば必ず良い」のではなく、その値を分離することでコードの意図や保守性が本当に改善するかを考えることが重要です。


✅ VBAで複数シートを追加するときは対象ブックを明確にする

Worksheets.Add Count:=3は非常に簡単ですが、実務ではそのまま使用する前に「どのブックへ追加するのか」を確認する必要があります。ブックを省略したコードは短く見えるため、サンプルではよく使われます。

しかし、複数ブックを開いて作業するマクロでは、実行状況によって操作対象を誤る原因になります。特に途中で別ブックを開いたり、別のExcelファイルへデータを書き出したりする処理では注意が必要です。複数シートを一括追加すると、誤ったブックに複数枚作成してしまうため、1枚追加するとき以上に影響が大きくなります。実務用のコードでは、追加枚数だけでなく「追加先」までコードから判断できる状態にしておくことが重要です。

・ThisWorkbookを指定して複数シートを追加する方法

マクロを記述しているブック自身へシートを追加するのであれば、ThisWorkbookを明示できます。

Sub AddWorksheetsToThisWorkbook()

    Const ADD_SHEET_COUNT As Long = 3

    ' このマクロを保存しているブックへシートを追加
    ThisWorkbook.Worksheets.Add Count:=ADD_SHEET_COUNT

End Sub

この書き方にしておけば、別のブックが画面上でアクティブになっていても、「このマクロを保存しているブック」を対象としていることがコード上で明確になります。

実務では、画面上で選択されているブックと、マクロが処理すべきブックが同じとは限りません。

そのため、

Worksheets.Add Count:=3

だけで済ませるより、

ThisWorkbook.Worksheets.Add Count:=3

のように対象を明示した方が、後からコードを確認する人にも処理内容が伝わりやすくなります。

ただし、常にThisWorkbookを使用すればよいわけではありません。

処理対象が別のブックであれば、そのブックを変数などで正しく参照する必要があります。

重要なのは、「どのブックへ追加する処理なのか」を曖昧にしないことです。

複数のブックを開いた状態でマクロを実行する場合は、シートの追加先を明確にしておくことが重要です。ThisWorkbook以外のブックを指定してシートを追加する方法については、「【VBA】ブックを指定してシートを追加する方法」で詳しく解説しています。


✅ VBAで複数シートを追加する位置を指定する方法

複数シートを追加できても、目的と異なる位置へ作成されてしまえば、その後の処理が分かりにくくなることがあります。Worksheets.AddではBeforeやAfterを利用して追加位置を指定できますが、複数枚を扱う場合は「基準となるシート」を意識することが大切です。

また、追加したシートを後続処理で使用するのであれば、単に見た目の並び順だけを考えるのでは不十分です。「最後のシートの後ろへ追加したから、いつでも同じシートを取得できる」といった位置依存の設計は、後からシート構成が変更されたときに崩れる可能性があります。追加位置の指定は便利ですが、それをシート識別の唯一の手段にしないことがポイントです。まずは複数枚をどこへ追加できるのか、基本的な指定方法から確認しましょう。

・先頭のシートより前に複数枚を追加する方法

既存の先頭シートより前へ複数のワークシートを追加する場合は、Beforeを指定します。

Sub AddWorksheetsBeforeFirstSheet()

    Const ADD_SHEET_COUNT As Long = 3

    With ThisWorkbook
        ' 現在の先頭シートより前へ3枚追加
        .Worksheets.Add _
            Before:=.Worksheets(1), _
            Count:=ADD_SHEET_COUNT
    End With

End Sub

ここではWith ThisWorkbookを使用し、追加先と基準となるワークシートが同じブックであることを明確にしています。

複数のプロパティやメソッドで同じブックを参照するため、ThisWorkbookを何度も記述するよりも対象関係を整理しやすくなります。

ただし、Withを使えば必ず読みやすくなるわけではありません。

処理が長くなり、異なるオブジェクトへの操作まで1つのWithへ詰め込むと、かえって何を操作しているのか追いにくくなります。

今回のように「同じブックのワークシートを追加する」という短い範囲でまとめると、処理対象を把握しやすくなります。

複数シートの追加では、このように枚数・追加先ブック・追加位置をそれぞれ分けて考えることが、後から修正しやすいコードにつながります。

新しいシートを常にブックの最後へ配置したい場合は、最後のシートを基準にして追加位置を指定できます。末尾への追加方法やコードの考え方については、「【VBA】末尾にシートを追加する方法」もあわせて確認してみてください。


✅ VBAでFor文を使って複数シートを追加する方法

追加する枚数が決まっているだけなら、Worksheets.Add Count:=3のような一括追加がシンプルです。しかし実務では、「設定された件数分だけ作成する」「部署数に応じて作成する」など、追加枚数が処理のたびに変わることがあります。このような場合まで固定値で記述すると、仕様変更のたびにコードを修正しなければなりません。

また、シートを追加するたびに名前や初期設定を変更したい場合も、一括追加よりループ処理の方が流れを整理しやすくなります。重要なのは、複数枚なら必ずFor文を使うことではなく、その後に何をするかまで考えて選択することです。固定枚数と可変枚数の違いを理解すると、必要以上に複雑な処理を作らずに済みます。

・For文で必要な枚数だけシートを追加する方法

For文を使えば、指定した回数だけWorksheets.Addを実行できます。

たとえば3枚のシートを追加する場合は、次のように記述できます。

Sub AddWorksheetsWithLoop()

    Const ADD_SHEET_COUNT As Long = 3
    Dim sheetIndex As Long

    For sheetIndex = 1 To ADD_SHEET_COUNT

        ' ワークシートを1枚ずつ追加
        ThisWorkbook.Worksheets.Add

    Next sheetIndex

End Sub

処理の流れは次のとおりです。

  1. ADD_SHEET_COUNTに追加する枚数を設定する
  2. For文を開始する
  3. Worksheets.Addで1枚追加する
  4. 指定回数に達するまで追加処理を繰り返す
  5. 必要な枚数が追加されたら処理を終了する

単に3枚追加するだけなら、

ThisWorkbook.Worksheets.Add Count:=3

の方が簡潔です。

それでもFor文を利用するメリットは、1枚追加するたびに別の処理を組み込めることにあります。

たとえば、追加したシートごとに名前を設定したり、見出しを入力したり、書式を設定したりする場合です。

複数シートの「作成」と「作成直後の初期設定」を1つの処理として扱いたい場合、ループ処理が有力な選択肢になります。

・変数で指定した枚数のシートを追加する方法

実務では、追加枚数がコード作成時点で決まっていないケースもあります。

たとえば、別の処理で求めた件数をsheetCountへ格納している場合は、次のようにできます。

Sub AddWorksheetsByCount()

    Dim sheetCount As Long
    Dim sheetIndex As Long

    ' 実際にはセルや別処理などから必要枚数を取得する
    sheetCount = 3

    If sheetCount <= 0 Then Exit Sub

    For sheetIndex = 1 To sheetCount

        ' 必要な枚数だけワークシートを追加
        ThisWorkbook.Worksheets.Add

    Next sheetIndex

End Sub

ここでは、ループを開始する前にsheetCountが0以下でないか確認しています。

実務では、セルや外部データなどから取得した値をそのまま処理条件にすると、想定外の値によって意図しない動作につながることがあります。

そのため、シートを追加する前に「本当に追加すべき枚数なのか」を確認する処理を入れておくと安全です。


✅ VBAで一括追加とループ追加を使い分けるポイント

複数シートを追加するとき、「CountとFor文のどちらが正しいのか」と迷うことがありますが、どちらか一方が常に優れているわけではありません。実務で起きがちな失敗は、短いコードにすることだけを優先したり、反対に何でもループ処理にしたりすることです。追加した後に何もしないのであれば、一括追加の方が処理の目的を把握しやすくなります。

一方、各シートに異なる設定を行うなら、1枚ずつ処理できるループの方が管理しやすい場合があります。コード量ではなく、「追加後にどのような処理が続くか」を基準に判断することがポイントです。この違いを理解しておくと、仕様変更にも対応しやすいコードになります。

・固定枚数だけ追加するならCountを優先する

単純に決まった枚数を追加するだけなら、次のような一括追加が分かりやすいでしょう。

ThisWorkbook.Worksheets.Add Count:=3

たとえば「作業開始時に空のワークシートを3枚準備する」という要件であれば、これだけでも目的が明確です。

逆に、

For sheetIndex = 1 To 3
    ThisWorkbook.Worksheets.Add
Next sheetIndex

としても結果は似ていますが、「なぜループしているのか」という疑問が残る可能性があります。

処理を必要以上に複雑にしないことも、保守性を高めるポイントです。

・シートごとに処理するならFor文を検討する

一方、シートを追加した直後に個別処理を行う場合は、For文が使いやすくなります。

たとえば、追加したワークシートを変数で受け取り、そのシートに対して処理する方法です。

Sub AddAndInitializeWorksheets()

    Const ADD_SHEET_COUNT As Long = 3

    Dim sheetIndex As Long
    Dim newWorksheet As Worksheet

    For sheetIndex = 1 To ADD_SHEET_COUNT

        ' 追加したワークシートを変数で保持する
        Set newWorksheet = ThisWorkbook.Worksheets.Add

        ' 追加直後のシートに初期値を設定する
        newWorksheet.Range("A1").Value = "入力項目"

    Next sheetIndex

End Sub

ここで重要なのは、シート追加後にActiveSheetへ依存せず、newWorksheetへ追加したシートを格納している点です。

Worksheets.Addによって追加されたワークシートを変数で保持しておけば、その後の処理対象が明確になります。

実務では処理途中に別のシートを選択するコードが追加されることもあります。

そのため、

ActiveSheet.Range("A1").Value = "入力項目"

のように「現在アクティブなシート」に依存するより、対象をオブジェクト変数で保持した方が後から処理を変更しやすくなります。

複数の空シートを作成するのではなく、書式や数式が設定された既存シートをひな形として増やしたい場合は、AddよりCopyが適していることがあります。シートの新規追加とコピーの違いについては、「【VBA】シートコピーを自動化する方法|Add・Copyメソッドの違いと使い方を徹底解説」で詳しく解説しています。


 

✅ VBAで追加した複数シートに名前を付ける場合の考え方

複数シートを自動作成すると、「Sheet4」「Sheet5」のような既定名ではなく、用途が分かる名前を付けたくなることがあります。ただし、ここで単純に連番を付ければよいとは限りません。既に同じ名前のシートが存在すると、名前の変更時にエラーになるためです。

また、シート名を変更する処理まで追加すると、シート作成だけを担当するコードより考慮すべき条件が増えます。特に既存ブックへ何度もマクロを実行できる仕組みでは、重複チェックを省略しないことが重要です。複数シートを追加する処理では、作成枚数だけでなく「作成後にどのように識別するか」まで設計しておきましょう。

・追加したシートへ連番の名前を設定する方法

たとえば「作業用1」「作業用2」「作業用3」という名前で作成するなら、For文のカウンターを利用できます。

Sub AddNamedWorksheets()

    Const ADD_SHEET_COUNT As Long = 3

    Dim sheetIndex As Long
    Dim newWorksheet As Worksheet

    For sheetIndex = 1 To ADD_SHEET_COUNT

        Set newWorksheet = ThisWorkbook.Worksheets.Add

        ' 追加したシートへ連番の名前を設定
        newWorksheet.Name = "作業用" & sheetIndex

    Next sheetIndex

End Sub

For文を利用することで、追加→取得→命名という流れを1枚ずつ処理できます。

ただし、このコードは「作業用1」などの同名シートが存在するとエラーになります。

そのため、実際の業務ファイルで繰り返し実行する場合は、既存シートの確認や命名規則を含めた設計が必要です。

ここでは複数シートを作成する流れを理解するためにシンプルなコードとしていますが、実務では「同名シートが存在した場合に追加しないのか、別名にするのか」まで仕様として決めることが大切です。

追加したシートへ名前を設定する場合は、Nameプロパティの基本だけでなく、既存シートとの名前の重複にも注意が必要です。シートを追加して名前を付ける処理を詳しく確認したい場合は、「【VBA】シートを追加して名前を付ける方法|Sheets.Add・Nameプロパティの実務活用」も参考にしてください。


✅ VBAで複数シートを追加するときの実務上の注意点

複数シートの追加は短いコードで実装できますが、シート数が増える処理だからこそ実行前の確認が重要です。たとえば、マクロを誤って2回実行すると、予定していた枚数の倍のシートが作成される可能性があります。

また、追加先ブックを省略すると、別ブックを操作してしまう原因にもなります。さらに、追加したシートを位置だけで判断する設計は、後からユーザーがシートを並べ替えたときに崩れることがあります。「追加できたから完成」ではなく、その後も安全に扱えるかまで考える必要があります。業務で繰り返し使用するマクロほど、実行条件と処理対象を明確にしておきましょう。

・複数シートを追加する前に確認したいポイント

実務では、少なくとも次の点を確認しておくと安全です。

  1. シートを追加するブックが正しく指定されているか
  2. 本当に必要な枚数だけ追加する設計になっているか
  3. マクロを再実行した場合に重複して作成されないか
  4. シート名を変更する場合、既存名との重複がないか
  5. 追加したシートを後続処理で正しく参照できるか

特に注意したいのが、マクロの再実行です。

ユーザーが「処理されていない」と思ってボタンをもう一度押した場合、単純な追加処理では同じ用途のシートが何枚も増えてしまうことがあります。

毎回新しいシートを作ることが目的なら問題ありませんが、「必要なシートを準備すること」が目的なら、既存シートを確認してから追加する設計の方が適している場合があります。

また、Excel VBAではシートを追加した後に、セルへの値設定、書式変更、数式入力、データ転記などを続けて自動化できます。

複数シートを作成する処理は、それだけで完結させるよりも、業務に必要なシートを準備し、その後の初期設定まで自動化するための入口として考えると活用範囲が広がります。

同じマクロを繰り返し実行する可能性がある場合は、必要なシートがすでに存在していないか確認してから追加する方法も有効です。不要な重複作成を防ぐ方法については、「【VBA】シートがなければ作成する方法|存在確認して安全に追加する実務コード」で詳しく解説しています。


 

✅ まとめ:VBAで複数シートを一括追加して用途に応じて使い分けよう

VBAで複数シートを追加する方法は難しくありませんが、一括追加とループ処理では適した用途が異なります。単純に複数枚を作成したいだけならCountを利用することでコードを簡潔にできます。

一方、枚数が変動する場合や、追加したシートごとに個別処理を行う場合はFor文が便利です。また、実務では追加先ブックや追加したシートの参照方法を曖昧にしないことも重要です。シート名を設定する場合には、既存シートとの重複にも注意しなければなりません。複数シートを「作る方法」だけではなく、その後の処理まで含めて設計することで、より安全で保守しやすいマクロになります。

  • Worksheets.Add Count:=3で複数シートをまとめて追加できる
  • 固定枚数の単純な追加ではCountを使うと分かりやすい
  • 可変枚数やシートごとの処理にはFor文を利用できる
  • 追加先のブックはThisWorkbookなどで明確にする
  • 追加したシートはオブジェクト変数で保持すると扱いやすい
  • シート名を付ける場合は既存名との重複に注意する
  • 再実行によって不要なシートが増えないかも確認する
  • 複数シート作成後の初期設定まで含めて設計すると自動化の幅が広がる

まずは「決まった枚数を追加するだけなのか」「追加した各シートへ続けて処理するのか」を整理してみてください。この判断ができれば、CountとFor文を無理なく使い分けられ、後から仕様が変わっても修正しやすいVBAコードにつながります。

    -VBAで自動化, VBA一覧, シート追加, セル・シート・ブック操作