- ベストアンサー
エクセルVBAで「通知」を選ぶには?
ネットワーク上にあるエクセルファイルを開こうとする場合、誰かが先に開いている場合、「使用中のファイル」というダイアログが出てきて、「xxx.xlsは編集のためロックされています」とメッセージが表示され、ボタンが「読み取り専用」「通知」「キャンセル」と出ます。 通知を選ぶと読み取り専用で開かれ、先に開いた人が終了した場合、OKになった旨の連絡がきます。 この「通知」を選ぶのと同様の操作をVBAで行うにはどのような命令を行ったらよいのでしょうか? 要は「読み取り専用」で開いて、先に開いた人が閉じた場合、メッセージを出したいのですが、どのようにVBAを作ったらよいのでしょうか? よろしくお願い申し上げます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんなのではどうでしょう? >先に開いた人が閉じた場合、メッセージを出したいのです という質問に対する回答ではないのですが・・・ 普通にVBAで Workbooks.Open ファイル で開くと「通知」を選んだ時と同じく読み取り専用で開きます。 先に開いた物を閉じると、「xxx.xlsは編集できるようになりました。どうする?編集?キャンセル?」と表示します。 ただ、VBAからだと「xxx.xlsは編集のためロックされています」とメッセージが表示されません。 自前で開いて判定してメッセージを出します。 編集できるようになった時の処理はシステムに任せます。 Sub sample() Dim file As String file = "\\fumufumu\hoge\Book1.xls" 'ファイル Dim wb As Workbook Set wb = Workbooks.Open(file) If wb.ReadOnly = True Then 'もしも読み取り専用だったら If (GetAttr(file) And vbReadOnly) = 0 Then 'でもファイル属性は読み取り専用じゃなかったら MsgBox "誰か先に使ってるみたいです。" & vbCrLf & "使えるようになったら通知します。", , "使用中のファイル" End If End If End Sub 同じ事なんですが Private Sub sample() Dim file As String file = "\\fumufumu\hoge\Book1.xls" Workbooks.Open file If Workbooks(Mid(file, InStrRev(file, "\") + 1)).ReadOnly = True Then 'もしも読み取り専用だったら If (GetAttr(file) And vbReadOnly) = 0 Then 'でもファイル属性は読み取り専用じゃなかったら MsgBox "誰か先に使ってるみたいです。" & vbCrLf & "使えるようになったら通知します。", , "使用中のファイル" End If End If End Sub
その他の回答 (2)
- fumufumu_2006
- ベストアンサー率66% (163/245)
>欲を言うと、誰が使っているか知りたいのですが、VBAからは無理なようですね。 http://homepage2.nifty.com/kmado/ke_m11.htm の「ネットワーク上のブックを開いているユーザー名を得る」 これは、ダイアログの「使用者は???」というメッセージをつかまえて???の部分を表示しているようです。 また、開くときに、 Workbooks.Open(Filename:="\\??\??.xls", Notify:=False) で開くと、誰かが使っていると、誰が開いているか表示します。 でも、開くかどうかを選択するダイアログが出てしまいますが・・・ Excelは「使用者は???」と表示しているので、何か調べる方法はあるんじゃないかと思います。 でも、わかりませんでしたが・・・
- imogasi
- ベストアンサー率27% (4737/17069)
本来の機能で「通知」が出る体制になっているのに、ユーザー側(VBAの実行側)でそれを出せるとして、出すと両方が出す羽目になるのでは。だからシステム側を(待機状態を)抑止しないとならないが、そこまでユーザーがやるべきでなく、やらしてくれないように思うが。>先に開いた人が終了した場合、は事実の問題だから、なぜVBA側が乗り出すのか。 素人ながら疑問を呈します。 具体的にそれが必要なケースはどんなものか、補足しておいたらどうですか?
補足
回答ありがとうございます。 職場での伝達文書、設計書などの9割方はエクセルファイルです。 ノーツのメールでショートカットで送られてきて、エクセルファイル本体はネットワーク上にある複数台の様々なフォルダに保管されています。 文書の忘備録のようなものをエクセルで作っています。 具体的には該当文書を開いている時に、プルダウンメニューに組み込まれたVBA「資料の場所を記録」を実行すると、開いているエクセルファイルの場所を忘備録(これもエクセルファイル)に書込みます。 忘備録は3列になっていて、ファイル名、フルパス名、登録日を登録します。 忘備録の該当行を選らんでプルダウンメニュー「該当ファイルを開く」を実行すると、該当ファイルを開きます。 VBAは常に実行しているわけでなく、プルダウンメニューの「記録する」「開く」を実行する時だけです。 そして「開く時」に、通常のファイルメニューからと同様の機能で開きたいのです。(誰がが先に開いている場合の機能) 参考までに・・・ この忘備録は色々な機能を持たせています。 ネットワークはかなり大規模でノーツユーザーは数千人です。 サーバーは数十台です。 現在忘備録は400行以上になっています。 エクセルだけでなく、ワードなど登録可能です。 開く場合、適切なアプリを立ち上げて開きます。 フォルダの場合はエクスプローラを立ち上げて該当のフォルダを開きます。 ファイルを開く場合、読み取り専用と編集可能に分けて開けます。 行の移動、削除もメニュー化しています。 ノーツメールでエクセル本体が添付で来ている場合、Cドライブに保管します。 削除する場合、Cドライブにファイルがある場合、オプションで同時に消すことも可能です。 忘備録に登録する際、既に登録済みの場合、その旨のメッセージを出し、忘備録の最後に移動するか確認します。 忘備録の最後の方に近日中に登録されたもの、及び重要なものを持ってくるようにしています。
お礼
回答ありがとうございます。 「xxx.xlsは編集のためロックされています」が出なかったので、てっきりメッセージが返って来ないものと思い込んでいました。 今日職場で試してみたところ、メッセージが返って来ることを確認しました。 欲を言うと、誰が使っているか知りたいのですが、VBAからは無理なようですね。 コマンドラインか何かで外部的にエクセルを立ち上げて、誰が使っているか表示するようなことはできないでしょうか? とりあえず現在は、誰かが使っている時は、そのまま使うか、または一旦該当ブックを閉じ、該当のフォルダを開くエクスプローラを起動して、通常の開き方を選べるようにしています。