【VBAリファレンス】VBAで別ブックを自在に操る!Open, Closeメソッド完全ガイド

スポンサーリンク

はじめに

Excel VBAを使いこなす上で、複数のブックを連携させる場面は非常に多くあります。例えば、あるブックで集計したデータを別のブックに転記したり、別ブックに保存されているテンプレートを利用して帳票を作成したりするケースです。これらの処理を実現するためには、対象となるブックを「開く」ことと「閉じる」ことが不可欠です。

本記事では、Excel VBAの`Open`メソッドと`Close`メソッドに焦点を当て、これらのメソッドを効果的に使いこなすための詳細な解説と、すぐに役立つサンプルコード、そして実務で遭遇しがちな注意点や応用テクニックまで、網羅的にご紹介します。VBA初心者の方から、より高度なブック操作に挑戦したい方まで、必見の内容となっています。

Openメソッドによるブックの開き方

`Open`メソッドは、指定したパスにあるExcelブックを開くためのメソッドです。`Application`オブジェクトのメソッドとして使用します。

基本的な構文

Application.Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru)

各引数の概要は以下の通りです。

* **FileName**: 開きたいブックのフルパスを指定します。これは必須の引数です。
* **UpdateLinks**: リンクの更新方法を指定します。
* `0`: リンクを更新しない。
* `1`: リンクを更新する(デフォルト)。
* `2`: リンクを更新せず、ユーザーに更新するかどうかを尋ねる。
* **ReadOnly**: ブックを読み取り専用で開くかどうかを指定します。
* `True`: 読み取り専用で開く。
* `False`: 通常通り開く(デフォルト)。
* **Format**: ファイルを開く際に使用するファイル形式を指定します。通常は省略します。
* **Password**: ブックを開くためにパスワードが必要な場合に指定します。
* **WriteResPassword**: ブックを書き込み専用で開くためのパスワードを指定します。
* **IgnoreReadOnlyRecommended**: 「読み取り専用を推奨」というメッセージを無視するかどうかを指定します。
* `True`: メッセージを無視して開く。
* `False`: メッセージが表示される(デフォルト)。
* **Origin**: ファイルがテキストファイルの場合、そのファイルの原産国を指定します。通常は省略します。
* **Delimiter**: ファイルがテキストファイルの場合、区切り文字を指定します。通常は省略します。
* **Editable**: ブックを編集可能として開くかどうかを指定します。通常は省略します。
* **Notify**: 共有ブックで、他のユーザーに変更を通知するかどうかを指定します。通常は省略します。
* **Converter**: ファイルコンバーターを指定します。通常は省略します。
* **AddToMru**: 最近使用したファイルの一覧に追加するかどうかを指定します。
* `True`: 一覧に追加する。
* `False`: 一覧に追加しない(デフォルト)。

サンプルコード:指定したブックを開く

まずは、最も基本的なブックの開き方を見てみましょう。

Sub OpenSpecificWorkbook()

Dim wbToOpen As Workbook
Dim filePath As String

‘ 開きたいブックのパスを指定
‘ 実際のパスに置き換えてください
filePath = “C:\Users\YourUser\Documents\SampleData.xlsx”

‘ ファイルが存在するかどうかを確認
If Dir(filePath) <> “” Then
‘ ブックを開く
‘ ReadOnly:=True で読み取り専用で開くことも可能
Set wbToOpen = Application.Workbooks.Open(FileName:=filePath, ReadOnly:=False)

‘ 開いたブックの数を確認
MsgBox wbToOpen.Name & ” を開きました。現在開いているブックは ” & Application.Workbooks.Count & ” 個です。”

‘ 必要に応じて開いたブックに対する処理を記述
‘ 例: wbToOpen.Sheets(“Sheet1”).Cells(1, 1).Value = “Hello”

Else
MsgBox “指定されたファイルが見つかりません: ” & filePath
End If

End Sub

このコードでは、`filePath`変数に開きたいブックのフルパスを指定しています。`Dir()`関数でファイルが存在するかどうかを確認してから`Application.Workbooks.Open`を実行することで、ファイルが存在しない場合に発生するエラーを防いでいます。`Set wbToOpen = …`としているのは、開いたブックオブジェクトへの参照を変数`wbToOpen`に格納するためです。これにより、後続の処理で開いたブックに対して名前やシートを参照できるようになります。

サンプルコード:読み取り専用でブックを開く

共有されているブックや、誤って編集してしまうのを防ぎたい場合に便利です。

Sub OpenReadOnly()

Dim wbReadOnly As Workbook
Dim filePath As String

filePath = “C:\Users\YourUser\Documents\ReadOnlySample.xlsx”

If Dir(filePath) <> “” Then
‘ 読み取り専用でブックを開く
Set wbReadOnly = Application.Workbooks.Open(FileName:=filePath, ReadOnly:=True)
MsgBox wbReadOnly.Name & ” を読み取り専用で開きました。”
Else
MsgBox “指定されたファイルが見つかりません: ” & filePath
End If

End Sub

`ReadOnly:=True`を指定することで、ユーザーが保存しようとしても「読み取り専用で保存しますか?」というメッセージが表示され、上書き保存できなくなります。

サンプルコード:パスワード付きブックを開く

パスワードで保護されたブックを開く場合に使用します。

Sub OpenWithPassword()

Dim wbWithPassword As Workbook
Dim filePath As String
Dim password As String

filePath = “C:\Users\YourUser\Documents\SecureData.xlsx”
password = “your_password” ‘ ブックのパスワードを指定

If Dir(filePath) <> “” Then
On Error Resume Next ‘ パスワードが間違っている場合のエラーを回避
Set wbWithPassword = Application.Workbooks.Open(FileName:=filePath, Password:=password)
On Error GoTo 0 ‘ エラーハンドリングを元に戻す

If wbWithPassword Is Nothing Then
MsgBox “パスワードが間違っているか、ブックを開けませんでした。”
Else
MsgBox wbWithPassword.Name & ” を開きました。”
End If
Else
MsgBox “指定されたファイルが見つかりません: ” & filePath
End If

End Sub

パスワードが間違っている場合、`Open`メソッドはエラーを発生させます。そのため、`On Error Resume Next`を使用してエラーを一時的に無視し、`wbWithPassword Is Nothing`でブックが正常に開けたかどうかを確認しています。

注意点:フルパスの指定

`FileName`引数には、必ず開きたいブックの**フルパス**を指定する必要があります。相対パスで指定した場合、VBAコードが実行されているブックの場所によっては意図したブックが開かれないことがあります。

Closeメソッドによるブックの閉じ方

`Close`メソッドは、開いているブックを閉じるためのメソッドです。これは`Workbook`オブジェクトのメソッドとして使用します。

基本的な構文

Workbook.Close(SaveChanges, Filename, RouteWorkbook)

各引数の概要は以下の通りです。

* **SaveChanges**: ブックを閉じる際に変更を保存するかどうかを指定します。
* `True`: 変更を保存します。保存されていない変更がある場合、保存するかどうかを尋ねるメッセージが表示されることもあります。
* `False`: 変更を保存しません。変更があった場合でも破棄されます。
* `xlDoNotSaveChanges`: 変更を保存しない(`False`と同義)。
* `xlSaveChanges`: 変更を保存する(`True`と同義)。
* `xlDoNotPrompt`: 変更を保存するかどうかをユーザーに尋ねない。変更があれば自動的に保存されます。
* **Filename**: `SaveChanges`が`True`の場合、別の名前で保存したい場合に指定します。通常は省略し、元のファイル名で保存します。
* **RouteWorkbook**: ブックをルーティング(メール送信など)する場合に指定します。通常は省略します。

サンプルコード:ブックを閉じる(変更を保存)

開いているブックの変更を保存して閉じます。

Sub CloseAndSave()

Dim wbToClose As Workbook
Dim filePath As String

filePath = “C:\Users\YourUser\Documents\DataToSave.xlsx”

‘ まず、対象のブックを開く(例として)
If Dir(filePath) <> “” Then
Set wbToClose = Application.Workbooks.Open(FileName:=filePath)

‘ 何らかの処理でブックに変更を加える(例)
wbToClose.Sheets(“Sheet1”).Cells(1, 1).Value = “Saved Change”

‘ ブックを閉じる(変更を保存)
wbToClose.Close SaveChanges:=True

MsgBox filePath & ” を変更を保存して閉じました。”
Else
MsgBox “指定されたファイルが見つかりません: ” & filePath
End If

End Sub

この例では、ブックを開いた後、セルに値を書き込むことで変更を加えています。そして`wbToClose.Close SaveChanges:=True`で、その変更を保存してブックを閉じています。

サンプルコード:ブックを閉じる(変更を無視)

開いているブックの変更を保存せずに閉じます。

Sub CloseWithoutSaving()

Dim wbToClose As Workbook
Dim filePath As String

filePath = “C:\Users\YourUser\Documents\TempData.xlsx”

If Dir(filePath) <> “” Then
Set wbToClose = Application.Workbooks.Open(FileName:=filePath)

‘ 何らかの処理でブックに変更を加える(例)
wbToClose.Sheets(“Sheet1”).Cells(1, 1).Value = “Discarded Change”

‘ ブックを閉じる(変更を保存しない)
wbToClose.Close SaveChanges:=False

MsgBox filePath & ” を変更を保存せずに閉じました。”
Else
MsgBox “指定されたファイルが見つかりません: ” & filePath
End If

End Sub

`SaveChanges:=False`を指定することで、保存されていない変更はすべて破棄されます。

サンプルコード:現在アクティブなブックを閉じる

現在アクティブなブックを閉じたい場合は、`ThisWorkbook`(VBAコードが記述されているブック)や`ActiveWorkbook`(現在アクティブなブック)を使用します。

Sub CloseActiveWorkbook()

‘ 現在アクティブなブックを閉じる(変更を保存)
‘ VBAコードが書かれているブック自身を閉じたい場合は、ThisWorkbook.Close SaveChanges:=True
‘ 他のブックが開かれていてそれがアクティブになっている場合は、ActiveWorkbook.Close SaveChanges:=True
If Not ActiveWorkbook Is Nothing Then
ActiveWorkbook.Close SaveChanges:=True
MsgBox “アクティブなブックを閉じました。”
Else
MsgBox “アクティブなブックがありません。”
End If

End Sub

**注意**: VBAコードが書かれているブック(`ThisWorkbook`)を`ActiveWorkbook.Close`で閉じようとすると、VBAプロジェクト自体が終了してしまう可能性があります。安全のため、`ThisWorkbook.Close`を使用するのが一般的です。

Sub CloseThisWorkbook()
‘ VBAコードが記述されているブック自身を閉じる(変更を保存)
ThisWorkbook.Close SaveChanges:=True
End Sub

サンプルコード:特定のブックを閉じる(指定した名前)

ブック名で指定して閉じたい場合です。

Sub CloseByName()

Dim wbName As String
Dim targetWorkbook As Workbook

‘ 閉じたいブックの名前を指定
wbName = “SampleData.xlsx” ‘ 拡張子も含めて指定

On Error Resume Next
Set targetWorkbook = Application.Workbooks(wbName)
On Error GoTo 0

If Not targetWorkbook Is Nothing Then
‘ ブックが開かれていたら閉じる
targetWorkbook.Close SaveChanges:=True
MsgBox wbName & ” を閉じました。”
Else
MsgBox wbName & ” は開かれていません。”
End If

End Sub

`Application.Workbooks(wbName)`で、開いているブックコレクションから指定した名前のブックオブジェクトを取得します。ブックが存在しない(開かれていない)場合はエラーが発生するため、`On Error Resume Next`でエラーを回避し、`targetWorkbook Is Nothing`でブックが開かれているかを確認しています。

実務で役立つ応用テクニックと注意点

ここからは、実際の業務で遭遇する可能性のあるシナリオや、より堅牢なコードを作成するためのヒントをご紹介します。

1. ブックが開かれているかどうかの確認

`Open`メソッドでブックを開く前に、既に開かれていないかを確認することは非常に重要です。同じブックを複数回開こうとするとエラーになったり、予期せぬ動作を引き起こしたりする可能性があります。

Function IsWorkbookAlreadyOpen(ByVal workbookName As String) As Boolean
Dim wb As Workbook
IsWorkbookAlreadyOpen = False
On Error Resume Next
Set wb = Application.Workbooks(workbookName)
On Error GoTo 0
If Not wb Is Nothing Then
IsWorkbookAlreadyOpen = True
End If
End Function

Sub OpenOrActivateWorkbook()

Dim filePath As String
Dim workbookName As String
Dim targetWorkbook As Workbook

filePath = “C:\Users\YourUser\Documents\SharedReport.xlsx”
‘ ファイル名のみを取得
workbookName = Mid(filePath, InStrRev(filePath, “\”) + 1)

If IsWorkbookAlreadyOpen(workbookName) Then
‘ ブックが既に開かれている場合はアクティブにする
Set targetWorkbook = Application.Workbooks(workbookName)
targetWorkbook.Activate
MsgBox workbookName & ” は既に開かれています。アクティブにしました。”
Else
‘ ブックが開かれていない場合は開く
If Dir(filePath) <> “” Then
Set targetWorkbook = Application.Workbooks.Open(FileName:=filePath)
MsgBox workbookName & ” を開きました。”
Else
MsgBox “ファイルが見つかりません: ” & filePath
End If
End If

End Sub

`IsWorkbookAlreadyOpen`という関数を作成し、ブック名を受け取って開かれているかどうかを判定するようにしました。この関数を使うことで、コードがスッキリし、再利用性も高まります。

2. エラーハンドリングの徹底

ファイルが存在しない、パスワードが間違っている、ネットワーク上のファイルにアクセスできないなど、ブックの操作中には様々なエラーが発生する可能性があります。`On Error Resume Next`と`On Error GoTo 0`を適切に組み合わせ、エラー発生時の処理を定義することが、安定したVBAコードを作成する上で不可欠です。

Sub RobustOpenClose()

Dim wbPath As String
Dim openedWb As Workbook

wbPath = “C:\Users\YourUser\Documents\CriticalData.xlsx”

‘ — ブックを開く処理 —
On Error Resume Next
‘ 読み取り専用で開くことを試みる
Set openedWb = Application.Workbooks.Open(FileName:=wbPath, ReadOnly:=True)
On Error GoTo 0 ‘ エラーハンドリングを元に戻す

If openedWb Is Nothing Then
MsgBox “エラー: ” & wbPath & ” を開けませんでした。ファイルが存在しないか、アクセス権がない可能性があります。”, vbCritical
Exit Sub ‘ 処理を中断
Else
MsgBox openedWb.Name & ” を開きました。”, vbInformation
‘ ここで開いたブックに対する処理を行う
‘ 例: Dim data As Variant
‘ data = openedWb.Sheets(1).Cells(1, 1).Value
End If

‘ — ブックを閉じる処理 —
‘ 開いたブックがまだ存在するか確認(念のため)
If Not openedWb Is Nothing Then
On Error Resume Next
‘ 変更を保存せずに閉じる
openedWb.Close SaveChanges:=False
On Error GoTo 0

If Err.Number <> 0 Then
MsgBox “エラー: ” & openedWb.Name & ” を閉じる際に問題が発生しました。”, vbExclamation
‘ エラーが発生しても、後続の処理を続けるか、ここでExit Subするかは要件による
Else
MsgBox openedWb.Name & ” を閉じました。”, vbInformation
End If
End If

End Sub

この例では、ブックを開く前と閉じた後にエラーが発生していないかを確認しています。`openedWb Is Nothing`や`Err.Number`を確認することで、処理の成否を判定できます。

3. `ScreenUpdating`と`DisplayAlerts`の活用

ブックを開いたり閉じたりする際に、Excelの画面がちらついたり、確認メッセージが表示されたりすることがあります。これらを抑制することで、処理を高速化し、ユーザーフレンドリーな体験を提供できます。

* **`Application.ScreenUpdating = False`**: 画面の更新を停止します。VBAコードの実行中は画面に何も表示されなくなります。処理が終わったら必ず`True`に戻す必要があります。
* **`Application.DisplayAlerts = False`**: Excelの各種アラート(「保存しますか?」など)を非表示にします。これも処理が終わったら必ず`True`に戻す必要があります。

Sub OpenCloseWithOptimizations()

Dim wbPath As String
Dim targetWb As Workbook

wbPath = “C:\Users\YourUser\Documents\LargeData.xlsx”

‘ 画面更新とアラートを無効にする
Application.ScreenUpdating = False
Application.DisplayAlerts = False

On Error GoTo ErrorHandler ‘ エラー発生時の処理へジャンプ

‘ ブックを開く
Set targetWb = Application.Workbooks.Open(FileName:=wbPath)
MsgBox targetWb.Name & ” を開きました。” ‘ このMsgBoxは画面更新が無効なので表示されない

‘ ここでブックに対する処理を行う
‘ 例: targetWb.Sheets(1).Cells(1, 1).Value = “Processed”

‘ ブックを閉じる(変更を保存)
targetWb.Close SaveChanges:=True
MsgBox targetWb.Name & ” を閉じました。” ‘ このMsgBoxも表示されない

‘ 正常終了時の処理
Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox “処理が完了しました。”, vbInformation
Exit Sub ‘ エラーハンドラをスキップして終了

ErrorHandler:
‘ エラー発生時の処理
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
‘ エラーが発生した場合でも、必ず画面更新とアラートを元に戻す
Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

`On Error GoTo ErrorHandler`を使用することで、エラー発生時にも確実に`Application.DisplayAlerts`と`Application.ScreenUpdating`を`True`に戻すことができます。これは非常に重要なプラクティスです。

4. ネットワーク上のファイルへのアクセス

ネットワークドライブ上のファイルを開く場合、アクセス権限やネットワークの遅延が問題になることがあります。`Open`メソッドの実行には時間がかかる可能性があるため、タイムアウト処理などを考慮する必要があるかもしれません。また、ファイルがロックされている(他のユーザーが編集中である)場合もエラーとなります。

5. バックグラウンドでのブック操作

VBAコードを実行しているExcelインスタンスとは別のExcelインスタンスでブックを開きたい場合は、`CreateObject(“Excel.Application”)`を使用して新しいExcelアプリケーションオブジェクトを作成し、そのオブジェクト経由でブックを開く必要があります。これは、Excelの自動化(COM Automation)と呼ばれる高度なテクニックです。

Sub OpenInNewInstance()

Dim excelApp As Object
Dim wb As Object
Dim filePath As String

filePath = “C:\Users\YourUser\Documents\SeparateProcess.xlsx”

‘ 新しいExcelアプリケーションオブジェクトを作成
On Error Resume Next
Set excelApp = CreateObject(“Excel.Application”)
On Error GoTo 0

If excelApp Is Nothing Then
MsgBox “Excelアプリケーションを起動できませんでした。”, vbCritical
Exit Sub
End If

‘ Excelを非表示にする(バックグラウンドで実行)
excelApp.Visible = False
excelApp.DisplayAlerts = False

‘ ブックを開く
On Error Resume Next
Set wb = excelApp.Workbooks.Open(FileName:=filePath)
On Error GoTo 0

If wb Is Nothing Then
MsgBox filePath & ” を開けませんでした。”, vbCritical
excelApp.Quit
Set excelApp = Nothing
Exit Sub
Else
MsgBox wb.Name & ” を別のExcelインスタンスで開きました。”, vbInformation
‘ ここで開いたブックに対する処理を行う
‘ 例: Dim val As Variant
‘ val = wb.Sheets(1).Cells(1, 1).Value
‘ MsgBox “取得した値: ” & val
End If

‘ ブックを閉じる
wb.Close SaveChanges:=False ‘ 例として保存しない

‘ Excelアプリケーションを終了する
excelApp.Quit
Set wb = Nothing
Set excelApp = Nothing

End Sub

このコードは、VBAを実行しているExcelとは別に、新しいExcelプロセスを起動してブックを開きます。`excelApp.Visible = False`とすることで、ユーザーにはExcelの起動が見えません。処理が終わったら`excelApp.Quit`でExcelプロセスを終了させることを忘れないでください。

まとめ

本記事では、Excel VBAにおける`Open`メソッドと`Close`メソッドの基本的な使い方から、応用的なテクニック

タイトルとURLをコピーしました