VBAでデータを集計し、その結果を新しいブックにまとめて保存する、といった処理は非常に一般的です。このとき、「Workbooks.Add
で新しいブックを作ったはいいが、そのブックをどうやって正確に操作すれば良いのか?」という問題に直面することがあります。
この記事では、新しく作成したブックを**「オブジェクト変数」**に格納することで、その後の操作を確実に行うための最も重要で基本的な方法を解説します。
なぜオブジェクト変数を使うのか?
VBAでWorkbooks.Add
を実行すると、「Book1」や「Book2」といった名前の新しいブックが作成されます。しかし、この名前は可変であり、どの名前になるかは実行時の状況に依存します。
' 悪い例:不安定なコード
Workbooks.Add
ActiveWorkbook.SaveAs "C:\temp\test.xlsx" ' ←もしユーザーが別のブックをクリックしたら、違うブックが保存されてしまう!
このような不安定さをなくし、「たった今作成した、あのブック」を直接かつ確実に操作するために、オブジェクト変数を使います。Workbooks.Add
メソッドは、作成したブックのオブジェクトそのものを返すので、それを受け取るための「入れ物」がオブジェクト変数です。
完成したVBAコード
以下が、新しいブックを作成し、オブジェクト変数を使ってデータを入力、保存、クローズまで行う一連のVBAコードです。
Sub CreateAndManageNewWorkbook()
' Workbookオブジェクトを格納する変数を宣言します
Dim newBook As Workbook
' --- 1. 新規ブックを追加し、そのオブジェクトを変数に格納 ---
' Workbooks.Addが返した「新しいブック」をnewBook変数にセットします
Set newBook = Workbooks.Add
' --- 2. オブジェクト変数を使って、新しいブックを操作 ---
' この時点でのブック名を確認
MsgBox "新規ブック「" & newBook.Name & "」を作成しました。"
' 新規ブックの最初のシートのA1セルに値を入力
newBook.Worksheets(1).Range("A1").Value = "このブックはVBAで作成されました。"
' --- 3. 新規ブックを保存して閉じる ---
' 保存先のパスとファイル名を指定して保存
newBook.SaveAs Filename:=ThisWorkbook.Path & "\New_VBA_Report.xlsx"
' 保存後、ブックを閉じる
newBook.Close
' --- 4. オブジェクト変数を解放 ---
Set newBook = Nothing
MsgBox "新規ブックの作成、保存、クローズが完了しました。"
End Sub
コードのポイント解説
① Dim … As Workbook
Dim newBook As Workbook
まず、Workbook
という「型」のオブジェクトを格納するための変数をDim
で宣言します。As Workbook
と型を明示することで、VBAが「この変数にはブックの情報が入るのだな」と理解し、後のコード記述で入力候補を表示してくれる(IntelliSense)など、開発上のメリットがあります。
② Set newBook = Workbooks.Add
Set newBook = Workbooks.Add
これがこのテクニックの心臓部です。
Workbooks.Add
が実行され、新しいブックが作成されます。Workbooks.Add
は、戻り値として「作成されたブックのオブジェクト」を返します。Set
キーワードを使い、その返されたオブジェクトをnewBook
という変数に代入(セット)します。
これ以降、newBook
という変数は、作成された新規ブックそのものを指すようになります。
③ newBookを使った操作
newBook.Worksheets(1).Range("A1").Value = "..."
newBook.SaveAs ...
newBook.Close
一度newBook
変数にブックを格納してしまえば、あとはActiveWorkbook
のような曖昧な指定ではなく、newBook
という名前で直接そのブックを操作できます。これにより、他のブックが開いていようが、ユーザーがどのウィンドウをクリックしようが、コードは常に目的のブックを正確に操作し続けます。
まとめ
VBAで新しいオブジェクト(ブック、シート、図形など)を作成する際は、必ずSet
キーワードとオブジェクト変数を使って、作成したオブジェクトへの参照を保持するのが鉄則です。
Set myObject = ParentObject.Add
この基本パターンを徹底することで、
- 信頼性: 状況に左右されない、安定したマクロが作れる。
- 可読性: コードを読むだけで、どのオブジェクトを操作しているかが一目瞭然になる。
といった大きなメリットが得られます。これは、VBAプログラミングにおける最も基本的で重要な作法の一つです。