サーバーのブックが開かれているかを調べるには?

Question 40.3   Previous Next
はじめまして、早速ですが誰か教えてください。
ネットワークでつながった他のコンピューターのエクセルブックが、ほかの人が使っている(開いている?)かどうかをマクロで調べたいんですが、それは可能なのでしょうか?

サーバーにデータベースとなるブックを作り、そのブックに入力・修正などをするVBAを作っているのですけど、他の人が修正などの為にデーターベースにデータを送っている(開いている)時に、他の人が同時にデータを送ると後の人のデータが無視されてしまうのか、2重に開こうとしているとメッセージが出るのかわかりませんが、(試してみた事が無いので申し訳ありません。) それを防ぐ為にデータを送る前にデータベースが開いていないかを調べて、開いていたら再度データを送り直すというようにVBAを作りたいのです。

ブックの共有については知識がありませんので、共有で解決できるのかもわかりません。けれどもデータベース(ブック)の状態がわかれば自分の頭の中で解決できると思います。
どうかお助けください。お願い致します。
Answer  Win95 & Excel2000クライアントにて動作確認 Copyright (C) 2001.4.16 永井善王
ほかの人と共同で使用するブックは、サーバーに格納しておくか、ネットワークコンピュータの共有フォルダーなどに格納しておきます。
そうしておけば、そのネットワークに接続できる人は、そこに格納されているブックを自身のパソコンで開くことが可能になります。しかし、ほかの人が先に開いていると、読み取り専用としてしか開けません。
使用中のファイルダイアログボックス
この場合は、左図のようなダイアログボックスが表示され、そのファイルが使用中であることと、誰が使っているのかを知ることができます。

そして、[読み取り専用] または [通知] ボタンのどちらかをクリックすれば、そのブックを開くことが可能です。
どちらのボタンをクリックしても、ブックは読み取り専用で開かれます。もしも、開いたブックの内容を編集(変更)したいのであれば、[通知]ボタンをクリックします。
ファイル使用可能ダイアログボックス
そうすると、ほかの人がそのブックを閉じると、右図のようなダイアログボックスが表示されるので、必要な編集を行って上書き保存することが可能になります。

しかし、ご質問は、こうした手順によるのではなく、ブックがすでに開かれているかどうかを調べる方法を知りたいという希望です。これについて、Excel VBA Board (掲示板) にて活発な応答が行われました。そして最終的に、すばらしい回答が提供されました。ご本人の承諾のもとに、下記のとおり掲載させていただきます。
ReadOnlyプロパティを使う方法 ムラジロ~
ブックを開く→ブックのReadOnlyプロパティを取得する→Trueならば他で開かれている、Falseならば他で開かれていないと判断できます。
    With Workbooks.Open("***.xls")
        If .ReadOnly Then .Close False
    End With
上図の「ファイル使用可能」ダイアログボックスは、先にブックを開いていた人がそのブックを閉じると、後で開いていた人の画面に表示されるものですが、Excel は実際には定期的にチェックしているようなので、ちょっと遅れて表示されます。また、これを非表示にするのはちょっと厄介ですね。 (この部分の文章は、この頁内の連続性を保つため Y.Nagaiが加筆しました)
Comment   Copyright (C) 2001.4.26 Yoshioh Nagai
ムラジロ~さんのマクロを実行してみると、他の人がブックを開いていても「使用中のファイル」ダイアログボックスが表示されることなく、処理が進むことが分かります。このサンプルではブックを閉じるだけにとどめていますが当然、その後に任意の処理を行うことが可能です。
なお、マクロコードの 1行目の *** の部分にはブック名を記入します。そこにはパスを含めることができますから、ネットワークドライブの割り当てがしてある場合には、そのドライブ番号を使って次のように書くことができます。下例ではドライブ番号に E、フォルダー名に A、ブック名に DB を指定しています。
    With Workbooks.Open("E:\A\DB.xls")
ネットワークドライブの割り当てがしてない場合には、次のように書き表わします。下例ではサーバー名を Server1 と仮定し、フォルダー名とブック名は上例と同じです。
    With Workbooks.Open("\\Server1\A\DB.xls")
Excel VBA Boardで参加していただいた皆様、ありがとうございました。
【参考ページ】
サーバーのブックを利用状況に合わせて開く

 

Excel VBA Macro