VBA~ワークブックを開こう~Excel
ファイルを開く時はWorkbooks.Openメソッドを使います。
書き方
Workbooks.Open "ファイルパス"
簡単な例
下のコードを実行するとDドライブのサンプル.xlsxが開きます。
Sub test1() Workbooks.Open "D:\サンプル.xlsx" End Sub
エラー回避(ワークブックが存在しない時)
上の簡単な例では指定のワークブックが存在しないときはエラーが表示されます。
ワークブックが存在しないときにメッセージを表示するようにするとエラーが回避できます。下のコードはIf文の条件式にDir関数を使っています。Dir関数はDir(パス,属性)で属性に確認したいファイルの属性に対応した定数を指定します。属性を省略するとパスに一致する標準ファイルが返されるので今回は省略します。パスに確認したいファイルのパスを指定しファイルがあれば、ファイル名を返し、なければ長さ0の文字列""を返します。今回の場合はファイルが存在しない場合にメッセージを表示するので条件式はDir("D:\サンプル.xlsx") = ""になり、Dドライブにサンプル.xlsxというファイルがない場合にメッセージが表示され、Exit Subを実行しコードが終了します。ファイルが存在する場合はDir("D:\サンプル.xlsx") = ""の条件を満たさずIfとEnd Ifの間に書かれたコードは実行しないのでExit Subは実行せずに最後に書かれているWorkbooks.Open "D:\サンプル.xlsx"を実行しDドライブのサンプル.xlsxというワークブックを開きます。
Sub test2() If Dir("D:\サンプル.xlsx") = "" Then MsgBox ("指定のワークブックは存在しません") Exit Sub End If Workbooks.Open "D:\サンプル.xlsx" End Sub
同名のワークブックが開いている時
上の簡単な例では指定のワークブックと同名のワークブックが開いているときは指定のワークブックは開けません。同名のワークブック開いている時はメッセージを表示しましょう。下のコードはallbookというワークブックオブジェクトを格納する変数を宣言しFor Each allbook In Worksheetsですべてのワークブックを取得するまで一つずつ繰り返していきます。filepathという変数に開きたいワークブックのファイルパスを格納し、そのファイルパスからFileSystemObjectオブジェクトのGetFileNameメソッドをつかってsearchという変数に開きたいワークブックの名前を格納し、繰り返しの構文の中でIf文の条件式にallbook.Name = searchで全てのワークブックの中に開きたいワークブックと同じ名前のワークブックがあるか判断しています。同じ名前のワークブックがあればIfとEnd Ifの間に書かれたコードを実行するので"同名のブックが開いています"とメッセージを表示し、Exit Subででコードが終了します。同名のワークブックが開いていない場合はIfとEnd Ifの間に書かれたコードは実行しないのでExit Subは実行せずに最後に書かれているWorkbooks.Open filepathを実行し指定のワークブックを開きます。
Sub test3() Dim allbook As Workbook Dim filepath As String Dim search As String Dim objFSO As Object Set objFSO = CreateObject("Scripting.FileSystemObject") filepath = "D:\サンプル.xlsx" search = objFSO.GetFileName(filepath) For Each allbook In Workbooks If allbook.Name = search Then MsgBox "同名のブックが開いています" Exit Sub End If Next Workbooks.Open filepath End Sub
ワークブックが存在しない時と同名のワークブックが開いている時のメッセージ確認の組み合わせ
上の2つのメッセージ確認を組み合わせると下のコードになります。
Sub test5() Dim allbook As Workbook Dim filepath As String Dim search As String Dim objFSO As Object Set objFSO = CreateObject("Scripting.FileSystemObject") filepath = "D:\サンプル.xlsx" search = objFSO.GetFileName(filepath) If Dir(filepath) = "" Then MsgBox ("指定のワークブックは存在しません") Exit Sub Else For Each allbook In Workbooks If allbook.Name = search Then MsgBox "同名のブックが開いています" Exit Sub End If Next End If Workbooks.Open filepath End Sub