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


コメント