【初心者向け】Excel VBAで新しいブックを作成する方法をわかりやすく解説!

A子さん

Excel VBAで「新しいブックを作成」するには?
作成したブックに自動で名前をつけて保存できる?
作成後のブックにデータを書き込む方法は?
複数のブックを一度に作る場合はどうするの?

結論:Workbooks.Addを使えば、新しいブックが1行で作成できます

VBAで新しいブックを作る処理は、思いのほかシンプルです。


月末に集計レポートを自動生成したい、顧客ごとに個別ファイルを作りたい、データを分割して複数ブックに保存したい——そんな業務で活躍する機能です。


私も最初は「ブックって手動で作るしかないのかな」と思っていたのですが、VBAなら1行で完結します。


では、基本から応用まで、一緒に見ていきましょう。

目次

ブック作成の基本:Workbooks.Addとは

Excel VBAでブックを作成するときに使う関数が Workbooks.Add です。

Workbooks.Add

これで新しい空のブックが作成され、フォーカスがそちらに移動します。


つまり、このコードを実行した瞬間に、Excelの画面には真っ新なワークブックが立ち上がる——ということです。


手動で「ファイル」→「新規」をクリックしたのと同じ動作が、1行で完了します。


ただし「どこに保存するか」「どう名前をつけるか」「どのタイミングで保存するか」などは別途処理が必要です。


単なる「作成」と「実務で使える状態への準備」は、別ものだと考えておいてください。

最もシンプルな新規ブック作成

新しいブックを1つ作るだけなら、この1行でOKです。

Sub シンプルなブック作成()
    Workbooks.Add
End Sub

ですが——


実務で使う場合は、この書き方は避けたほうが無難です。


なぜなら、作成したブックに後からアクセスできないからです。


たとえば「今作ったブックに、ここに入っているデータを書き込みたい」という状況になったときに、作成したブックへの参照がないと、操作ができません。


Excelの画面には「新しいブック」が表示されていても、VBAのコード内ではそのブックが何なのか認識できていない——そういう困った状態になってしまいます。

実務で使える書き方:変数に格納する

だから、実務では必ず変数に格納します。

Sub 新しいブックを作成する()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add

    MsgBox "新しいブックを作成しました!"

End Sub

Dim 新ブック As Workbookで、Workbookという「ブック型」の変数を宣言しています。


Set 新ブック = Workbooks.Addで、作成したブックをその変数に代入しています。


これで、後からコード内で 新ブック という変数を使って、そのブックを自由に操作できるようになります。

先輩

Setを付け忘れると「オブジェクト変数が設定されていません」というエラーが出ます。ブック型やシート型など「オブジェクト」を扱うときは、代入前に必ずSetを書く癖をつけておくといいですよ。

作成直後のブック名について

新しいブックを作成したとき、デフォルトでは「Book1」「Book2」のような名前がついています。


これは一時的な名前で、ファイル名ではありません。


保存する前は、Excelの画面のタイトルバーに「Book1 — Excel」と表示されるだけです。


実際のファイルとして存在するわけではなく、メモリ上に存在する状態です。


だから「保存しないで閉じる」と、すべてが消えます。


つまり、この一時的な名前は気にせず、後で正式なファイル名をつけて保存すればOKという考え方でいいわけです。

新規ブックにデータを書き込む

作成したブックを変数に格納しておけば、データの書き込みも簡単です。

Sub 新しいブックにデータを書き込む()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add

    ' 最初のシートにデータを入力
    新ブック.Sheets(1).Range("A1").Value = "これは自動で書かれたデータです"
    新ブック.Sheets(1).Range("A2").Value = "VBAで作成しました"

    MsgBox "データ書き込み完了!"

End Sub

この書き方を見ると、VBAがどう「オブジェクト」を扱っているかが分かります。


新ブック(Workbook)の中からSheets(1)(1番目のシート)を指定し、そこからRange("A1")(A1セル)を指定して、Value(値)を代入する。


階層構造を「.」で繋いでいく、それがVBAのオブジェクト指向的な書き方です。


見た目は複雑に見えるかもしれませんが、「ブック → シート → セル → 値」という流れは、VBA全体で共通しています。

複数のセルにデータを書き込む場合

1行ずつ書き込むのが面倒なときは、ループを使います。

Sub 複数のデータを書き込む()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add
    
    Dim i As Integer
    For i = 1 To 10
        新ブック.Sheets(1).Range("A" & i).Value = "行番号" & i
    Next i

    MsgBox "10行のデータを書き込みました!"

End Sub

Range("A" & i)という書き方で、A1、A2、A3…と動的にセルを指定しています。


これは「文字列の連結」の技法で、VBAでよく使います。


iが1のときは “A” & 1 = “A1″、iが2のときは “A” & 2 = “A2” となるわけです。


データの規模が増えても、このパターンなら対応できます。

新規ブックにシート全体をコピーする場合

セルごとの書き込みではなく、既存ブックのシート全体をコピーして、新規ブックに貼り付けたいことも多いです。

Sub シート全体をコピーして新規ブックに
貼り付ける()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add

    ' 現在のブック(ThisWorkbook)のシート1全体を選択
    ThisWorkbook.Sheets(1).Cells.Copy

    ' 新規ブックのシート1に貼り付け
    新ブック.Sheets(1).Range("A1").PasteSpecial xlPasteAll

    ' クリップボードをクリア
    Application.CutCopyMode = False

    MsgBox "シート全体をコピーしました!"

End Sub

ここで重要なのは PasteSpecial の使い方です。

新規ブックに名前をつけて保存する

データを書き込んだら、次は保存です。

初めて保存するときは SaveAsメソッドを使います。

Sub 新しいブックを作成して保存()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add

    ' データを書き込む
    新ブック.Sheets(1).Range("A1").Value = "自動作成データ"

    ' 名前をつけて保存
    新ブック.SaveAs Filename:="C:\Users\あなたの名前\Desktop\自動作成ブック.xlsx"

    MsgBox "保存完了しました!"

End Sub

SaveAsは「名前をつけて保存」という意味です。

先輩

デスクトップを指定する場合、パスは環境ごとに違います。自分の環境が分からないときは、デスクトップに適当なファイルを置いて、そのプロパティを見れば「保存場所」が表示されます。またはVBAで `Environ(“USERPROFILE”) & “\Desktop\”` と書くと、自動でデスクトップ直下を指定できます。

Save と SaveAs の使い分け

の保存には、2種類のメソッドがあります。

  • SaveAs:新しいファイル名で保存する / 初めて保存するときに使用 / ファイルパスを指定する必要がある
  • Save:既に保存されているファイルを上書き保存する / ファイルパスは指定しない / 呼び出すだけでOK

たとえば、すでに存在する「月間レポート.xlsx」を開いて、データを追加して保存する場合は Save を使います。

Sub 既存ブックを更新()

    Dim 対象ブック As Workbook
    Set 対象ブック = Workbooks.Open("C:\Users\あなたの名前\Desktop\月間レポート.xlsx")

    ' データを追加
    対象ブック.Sheets(1).Range("A1").Value = "新しいデータ"

    ' 上書き保存
    対象ブック.Save

    MsgBox "更新しました!"

End Sub

Save はファイルパスを指定しません。


既に保存されているファイルだから、その「保存先」は既に決まっているわけです。


だから1行 対象ブック.Save でOKです。

複数の新規ブックを一度に作成する場合

顧客ごとに個別のブックを作成したい、部門ごとに分割ファイルを作りたい——そんなとき、ループを使って複数の新規ブックを作成できます。

Sub 複数の新規ブックを作成()

    Dim i As Integer
    Dim 新ブック As Workbook

    For i = 1 To 5
        Set 新ブック = Workbooks.Add

        ' ブックにタイトルを書き込む
        新ブック.Sheets(1).Range("A1").Value = "レポート " & i

        ' ファイル名を動的に設定
        新ブック.SaveAs Filename:="C:\Users\あなたの名前\Desktop\レポート_" & i & ".xlsx"

    Next i

    MsgBox "5つのブックを作成しました!"

End Sub

このコードは「レポート_1.xlsx」から「レポート_5.xlsx」まで、5つのブックを一度に作成します。

一つの新規ブックに複数のシートを追加する

ブックには最初、1つのシート(Sheet1)がついています。ですが、複数のシートが必要な場合もあります。その場合は、ブック作成後にシートを追加します。

Sub 複数のシートを持つブックを作成()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add

    ' 最初に存在するSheet1は使うので、Sheet2とSheet3を追加
    新ブック.Sheets.Add
    新ブック.Sheets.Add

    ' 各シートに名前をつける
    新ブック.Sheets(1).Name = "売上データ"
    新ブック.Sheets(2).Name = "原価データ"
    新ブック.Sheets(3).Name = "集計"

    ' 各シートにヘッダーを書き込む
    新ブック.Sheets("売上データ").Range("A1").Value = "日付"
    新ブック.Sheets("売上データ").Range("B1").Value = "金額"

    新ブック.Sheets("原価データ").Range("A1").Value = "品目"
    新ブック.Sheets("原価データ").Range("B1").Value = "原価"

    ' 保存
    新ブック.SaveAs Filename:="C:\Users\あなたの名前\Desktop\多シート分析.xlsx"

    MsgBox "複数シートのブックを作成しました!"

End Sub

新ブック.Sheets.Add でシートが追加されます。

ブック作成時に注意すべきファイルパスの指定方法

SaveAsを使うときのファイルパスは、Windowsの環境に大きく左右されます。

よくあるトラブルと対処法をまとめておきます。

  • 絶対パス問題:C:\Users\Taro\Desktop\ のような「絶対パス」を使うと、別のパソコンで実行したときに失敗します。対策は、Environ("USERPROFILE")を使ってユーザープロファイルのパスを動的に取得すること。
  • 日本語パスの文字化け:フォルダ名に日本語を使う場合、まれに文字化けが発生します。避けるなら、英数字だけのフォルダ構造を用意するほうが無難です。
  • バックスラッシュの扱い:Windowsパスは \(バックスラッシュ)で区切られます。VBAでも \ をそのまま使いますが、VBAにおいてバックスラッシュは「エスケープ文字」として機能するときがあります。確実を期すなら、単一のバックスラッシュではなく、連続させるか、フォワードスラッシュ / を使う方法もあります。

実務では、よく以下のような工夫が使われます。

Sub パスを安全に指定する()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add

    ' ユーザープロファイルを取得
    Dim ユーザーパス As String
    ユーザーパス = Environ("USERPROFILE")

    ' デスクトップのパスを構築
    Dim 保存先 As String
    保存先 = ユーザーパス & "\Desktop\自動生成ブック.xlsx"

    新ブック.SaveAs Filename:=保存先

    MsgBox "パス: " & 保存先

End Sub

このように Environ("USERPROFILE") を使えば、どのパソコンでも動作します。

ブック作成時によくあるエラーと対処法

エラー内容原因対処法
パスが見つかりません保存先のパスが存在しない、またはタイプミスパスが正確か確認。デスクトップなどの確実に存在するパスを使用。Environ("USERPROFILE")の使用を検討。
オブジェクト変数が設定されていませんSetキーワードの付け忘れSet 新ブック = Workbooks.Add のようにSetを必ず使用
ファイルが既に存在します同じパス・ファイル名で既にファイルが存在するファイル名に日付やタイムスタンプを含める、または既存ファイルを削除するコードを先に実行
アクセスが拒否されましたファイルが開きっぱなし、または読み取り専用フォルダ保存前に同名ファイルを閉じるコードを追加。フォルダのアクセス権を確認。
ファイル形式が無効です拡張子が存在しない、または不適切.xlsx.xlsm.csvなど、正確な拡張子を指定

中でも「ファイルが既に存在します」というエラーは、ループで複数のファイルを作成するときによく出ます。

その場合の対処法です。

Sub 既存ファイルを削除して新規作成()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add

    Dim 保存先 As String
    保存先 = "C:\Users\あなたの名前\Desktop\自動作成ブック.xlsx"

    ' 既に存在していたら削除
    If Dir(保存先) <> "" Then
        Kill 保存先
    End If

    ' 新規ブックを保存
    新ブック.SaveAs Filename:=保存先

    MsgBox "ファイルを作成しました"

End Sub

Dir(保存先) でそのパスにファイルが存在するか確認します。

先輩

Kill文は本当に危険です。不用意に使うと、予期しないファイルが削除されてしまいます。本番環境で使う場合は「ここで削除するファイルは本当に不要か」を二重三重に確認してください。

実務の例:毎月のレポートを自動生成する

ここまでの知識を組み合わせて、実務的な例を示します。

毎月のレポートファイルを、自動で日付つきで作成するというシナリオです。

Sub 月次レポートを自動生成()

    Dim 新ブック As Workbook
    Set 新ブック = Workbooks.Add

    ' シートに名前をつける
    新ブック.Sheets(1).Name = "売上"
    新ブック.Sheets.Add
    新ブック.Sheets(2).Name = "分析"

    ' 売上シート
    With 新ブック.Sheets("売上")
        .Range("A1").Value = "日付"
        .Range("B1").Value = "売上金額"
        .Range("C1").Value = "摘要"

        ' ヘッダー行を太字に
        .Range("A1:C1").Font.Bold = True
    End With

    ' 分析シート
    With 新ブック.Sheets("分析")
        .Range("A1").Value = "集計データ"
        .Range("A1").Font.Bold = True
    End With

    ' ファイル名に現在の日付を含める
    Dim ファイル名 As String
    ファイル名 = Format(Now, "YYYY年MM月dd日") & "度レポート.xlsx"

    Dim 保存先 As String
    保存先 = Environ("USERPROFILE") & "\Desktop\" & ファイル名

    新ブック.SaveAs Filename:=保存先

    MsgBox "レポート " & ファイル名 & " を作成しました!"

End Sub

このコードの特徴は以下の通りです。

  • 複数のシートを作成し、それぞれに意味のある名前をつけている
  • Withステートメントで同じシート内の操作をまとめている(読みやすさが向上)
  • Format(Now, "YYYY年MM月dd日")で現在日時をフォーマットして、ファイル名に含めている
  • Environ("USERPROFILE")で環境に依存しないパスを使っている

このパターンは、実務でよく使われます。

既存ブックから特定のシートだけをコピーして新規ブックに作成する

別のアプローチとして、既存ブックの特定のシートをコピーして新規ブックを作る方法もあります。

Sub シートをコピーして新規ブックを作成()

    Dim 元ブック As Workbook
    Dim 新ブック As Workbook

    ' 元ブックを開く
    Set 元ブック = Workbooks.Open("C:\Users\あなたの名前\Desktop\テンプレート.xlsx")

    ' 新規ブックを作成
    Set 新ブック = Workbooks.Add

    ' 元ブックのSheet1を新規ブックのSheet1にコピー
    元ブック.Sheets(1).Cells.Copy
    新ブック.Sheets(1).Range("A1").PasteSpecial xlPasteAll

    Application.CutCopyMode = False

    ' 新規ブックを保存
    新ブック.SaveAs Filename:="C:\Users\あなたの名前\Desktop\新規コピー.xlsx"

    ' 元ブックを閉じる
    元ブック.Close SaveChanges:=False

    MsgBox "シートをコピーして新規ブックを作成しました"

End Sub

ここで注目すべきは Close SaveChanges:=False です。

ブック作成とフォルダ作成を組み合わせる

より応用的な例として、ブック作成と同時にフォルダも作成するパターンを示します。

Sub 顧客ごとにフォルダとブックを作成()

    Dim 新ブック As Workbook
    Dim i As Integer
    Dim 顧客リスト As Variant

    ' 顧客名の配列
    顧客リスト = Array("A株式会社", "B株式会社", "C株式会社")

    Dim ベースパス As String
    ベースパス = Environ("USERPROFILE") & "\Desktop\顧客管理\"

    ' ベースフォルダが存在しなければ作成
    If Dir(ベースパス, vbDirectory) = "" Then
        MkDir ベースパス
    End If

    ' 顧客ごとにフォルダとブックを作成
    For i = 0 To UBound(顧客リスト)
        Dim 顧客フォルダ As String
        顧客フォルダ = ベースパス & 顧客リスト(i) & "\"

        ' 顧客ごとのフォルダを作成
        If Dir(顧客フォルダ, vbDirectory) = "" Then
            MkDir 顧客フォルダ
        End If

        ' 新規ブックを作成
        Set 新ブック = Workbooks.Add
        新ブック.Sheets(1).Range("A1").Value = "顧客名:"
        新ブック.Sheets(1).Range("B1").Value = 顧客リスト(i)

        ' ブックを保存
        新ブック.SaveAs Filename:=顧客フォルダ & "管理表.xlsx"

    Next i

    MsgBox "すべての顧客フォルダと管理表を作成しました"

End Sub

MkDir はフォルダを作成するステートメントです。

Workbooks.Addの引数について

ここまで、Workbooks.Addを引数なしで使ってきました。


ですが、実は引数を指定することもできます。


よく使う引数をいくつか紹介しておきます。

Sub 引数ありでブック作成()

    Dim 新ブック As Workbook

    ' 通常のブックを作成(シート3枚がデフォルト)
    Set 新ブック = Workbooks.Add()

    ' テンプレートを指定してブックを作成
    ' Set 新ブック = Workbooks.Add(Template:="C:\path\to\テンプレート.xltx")

    ' シート数を指定してブックを作成
    ' Set 新ブック = Workbooks.Add(, , 5)  ' 5枚のシートを持つブック

End Sub

通常は、引数なしで Workbooks.Add だけで十分です。

ブック作成時のメモリ管理

複数のブックを一度に作成する場合、メモリ使用量が増大する可能性があります。


特に大量のデータを含むブックを何十個も作成する場合は注意が必要です。

Sub メモリ効率的に複数ブック作成()

    Dim i As Integer
    Dim 新ブック As Workbook

    For i = 1 To 100
        Set 新ブック = Workbooks.Add

        ' データを書き込む
        新ブック.Sheets(1).Range
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

かもろぐ屋へようこそ。

Microsoft製品が大好きな現役社内SEです。
本業では、業務改善・運用・トラブル対応・効率化など、いわゆる「社内の困った」を何でも屋のように対応しています。

このブログでは主に、

VBA
Power Apps
AI

について、実体験ベースで発信しています。

特に最近は、AIを使ったアプリ開発やブログ運営の自動化にハマっています。
「AIがあれば簡単に作れる」と思って始めた結果、普通に壊れたり、詰んだり、課金したりしながら泥臭く進めています。

キラキラした成功談というより、

「実際どうだったのか」
「どこで詰まったのか」
「初心者でも本当にできるのか」

を、できるだけリアルに残すタイプのブログです。

なお、絶賛婚活中です。

コメント

コメントする

CAPTCHA


目次