- VBAで開いていない時だけブックを開くにはどうすればいいの?
- 開くブックが存在するかどうかも判定したい
- できるだけ記述を簡単にしたい
そこで今回は、VBAでブックが開いていなければ開く方法について紹介します。
開くブックがあるのかどうか、簡単に書くにはどうすればいいのかについても解説するので、まずはコピペして使ってみてください。
VBAでブックが開いていなければ開くサンプルコード
'開く対象ブックのフルパスを指定する
Dim trgtFilePath As String
trgtFilePath = "C:\Sample\Sample2.xlsx"
'フルパスからブック名を取得する
Dim trgtFileName As String
trgtFileName = Dir(trgtFilePath)
'ブックが開いているかどうかのフラグを定義する
Dim flg As Boolean
'ワークブックオブジェクトを定義する
Dim wb As Workbook
'開いている全ブックにループ処理を実行する
For Each wb In Workbooks
'ブックの名前が目的のブック名と一致した場合、処理を実行
If wb.Name = trgtFileName Then
'フラグをTrueにしてループを抜ける
flg = True
Exit For
End If
Next
'フラグがFalseだった場合、ブックを開く
If flg = False Then
Workbooks.Open trgtFilePath
End If
上記サンプルコードでは、ワークブック「Sample2.xlsx」が開いていれば何もしない、開いていなければ新たに開く処理を実行します。VBAでブックが開いていなければ開くコードの解説
'開く対象ブックのフルパスを指定する
Dim trgtFilePath As String
trgtFilePath = "C:\Sample\Sample2.xlsx"
この部分で開きたい対象のブックのフルパスを「trgtFilePath」に定義します。'フルパスからブック名を取得する
Dim trgtFileName As String
trgtFileName = Dir(trgtFilePath)
次に、フルパスからファイル名を抽出できる「Dir」関数を使って「trgtFilePath」からファイル名を取得して、「trgtFileName」に定義します。「Dir」関数については、下記で詳しく解説しているので、読んでみてください。
'ブックが開いているかどうかのフラグを定義する
Dim flg As Boolean
この後の判定処理でブックが開いているかどうかを「True / False」で保持する変数「flg」を定義します。初期値は「False」となります。'ワークブックオブジェクトを定義する
Dim wb As Workbook
'開いている全ブックにループ処理を実行する
For Each wb In Workbooks
'ブックの名前が目的のブック名と一致した場合、処理を実行
If wb.Name = trgtFileName Then
'フラグをTrueにしてループを抜ける
flg = True
Exit For
End If
Next
ここでは、対象のブックが開いているかどうかをループ処理を使って判定しています。具体的には開いている全てのブックの名前を順に取得していき、対象のブック名「trgtFileName」と一致する場合に「flg = True」とする処理です。「For Each wb In Workbooks」で、開いているワークブック(Workbooks)から一つずつワークブック「wb」として処理を実行していきます。ループ内ではまず、「If文」とワークブックの「Name」プロパティを使って、「If wb.Name = trgtFileName Then」という判定を実行します。
これで、「wb」の名前と対象のブック名「trgtFileName」が一致した場合には、「flg = True」とします。また、この時点で残りのワークブックを確認する必要はないので「Exit For」でループ処理を抜けています。
'フラグがFalseだった場合、ブックを開く
If flg = False Then
Workbooks.Open trgtFilePath
End If
ブックが開いているかどうかを保持している変数「flg」が「False」の場合、つまりブックが開いていなかった場合のみ「Workbooks.Open」を実行して、目的のブックを開きます。以上で、ブックが開いていなければ開く処理が実行できました。
VBAでブックが開いていなければ開く際の注意点と応用
開くブックが存在していない時の処理
今回紹介した「ブックが開いていなければ開く」処理には注意点もあります。それは、新たにブックを開こうとした際に、そのブックが存在せず、エラーが発生することです。その場合、次の実行時エラーが発生し、処理が止まってしまいます。
特に、開くブックがあるかどうかわからない時は、次のように開こうとしているブックが存在しているかを判定して、処理を分岐するようにしましょう。
'開く対象ブックのフルパスを指定する
Dim trgtFilePath As String
trgtFilePath = "C:\Sample\Sample2.xlsx"
'フルパスからブック名を取得する
Dim trgtFileName As String
trgtFileName = Dir(trgtFilePath)
'ブックが開いているかどうかのフラグを定義する
Dim flg As Boolean
'ワークブックオブジェクトを定義する
Dim wb As Workbook
'開いている全ブックにループ処理を実行する
For Each wb In Workbooks
'ブックの名前が目的のブック名と一致した場合、処理を実行
If wb.Name = trgtFileName Then
'フラグをTrueにしてループを抜ける
flg = True
Exit For
End If
Next
'フラグがFalseだった場合、ブックを開く
If flg = False Then
'開こうとしているブックがある場合は対象ブックを開く
If Dir(trgtFilePath) <> "" Then
Workbooks.Open trgtFilePath
End If
End If
この時、ブックが存在しているかどうかを判定しているのは「If Dir(trgtFilePath) <> “” Then」の部分です。- 「Dir([フルパス])」
- フルパスが存在する時の返り値 :「ファイル名」
- フルパスが存在しない時の返り値:「””」(空文字列)
ブックが開いているかどうかを取得する自作関数
ブックが開いていなければ開くサンプルを紹介しましたが、対象ブックが開いているかどうかを確認するためにいちいちループ処理を書くのは手間がかかる上、可読性やメンテナンス性も低くなってしまいます。そこで、ブックが開いているかどうかをフラグで返す自作関数を作って、書きやすく、可読性の高いコードに作りかえましょう。
ブックを開いているかを確認する場合、必要なのは「対象ブック名」です。これを利用して、「ブック名」を渡して「True / False」を返す関数を作ることができます。
また、引数の「対象ブック名(wbName)」と比較対象「wb」の名前(wb.Name)を比較する「If文」の条件は「=」ではなく「Like」なので、対象ブック名にはワイルドカードも渡すことができます。
'----------------------------------------------------------
'wbExists
'引数 wbName
'返り値 true/false
'呼び出し元 -
'任意の名前のワークブックがあるか判定
'----------------------------------------------------------
Public Function wbExists(ByVal wbName As String) As Boolean
Dim wb As Workbook
Dim flg As Boolean
For Each wb In Workbooks
If wb.Name Like wbName Then
flg = True
Exit For
End If
Next
wbExists = flg
End Function
上記の自作関数「wbExists」を使うと、冒頭で紹介した「ブックが開いていなければ開く」サンプルコードを次のようにわかりやすく、簡単に書くことができます。'開く対象ブックのフルパスを指定する
Dim trgtFilePath As String
trgtFilePath = "C:\Sample\Sample2.xlsx"
'フルパスからブック名を取得する
Dim trgtFileName As String
trgtFileName = Dir(trgtFilePath)
'wbExistsがFalseだった場合、ブックを開く
If wbExists(trgtFilePath) = False Then
Workbooks.Open trgtFilePath
End If
こうしたよく使う自作関数をまとめて一つのモジュールにしておくと、コピペで自作関数を全て実装することができるので作業効率が上がります。ぜひお気に入りの関数モジュールを作成して、使い回してみてください。例えばこちらの記事では、任意の名前のシートがあるかどうかをフラグで返す自作関数を紹介しています。あわせて見てみてください。
VBAでブックが開いていなければ開くまとめ
今回はVBAでブックが開いていなければ開く方法と下記の注意と応用について紹介しました。VBAでブックが開いていなければ開く際の注意と応用
ブックが開いていなければ開く処理は汎用性が高いので、まずはコピペで使ってみましょう。- 開くブックが存在していない時の処理
- ブックが開いているかどうかを取得する自作関数
ただ、判定にループ処理が必要で煩雑になりやすいので、短いコードになるよう、自作関数「wbExists」もあわせて使ってみてください。