VBAでマクロを組む上で、「別のExcelファイルを開いて、そこからデータを読み取りたい」または「処理結果を別のファイルに書き込みたい」といったブックをまたいだ操作は頻繁に発生します。
この記事では、VBAで指定したパスにある既存のExcelブックを開き、そのブックをオブジェクト変数に格納して安全・確実に操作するための、最も基本的で重要な手法を解説します。
完成したVBAコード
以下が、マクロが保存されているExcelファイルと同じフォルダにある「DataSource.xlsx」というブックを開き、セルを編集して保存・クローズするまでの一連のVBAコードです。
Sub OpenAndEditWorkbook()
' 変数を宣言します
Dim targetBookPath As String
Dim openedBook As Workbook
' 開きたいブックのフルパスを指定します
targetBookPath = ThisWorkbook.Path & "\DataSource.xlsx"
' --- 1. ファイルの存在を確認 ---
If Dir(targetBookPath) = "" Then
MsgBox "指定されたファイルが見つかりません。" & vbCrLf & targetBookPath, vbExclamation
Exit Sub
End If
' --- 2. ブックを開き、そのオブジェクトを変数に格納 ---
' Workbooks.Openが返した「開かれたブック」をopenedBook変数にセットします
Set openedBook = Workbooks.Open(targetBookPath)
' --- 3. 開いたブックをオブジェクト変数経由で操作 ---
With openedBook.Worksheets("Sheet1")
.Range("A1").Value = "この値はVBAによって書き込まれました。"
.Range("A1").Font.Bold = True
End With
' --- 4. 開いたブックを保存して閉じる ---
' SaveChanges:=True で変更を保存して閉じます
openedBook.Close SaveChanges:=True
' --- 5. オブジェクト変数を解放 ---
Set openedBook = Nothing
MsgBox "外部ブックの操作が完了しました。"
End Sub
コードのポイント解説
① ファイルの存在チェック (Dir関数)
If Dir(targetBookPath) = "" Then
MsgBox "指定されたファイルが見つかりません。"
Exit Sub
End If
Workbooks.Open
を実行する前に、Dir
関数を使って対象のファイルが実際にその場所に存在するかをチェックするのは、非常に良い習慣です。ファイルが存在しない場合にDir
関数は空の文字列(""
)を返すため、これを利用してエラーを未然に防ぎ、ユーザーに分かりやすいメッセージを表示できます。
② ブックを開いて変数に格納 (Workbooks.Open)
Set openedBook = Workbooks.Open(targetBookPath)
これが、外部ブックを操作する際の最も重要なコードです。
Workbooks.Open("ファイルパス")
が実行され、指定されたブックが開かれます。- このメソッドは、戻り値として**「開かれたブックのオブジェクト」**そのものを返します。
Set
キーワードを使い、その返されたオブジェクトをopenedBook
という変数に代入(セット)します。
これ以降、openedBook
という変数が、新しく開かれたブックを直接指し示す「名札」の役割を果たします。これにより、ActiveWorkbook
のようにユーザーの操作によって対象がズレる危険性がなくなり、コードの信頼性が格段に向上します。
③ 開いたブックの操作とクローズ
With openedBook.Worksheets("Sheet1")
' ...
End With
openedBook.Close SaveChanges:=True
ブックの操作やクローズは、すべてopenedBook
変数に対して行います。これにより、どのブックを操作しているかがコード上明確になります。.Close
メソッドの引数SaveChanges:=True
は、ファイルを保存してから閉じる、という便利なオプションです。
Workbooks.Openの便利な引数
Workbooks.Open
メソッドには、ほかにもよく使われる便利な引数があります。
ReadOnly:=True
: ブックを読み取り専用で開きます。誤ってデータを書き換えるのを防ぎたい場合に利用します。UpdateLinks:=0
: 外部参照リンクが含まれるブックを開く際に、リンクを更新しないようにします。更新確認のメッセージを抑制し、ブックを素早く開くことができます。Password:="シークレット"
: パスワードで保護されたブックを開く際に、パスワードをコード内で指定します。
まとめ
VBAで既存のブックを開いて操作する際の、最も安全で推奨される手順は以下の通りです。
- 操作したいブックのフルパスを準備する。
- (推奨)
Dir
関数で、ファイルが実際に存在するかをチェックする。 Set wb = Workbooks.Open(filepath)
の構文でブックを開き、オブジェクト変数に格納する。- すべての操作をそのオブジェクト変数経由で行う。
- 最後に**
.Close
**でブックを閉じる。
この「オブジェクト変数で補足する」という考え方は、VBAで安定したマクロを構築するための基本であり、最重要テクニックの一つです。