マクロでほかのファイルを開いてうんちゃらかんちゃらする、というのはよくありますよね。
パスワード付きファイルを開く、というのはよくやってたのですが「そういえば、書き込みパスワードがついてるときはどうやって開くんだろう」と思って調べたところWriteResPasswordという引数があることを初めて知りました。
で、この機会によく迷子になるのでWorkbooks.Open関連のところをまとめておくことにしました。
1.エクセルファイルを開く
基本です。
エクセルファイルを開くには
WorkBooks.Open 開きたいファイルのパス
と書きます。
たとえば、Cドライブのテストフォルダの「test」ファイルを開くには
WorkBooks.Open C:\テストフォルダ\test.xlsx
と書きます。
マクロ実行ファイルと同じフォルダにあるtestファイルを開くにはThisWorkBook.Pathが使えます。ThisWorkBook.Pathとエクセルファイル名をつなぐ「¥」を忘れずに!
WorkBooks.Open ThisWorkbook.Path & “\test.xlsx”
拡張子はなくても開くことは開きますが、ちゃんとつけた方がいいでしょう。
田中先生の記事によると、今開いているエクセルブックたちがWorkBooksコレクションであり、WorkBooksコレクションのメソッドOpenでエクセルファイルを開き、WorkBooksコレクションに新たに加える、ということのようです。
だから?という感じですが、実はこれを理解しているとあとあと色々「あ、だからか」とわかることがあります。
Excelでは、同時に複数のブックを開くことができます。開いているそれぞれのブックはWorkbookオブジェクトとして操作できます。このWorkbookオブジェクトの集合体がWorkbooksコレクションです。新しいブックを開くということは、この集合体に、新しいメンバーを加えるということです。だからWorkbooksコレクションのOpenメソッドです。
http://officetanaka.net/excel/vba/file/file01.htm
もっとも簡単なコードです。マクロ実行ファイルと同じフォルダのtestエクセルファイルを開きます。
Sub test()
'エクセルファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\test.xlsx"
Workbooks.Open trgPath
End Sub
WorkBooks.Openには以下の引数があります。
引数 | 省略 | 定数 | 説明 |
Filename | 不可 | – | 開きたいファイルパス |
Password | 可 | – | ファイルパスワード(読み取り)を指定 |
WriteResPassword | 可 | – | ファイルパスワード(書き込み)を指定 |
ReadOnly | 可 | True/False | True:読み取り専用で開く False:読み取り専用で開かない(普通に開く) |
引数を指定して書くと、より丁寧な感じがします。
WorkBooks.Opne 引数名1:=引数, 引数名2:=引数
という感じで書きます
Sub test()
'エクセルファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\test.xlsx"
Workbooks.Open Filename:=trgPath
End Sub
WorkBookオブジェクトを用意しておいて、開いたファイルをWorkBookオブジェクトにセットすることもできます。このあと、開いたブックにあれやこれやする場合にはセットしておいた方が便利ですよね。
Set wbobject = WorkBook.Open(Filename:=trgPath, ReadOnly:=True)
等と書きます。イコールの右側にくる場合は、引数を()でくくらないとエラーになります。
Sub test()
'エクセルファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\test.xlsx"
Dim wb As Workbook
Set wb = Workbooks.Open(trgPath)
End Sub
WorkBooks.openでファイルを開くと、開いたファイルがアクティブになるので、アクティブファイルをどうこうする、という書き方もできます。
Sub test()
'エクセルファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\test.xlsx"
Workbooks.Open trgPath
'開いたエクセルファイル=アクティブブックとなる
With ActiveWorkbook
.Worksheets(1).Range("A1").Value = 1
.Close True
End With
End Sub
2.パスワード付きファイルを開く
パスワード付きファイルを開く場合は引数Passwordにファイルパスワードを指定します。
WorkBooks.Open Filename:=path, Password:=”1234″
パスワードを変数や定数に入れておいて、変数(または定数)で指定することもできます。
pw = “1234”
WorkBooks.Open Filename:=path, Password:=pw
Sub test()
'パスワード付きファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\testPass.xlsx"
Workbooks.Open Filename:=trgPath, Password:="1234"
End Sub
定数でパスワードを指定した例(変数でもいいんですけどね。)
Sub test()
'パスワード付きファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\testPass.xlsx"
'定数pwにファイルパスワードを代入
Const pw As String = "1234"
Workbooks.Open Filename:=trgPath, Password:=pw
End Sub
なお、パスワード付きファイルにパスワードを指定しないでWorkBooks.Openすると、エラーにはならず、パスワード入力画面が開きます。ここでパスワードを入力すると、マクロは次に進みます。

3.書き込みパスワード付きのファイルを開く
書き込みパスワードのついているエクセルファイルを開く、というシーンは読み取りパスワード付きファイルより断然少ないかと思います。
私は自分が更新するけどほかの人もファイルを開いて数字を見たりする可能性のある共有ファイルには書き込みパスワードを設定しています(勝手に変更されて、そのあげくに「間違ってるじゃないか!」と責められたことがあるので)
書き込みパスワード付きファイルを開く場合は引数WriteResPasswordにパスワードを指定します。
WorkBooks.Open Filename:=path, WriteResPassword:=”abc”
Sub test()
'書き込みパスワード付きファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\testWritePass.xlsx"
'定数writePasswordに書き込みパスワードを代入
Const writePassword As String = "abc"
Workbooks.Open Filename:=trgPath, WriteResPassword:=writePassword
End Sub
読み取りパスワードも書き込みパスワードもついているときは両方指定します。
Sub test()
'読み取りパスワード、書き込みパスワード付きファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\testPass2.xlsx"
Workbooks.Open Filename:=trgPath, Password:="12345", WriteResPassword:="abc"
End Sub
なお、「読み取り専用を推奨する」で保存されている場合、読み取り専用で開くことを促すメッセージが出てしまいます。DisplayAlartをFalseにしておくことで、このメッセージが出ることを防げます。
Sub test()
'書き込みパスワード付きファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\testWritePass.xlsx"
'読み取り専用で開けよメッセージを出すのを防止
Application.DisplayAlerts = False
Workbooks.Open Filename:=trgPath, WriteResPassword:="abc"
'アラート出さないを解除
Application.DisplayAlerts = True
End Sub
3.読み取り専用で開く
逆に、開いたファイルに変更を加えるのでなく「ただ内容を読み取りたい」「開いたファイルは原本で、変更は加えるけど別名で保存する」という場合は、読み取り専用で開くのがおススメです。
なにがよいかというと、
・間違って変更を加えることがない
・共有ファイルでもし、ほかのだれかが開いている場合、メッセージが出てマクロが止まる、ということがない

Sub test()
'読み取り専用で開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\test.xlsx"
Dim wb As Workbook
Set wb = Workbooks.Open(filename:=trgPath, ReadOnly:=True)
With wb
'ファイルに変更を加え
.Worksheets(1).Range("A1").Value = 1
'別名保存
.SaveAs Filename:=ThisWorkbook.Path & "\testtest.xlsx"
'閉じる
.Close
End With
End Sub
4.エラー回避
ファイルを開くときに予想できるエラーは回避しておいた方がいいですよね。
予想できるエラー:開こうとするファイルがない!
まず、Dirでファイルがあるかどうかを確認するコードを入れておくといいです。
Dir(ファイルのパス) でファイル名(拡張子付き)が返ります。
指定したファイルパスのファイルがない場合は空白の文字列が返ります。
戻ってきたファイル名が空白だった場合はメッセージを出して処理を終了する、という流れにすることが多いです。
Sub test()
'エクセルファイルを開く
Dim trgPath As String
trgPath = ThisWorkbook.Path & "\test.xlsx"
'開きたいファイルパスが正しいかDirで検査
Dim filename As String
filename = Dir(trgPath)
'Dirの戻り値が空白の場合ファイルパスが正しくないということ
If filename = "" Then
MsgBox "ファイルがありません"
Exit Sub
End If
'Dirの戻り値が空白でない場合はファイルパスが正しいので処理継続
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:=trgPath, ReadOnly:=True)
End Sub
今回は以上になります。
そのうち続編(フォルダ化のファイルを次々開く)をやりたいと思います
お読みいただきありがとうございました。
コメント