Excel VBAでファイルを開く方法をお探しですね。
広告
Excel VBAで別ファイルを開く方法【読み取り専用で安全に扱うコツ】
Excel VBAで別ファイルのブックを開く処理は、集計表から元データを読み込んだり、複数のファイルを順番にチェックしたり、マスターブックを参照したりと、いろんな場面で使います。
特に仕事で使うマクロでは、開いたファイルを間違って上書きしないように「読み取り専用」で開くのがとても大切です。
この記事では、Workbooks.Openメソッドの基本から、読み取り専用で開く方法、開いたブックを変数で扱う方法、エラー対策や閉じ方まで、初心者の方にも分かりやすく解説していきます。
Excel VBAで別ファイルを開く基本は「Workbooks.Open」
Excel VBAで別のExcelファイルを開くには、**Workbooks.Open**メソッドを使います。
`Workbooks`は今開いているExcelブック全体のことで、`Open`は指定した場所にあるファイルを開く命令です。
例えば、Cドライブの「vba」フォルダにある「sample.xlsx」を開きたいときは、こんな風に書きます。
“`vba
Workbooks.Open “C:\vba\sample.xlsx”
“`
基本の書き方はすごくシンプルですよね。
でも実際の仕事では、「開いたブックをあとで操作したい」ってことがほとんどです。
そんなときは、開いたブックを**Workbook型の変数**に入れておくと安全です。
変数に入れておけば、どのブックを操作しているのかがはっきりするので、間違いが起きにくくなります。
`ActiveWorkbook`(今アクティブなブック)に頼ると、途中でユーザーが別のブックをクリックしたときに、意図しないブックを操作しちゃう可能性があるんです。
“`vba
Sub OpenWorkbookBasic()
Dim wb As Workbook
Dim filePath As String
filePath = “C:\vba\sample.xlsx”
‘ ファイルを開いて、変数wbに入れる
Set wb = Workbooks.Open(filePath)
‘ 開いたブックのSheet1のA1セルを見る例
MsgBox wb.Worksheets(“Sheet1”).Range(“A1”).Value
End Sub
“`
こうやって`Set wb = Workbooks.Open(filePath)`と書くことで、開いた別ファイルを`wb`という名前で扱えるようになります。
あとは`wb.Worksheets(“Sheet1”)`みたいに指定できるので、今使ってるマクロブックと、読み込み対象の別ブックを混同しにくくなるんです。
Excel VBAでは、ブックを開くこと自体よりも**「開いた後にどのブックを操作してるか」をはっきりさせること**が、ミスを防ぐ大きなポイントになります。
別ファイルを読み取り専用で開くには「ReadOnly:=True」
Excel VBAで別ファイルを読み取り専用で開くには、`Workbooks.Open`メソッドに**ReadOnly:=True**という引数を付けます。
読み取り専用っていうのは、ファイルの中身を見たり値を取得したりはできるけど、元のファイルにそのまま上書き保存できない開き方のことです。
参照用のマスターファイルとか、他の部署が管理してる集計ファイルなんかを扱うときに、間違って更新しちゃうのを防げるのですごく便利です。
書き方は難しくありません。
いつもの`Workbooks.Open`に`ReadOnly:=True`を追加するだけです。
“`vba
Sub OpenWorkbookReadOnly()
Dim wb As Workbook
Dim filePath As String
filePath = “C:\vba\sample.xlsx”
‘ 読み取り専用で開く
Set wb = Workbooks.Open(Filename:=filePath, ReadOnly:=True)
‘ 読み取り専用で開いたブックから値を取得
MsgBox wb.Worksheets(“Sheet1”).Range(“A1”).Value
‘ 保存せずに閉じる
wb.Close SaveChanges:=False
End Sub
“`
引数に名前を付けて書くと(`ReadOnly:=True`みたいに)、何の設定をしてるのかが分かりやすくなります。
VBAでは引数を順番で指定することもできますが、名前付きで書いたほうが、後から見返したときに意図が伝わりやすくて、メンテナンスしやすいコードになりますよ。
読み取り専用で開いたブックは、基本的に元ファイルに上書き保存する前提じゃありません。
だから処理が終わったら、`wb.Close SaveChanges:=False`で**保存せずに閉じる**のが一般的です。
読み取り専用で開いていても、VBA上ではセルの値を書き換える処理自体はできちゃう場合があります。
でも元ファイルに保存する目的では使わないほうが安全です。
データを参照するだけなら、最後に保存確認が出ないように`SaveChanges:=False`をはっきり書いて閉じると、マクロの実行が安定します。
読み取り専用で開くもう一つのメリット
読み取り専用で開くことには、もう一つ良いことがあります。
**別のユーザーが同じファイルを使ってる場合でも、読み取り専用なら開ける可能性が高い**んです。
共有フォルダ上のExcelファイルを参照する仕事では、誰かが編集中でファイルをロックしてることも珍しくありません。
読み取り専用を指定しておくと、参照処理としての性格がはっきりして、無駄な保存の競合や更新ミスを避けやすくなります。
ファイルパスの指定方法と実務で使いやすい書き方
別ファイルを開く処理でつまずきやすいのが、**ファイルパスの指定**です。
ファイルパスっていうのは、対象ファイルがどこに保存されてるかを示す文字列のことです。
例えば`C:\vba\sample.xlsx`みたいな絶対パスを指定すれば、VBAはその場所にあるブックを開こうとします。
でも、別のPCで実行する場合や、ユーザー名が変わる場合には、固定のパスだとうまく動かないことがあるんです。
ユーザーフォルダを使う方法
ユーザーのドキュメントフォルダにあるファイルを開きたい場合は、**Environ(“USERPROFILE”)**を使うと便利です。
これはWindowsのユーザーフォルダのパスを取得する方法で、例えば`C:\Users\ユーザー名`みたいな場所を返してくれます。
これを使えば、PCごとにユーザー名が違っても、ドキュメントフォルダ内のファイルを柔軟に指定できます。
“`vba
Sub OpenFromDocumentsReadOnly()
Dim wb As Workbook
Dim filePath As String
‘ ドキュメントフォルダ内のファイルを指定
filePath = Environ(“USERPROFILE”) & “\Documents\sample.xlsx”
Set wb = Workbooks.Open(Filename:=filePath, ReadOnly:=True)
MsgBox “開いたブック名:” & wb.Name
wb.Close SaveChanges:=False
End Sub
“`
マクロと同じフォルダのファイルを開く方法
マクロが保存されてるブックと同じフォルダにある別ファイルを開くなら、**ThisWorkbook.Path**を使う方法もあります。
`ThisWorkbook`はマクロが書かれてるブックのことで、`Path`はその保存フォルダを返してくれます。
例えば、マクロブックと同じフォルダに「data.xlsx」がある場合は、`ThisWorkbook.Path & “\data.xlsx”`と書けば対象ファイルを指定できます。
配布用のマクロや、フォルダごと運用するツールではこの書き方が扱いやすいです。
“`vba
Sub OpenSameFolderWorkbook()
Dim wb As Workbook
Dim filePath As String
‘ マクロと同じフォルダのファイルを指定
filePath = ThisWorkbook.Path & “\data.xlsx”
Set wb = Workbooks.Open(Filename:=filePath, ReadOnly:=True)
‘ 必要な処理をここに書く
wb.Close SaveChanges:=False
End Sub
“`
ファイルの存在確認をしてから開く
実務では、パスが間違ってる、ファイル名が変更されてる、拡張子がxlsxじゃなくてxlsmだった、共有フォルダへのアクセス権限がない、といった理由でファイルを開けないことがあります。
そのため、いきなり`Workbooks.Open`を実行するんじゃなくて、**Dir関数でファイルの存在確認**をしてから開くと親切です。
`Dir(filePath)`が空文字だったら、そのパスにファイルが存在しないって判断できます。
“`vba
Sub OpenReadOnlyWithFileCheck()
Dim wb As Workbook
Dim filePath As String
filePath = ThisWorkbook.Path & “\data.xlsx”
‘ ファイルが存在するかチェック
If Dir(filePath) = “” Then
MsgBox “指定したファイルが見つかりません。
” & vbCrLf & filePath
Exit Sub
End If
Set wb = Workbooks.Open(Filename:=filePath, ReadOnly:=True)
‘ 必要な処理をここに書く
wb.Close SaveChanges:=False
End Sub
“`
こんな風に、ファイルパスは固定で書くだけじゃなくて、実行環境に合わせて組み立てることが大切です。
特に複数人で使うマクロでは、自分のPCだけで動くコードじゃなくて、他のユーザーの環境でも動きやすい書き方を意識すると、運用後のトラブルを減らせますよ。
エラー対策と閉じ忘れを防ぐ安全なコード
別ファイルを開くVBAでは、**エラー対策**もすごく大事です。
ファイルが存在しない、すでに壊れてる、パスにアクセスできない、パスワードが設定されてる、ネットワークドライブが切断されてる…など、`Workbooks.Open`で失敗する原因はいろいろあります。
エラーが起きたときに処理が途中で止まるだけならまだいいですが、開いたブックが閉じられずに残ったり、Excelの状態が中途半端になったりすると、使う人にとって分かりにくいトラブルになっちゃいます。
安全に書くポイント
安全に書くには、**On Error GoTo**でエラー発生時の処理先を用意して、開いたブックがある場合は保存せずに閉じるようにします。
特に読み取り専用で開いたブックは、参照が終われば閉じるのが基本です。
また、開いたブックを変数`wb`に保持しておけば、エラー時にも`If Not wb Is Nothing Then`で開いてるかどうかを確認できます。
(`Nothing`はオブジェクト変数に何もセットされてない状態のことです)
“`vba
Sub SafeOpenReadOnlyWorkbook()
On Error GoTo ErrorHandler
Dim wb As Workbook
Dim filePath As String
filePath = ThisWorkbook.Path & “\data.xlsx”
‘ ファイルの存在確認
If Dir(filePath) = “” Then
MsgBox “ファイルが見つかりません。
” & vbCrLf & filePath
Exit Sub
End If
‘ 読み取り専用で開く
Set wb = Workbooks.Open(Filename:=filePath, ReadOnly:=True)
‘ ここに読み取り処理を書く
MsgBox wb.Worksheets(1).Range(“A1”).Value
‘ 保存せずに閉じる
wb.Close SaveChanges:=False
Set wb = Nothing
MsgBox “処理が完了しました。
”
Exit Sub
ErrorHandler:
‘ エラーが起きたときの処理
If Not wb Is Nothing Then
On Error Resume Next
wb.Close SaveChanges:=False
On Error GoTo 0
End If
MsgBox “エラーが発生しました。
” & vbCrLf & Err.Description
End Sub
“`
このサンプルでは、最初にファイルの存在確認を行って、対象ファイルがなければメッセージを表示して処理を終了します。
ファイルが存在する場合だけ読み取り専用で開いて、必要な値を取得したあと、保存せずに閉じます。
途中でエラーが発生した場合でも、`ErrorHandler`に処理が移って、ブックが開かれてれば閉じるので、閉じ忘れを防ぎやすくなってます。
まとめ:読み取り専用で安全に別ファイルを扱おう
読み取り専用で開く処理は、単に`ReadOnly:=True`を追加するだけなら簡単です。
でも実務で安定して使うには、こんな流れまで含めて考える必要があります。
– ブックを変数に入れる
– ファイルパスを環境に合わせて作る
– ファイルの存在を確認する
– 最後に保存せず閉じる
– エラー時にも後片付けする
Excel VBAで別ファイルを開くマクロを作るときは、まず「参照だけでいいのか、更新が必要なのか」を整理しましょう。
参照だけなら**読み取り専用を基本**にすると安全です。
関連して学ぶなら、こんなことも押さえておくと理解が深まります。
– ブックを閉じる`Close`メソッド
– ファイル存在確認に使う`Dir`関数
– 開いてるブックを指定する`Workbook`オブジェクト
– シートやセルを参照する`Worksheets`と`Range`の使い方
これらを組み合わせることで、別ブックからデータを読み込むマクロや、複数ファイルを順番に集計するマクロにも応用できます。
まずは今回の基本コードを自分のフォルダ構成に合わせて書き換えて、読み取り専用で安全に別ファイルを開く形から試してみてくださいね!
広告
