ブックを開くには、WorkbooksコレクションのOpenメソッドを使います。
Excelでは、同時に複数のブックを開くことができます。開いているそれぞれのブックはWorkbookオブジェクトとして操作できます。このWorkbookオブジェクトの集合体がWorkbooksコレクションです。新しいブックを開くということは、この集合体に、新しいメンバーを加えるということです。だからWorkbooksコレクションのOpenメソッドです。
次のコードは、C:\Book1.xlsxを開きます。
Sub Sample1 Workbooks.Open "C:\Book1.xlsx" End Sub
Workbooks.Open Filename:="C:\Book1.xlsx"
という書き方もできます。
「Filename:=」の意味や、つけるのとつけないのとでは何が違うかについては、下記ページを参考にしてください。
ごくシンプルなコードですが、このマクロはエラーになる可能性があります。それは
です。
エラーで止まるマクロは最低です。何とかエラーにならないよう工夫しましょう。まず「ファイルが存在しないとき」のエラー対策です。
"存在しない"といっても、いろいろなケースが考えられます。誰かがC:\Book1.xlsxを削除してしまい、本当に存在しないのはもちろん、実は「Book1.xlsx」ではなく「Boook1.xlsx」だったり、本当は「C:\Book1.xlsx」ではなく「D:\Book1.xlsx」だったりと、ファイルは存在してもマクロのコードが間違っていると、やはり同じように、Openメソッドはエラーになります。
こうした実行時エラーについては、下記のページを参考にしてください。
1.エラーを無視する
たとえば、次のような対策が考えられます。とにかくエラーで止まるのだけは何とかしたい・・・というのでしたら、エラーを無視することができます。エラーが起きないようにするのではなく、起きたエラーを無視するんです。それにはOn Error Resume Nextという"おまじない"を使います。
Sub Sample2 On Error Resume Next Workbooks.Open "C:\Book1.xlsx" End Sub
On Error Resume Next以降は、どんなエラーが発生しても無視されます。ただ、それではデバッグなどのときに困りますから、エラーの発生を復活させることもできます。
Sub Sample2_2 On Error Resume Next Workbooks.Open "C:\Book1.xlsx" On Error Goto 0 End Sub
エラーの発生を復活させる"おまじない"はOn Error Goto 0です。最後は半角数字の「0(ゼロ)」です。
2.ファイルの存在を調べる
C:\Book1.xlsxが存在しないときエラーになるのですから、Openメソッドの前に C:\Book1.xlsxが「存在するかどうか」を調べて、存在したら開き、存在しなかったら処理を中止すれば安心ですね。
Sub Sample3() If Dir("C:\Book1.xlsx") <> "" Then Workbooks.Open "C:\Book1.xlsx" Else MsgBox "ファイルが存在しません。", vbExclamation End If End Sub
Dir関数については、下記のページを参考にしてください。
3.名前を指定して開く
開くブックをマクロの中で特定するのではなく、ユーザーに選択してもらう方法です。それには[ファイルを開く]ダイアログボックスを表示するのが確実です。
Sub Sample4() Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") If OpenFileName <> "False" Then Workbooks.Open OpenFileName End If End Sub
[ファイルを開く]ダイアログボックスを表示するGetOpenFilenameステートメントに関しては、下記のページを参考にしてください。
ちなみに、この[ファイルを開く]ダイアログボックスというのは、OfficeのバージョンやWindowsの種類によって異なります。上の図は、かなり古いダイアログボックスですね(^^;
Windows XP+Excel 2003だと、次のようなダイアログボックスが開きます。
参考までに、Windows 7+Excel 2010だと、こんな感じです。
Excelは同時に複数のブックを開くことができますが、同じ名前のブックを開くことはできません。これは、保存されているドライブやフォルダに関係なく、純粋なファイル名で判断されます。したがって「C:\Book1.xlsx」を開いていると「E:\Work\Sub\Book1.xlsx」は開けません。
ただし、まだ名前を付けて保存していない、Excelが便宜的に「Book1」「Book2」などと名付けたブックと、すでに保存されている「Book1.xlsx」は違います。まだ名前を付けて保存していないブックは、どんな形式で保存されるかわかりませんから、まだ拡張子が決まっていません。なので「Book1 <> Book1.xlsx」ということです。
さて、開こうとしているブックと同じ名前のブックを、すでにExcelで開いていると、Openメソッドはエラーになります。
こちらも同じ「エラー番号1004」ですね。
1.すでに開いているブックをチェックする
まず正攻法から。「Book1.xlsx」を開くのなら、現在Excel上に同じ名前のブックが開いていないかどうかをチェックします。それには、開いているすべてのブック(Workbookオブジェクト)の集合体であるWorkbooksコレクションのメンバを、1つずつ確認します。
Sub Sample5() Dim wb As Workbook For Each wb In Workbooks If wb.Name = "Book1.xlsx" Then MsgBox "Book1は、すでに開いています" Exit Sub End If Next wb Workbooks.Open "C:\Book1.xlsx" End Sub
このとき
If wb.Name = "Book1" Then
と拡張子を省略してはいけません。先に書いたとおり「Book1」と「Book1.xlsx」は違います。すでに開いているブックをチェックするとき、拡張子を指定するのを忘れないでください。
2.エラーを無視する
上で紹介したOn Error Resume Nextで、エラーを無視することもできます。
Sub Sample6() On Error Resume Next Workbooks.Open "C:\Book1.xlsx" If Err.Number > 0 Then MsgBox "Book1を開けませんでした" End If End Sub
エラーを無視したからといって、Book1.xlsxが開けなかったことに違いはありません。マクロでブックを開くときは、そのあとで開いたブックを操作するのが一般的です。なので「開けなかったのか?」を判定するべきでしょう。On Error Resume Nextでエラーを無視しても、無視しただけで実際にはエラーが発生しています。エラーが発生したかどうかは、Errオブジェクトを調べればわかります。
ブックを開くというのは、Excelマクロにおいて基本中の基本です。しかし、最もエラーになりやすい操作のひとつでもあります。「○○のはず」という思い込みを捨てて、細心の注意を払ってください。確実に、そして安全にブックを開くには、上記2つのエラー対策を組み合わせれば完璧です。
Sub Sample7() Dim buf As String, wb As Workbook Const Target As String = "C:\Book1.xlsx" ''ファイルの存在チェック buf = Dir(Target) If buf = "" Then MsgBox Target & vbCrLf & "は存在しません", vbExclamation Exit Sub End If ''同名ブックのチェック For Each wb In Workbooks If wb.Name = buf Then MsgBox buf & vbCrLf & "はすでに開いています", vbExclamation Exit Sub End If Next wb ''ここでブックを開く Workbooks.Open Target End Sub