ブックが開かれているかチェックする

ブックが開いているかのチェック方法は2種類

VBAでブックを開く処理を行うことがありますが、すでに開いている場合はエラーとなってしまいます。そのため事前に開いているかどうかの判定が必要になります。

チェック方法には2種類あります。1つはここで紹介する高速で確実にチェックする方法です。こちらをおすすめします。

もう1つは一般的に紹介されているWorkbooksオブジェクトを使った方法です。一応こちらも紹介しますがおすすめしません。

なお、ブックが開いているかをチェックする前に、そのブックが存在しているかどうかのチェックが必要な場合もあります。その場合は「VBAでファイルの存在をチェックする」を参照してください。

高速で確実なチェック方法

このブックが開いているかチェックするマクロは、追記モードでテキストファイルとして開くとOpen済みの場合はエラーになることを利用しています。

ブックのファイルサイズに関係ないため高速です。

また、指定ファイルパスに対して直接チェックが働くため、Excelが複数起動していても問題なく動作します。

使い方はこのような感じになります。例として、ブックを開く関数のOpenExcelBookを紹介します。

ブックが開いていればそれを選択し、閉じていれば開きます。



おすすめしないチェック方法

一般的に紹介されるコードは以下のものが多いですが、この方法はおすすめしません。

チェックするブックのファイルパスが、現在開いているワークブックの中に同じファイルパスがあるかをチェックする方法です。

ぱっと見た感じでは問題がないように思うため、よく紹介されているのでしょうけど、この方法は2つの問題があります。

問題1:開いているブックの数に比例して遅くなる

このチェック方法では処理速度が一定せず、開いているブックの数に比例して遅くなります。

複数のブックが開いている中で、ブックの名前を1つずつチェックしていくループ処理を行っていますが、一致しない関係ないファイルもチェックしていることになり無駄な処理をしていることになります。

問題2:正しくチェックできない場合がある

もう1つの問題はこのチェック方法にはチェックが効かないという致命的な欠陥があることです。

このチェック方法はExcelが1つしか起動していないことを前提としているため、Excelが複数起動している場合にチェック処理を行うExcelプロセスとは別のExcelでチェック対象のブックが開いていてもチェックが働きません。

開いているExcelプロセスを列挙することはできますが、ここまでくると面倒ですし本末転倒ですね。

関連記事

サブコンテンツ

このページの先頭へ