A子さんExcel VBAで「新しいブックを作成」するには?
作成したブックに自動で名前をつけて保存できる?
作成後のブックにデータを書き込む方法は?
複数のブックを一度に作る場合はどうするの?
結論:Workbooks.Addを使えば、新しいブックが1行で作成できます
ブック作成の基本:Workbooks.Addとは
Excel VBAでブックを作成するときに使う関数が Workbooks.Add です。
Workbooks.Add
最もシンプルな新規ブック作成
新しいブックを1つ作るだけなら、この1行でOKです。
Sub シンプルなブック作成()
Workbooks.Add
End Sub
実務で使える書き方:変数に格納する
だから、実務では必ず変数に格納します。
Sub 新しいブックを作成する()
Dim 新ブック As Workbook
Set 新ブック = Workbooks.Add
MsgBox "新しいブックを作成しました!"
End Sub



Setを付け忘れると「オブジェクト変数が設定されていません」というエラーが出ます。ブック型やシート型など「オブジェクト」を扱うときは、代入前に必ずSetを書く癖をつけておくといいですよ。
作成直後のブック名について
新規ブックにデータを書き込む
作成したブックを変数に格納しておけば、データの書き込みも簡単です。
Sub 新しいブックにデータを書き込む()
Dim 新ブック As Workbook
Set 新ブック = Workbooks.Add
' 最初のシートにデータを入力
新ブック.Sheets(1).Range("A1").Value = "これは自動で書かれたデータです"
新ブック.Sheets(1).Range("A2").Value = "VBAで作成しました"
MsgBox "データ書き込み完了!"
End Sub
複数のセルにデータを書き込む場合
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
新規ブックにシート全体をコピーする場合
セルごとの書き込みではなく、既存ブックのシート全体をコピーして、新規ブックに貼り付けたいことも多いです。
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 の使い方です。
新規ブックに名前をつけて保存する
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
複数の新規ブックを一度に作成する場合
顧客ごとに個別のブックを作成したい、部門ごとに分割ファイルを作りたい——そんなとき、ループを使って複数の新規ブックを作成できます。
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つのブックを一度に作成します。
一つの新規ブックに複数のシートを追加する
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 でシートが追加されます。
ブック作成時に注意すべきファイルパスの指定方法
- 絶対パス問題: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の引数について
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


コメント