ブックを開く


ブックを開くには、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という名前のブックを開いているとき

です。

エラーで止まるマクロは最低です。何とかエラーにならないよう工夫しましょう。まず「ファイルが存在しないとき」のエラー対策です。

ファイルが存在しないときのエラー対策

"存在しない"といっても、いろいろなケースが考えられます。誰かが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