[[20150622074407]] 『ブックの二重起動を自動的に防止する』(アルマール) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ブックの二重起動を自動的に防止する』(アルマール)

 あるブックが開いている状態で、同じブックを開こうとすると、

 「○×.xlsx は既に開いています。2 重に開くと、これまでの変更内容は破棄されます。○×.xlsx を開きますか?」

 というメッセージが表示されます。
 これを警告を表示せず重複起動を防止するにはどうしたらいいでしょうか?

 つまり、既にブックが開いている場合は、アイコンのWクリックなどでそのブックを開こうとしても何も起こら
 ない、というようにしたいのです。

 フォルダですと、既に開いているフォルダを開こうとすると二重に開かずに、既に開いているフォルダが最前面
 に表示されます。

 エクセルの場合は、最前面にできたら理想的ですが、とにかく二重起動はを自動的に防止したいのです。
 設定で出来るのかとと思い探しましたがわかりませんでした。
 方法をご存知の方、ご教示お願いいたします。

< 使用 Excel:Excel2007、使用 OS:WindowsVista >


設定オプションでは抑止できませんね。というか、抑止した場合は、例えば2つ目を開いたつもりで実は編集中の1つ目を表示していたりすると、
閉じた際に編集中のブックを勝手に消されてもユーザーは気づかない、みたいな問題になりそうです。

マクロならば、現在開いているブックの一覧を得て、開こうとしているファイル名と比較するようなコーディングができるでしょう。
(???) 2015/06/22(月) 11:29


 ???さん、ご回答ありがとうございます。

 >マクロならば、現在開いているブックの一覧を得て、開こうとしているファイル名と比較するようなコーディングができるでしょう。

 特定のブックではなく、全てのブックで二重起動を自動的に防止したいのです。
 全てのブックにマクロを入れたり全てのブックに対して二重起動を監視するVBS等を作成するのはちょっと大変です。

 そこで個人用マクロブックやアドインにすることも考えましたが、ブックが起動する前にブックが既に開いていないか
 チェックする方法がわかりません。

 他のブックのイベントを監視するのは↓のようにクラスモジュールを使用したらできるようですが、ブックを開く前に、
 というのが分かりません。

 http://d.hatena.ne.jp/Minamo/20080212/1202840209

 Private Sub App_WorkbookOpen

 でブックが開くときに補足するのはできますが、

 Private Sub App_WorkbookBeforeOpen

 というようなイベントがないのでどうしたものか、と考えあぐねています。
(アルマール) 2015/06/22(月) 21:13

 これ以上ないくらい親切な設計なのに、どのような不満があるのですか?

 ちなみに、クラスモジュールに書いた内容を、ThisWorkbookモジュールに書けば
 クラスモジュール必要ないです。
(稲葉) 2015/06/23(火) 08:46

ブック自身を開く/閉じる際のイベントはあるのですけどね。他のブックを開く/閉じるイベントは拾えないので、諦めた方が良いかと思います。
Excelは表計算アプリであって、アプリ作成用高級言語ではありませんから、Excelが提供していない機能の作成は難しいです。
(???) 2015/06/23(火) 09:12

目的に叶うかはわかりませんが、別案として、ブック保存時に読み取り専用で開くことを推奨する指定を付けるのはいかがでしょう?
これにすると、同じブックを複数開く事ができます。しかし、読み取り専用で開く事を確認するダイヤログは出てしまうのですが。
(???) 2015/06/23(火) 09:24

 稲葉さん、???さん、ご回答ありがとうございます。

 ちょっとご回答の意味をとらえきれていません。

 >ブック自身を開く/閉じる際のイベントはあるのですけどね。他のブックを開く/閉じるイベントは拾えないので、諦めた方が良いかと思います。

 ↓のコードをブックに記述し、拡張子xlamで保存してアドイン登録したら
 エクセル上で開くすべてのブックのパスを表示することができます。
 拡張子がxlsxのブックを開いた時もパスが表示されます。

 'ThisWorkbookモジュール
 Dim myClass As New Class1

 Private Sub Workbook_BeforeClose(Cancel As Boolean)
  ThisWorkbook.Saved = True
 End Sub

 Private Sub Workbook_Open()
  Set myClass.App = Application
 End Sub

 'クラスモジュール
 Public WithEvents App As Application

 Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
  MsgBox Wb.FullName
 End Sub

 ただ、もちろん
 App_WorkbookBeforeOpen
 というようなイベントはないのでブックを開く前に、開こうとしているブック
 が既に開かれていないかチェックすることは出来ないようです。

 >これ以上ないくらい親切な設計なのに、どのような不満があるのですか?

 これは、ブックを二重に開こうとすると
  「○×.xlsx は既に開いています。2 重に開くと、これまでの変更内容は破棄されます。○×.xlsx を開きますか?」
 というメッセージが表示される点について、でしょうか?

 今回の私の質問の趣旨は
 > エクセルの場合は、最前面にできたら理想的ですが、とにかく二重起動はを自動的に防止したいのです。
 につきます。

 ですので、

 >目的に叶うかはわかりませんが、別案として、ブック保存時に読み取り専用で開くことを推奨する指定を付けるのはいかがでしょう?
 >これにすると、同じブックを複数開く事ができます。しかし、読み取り専用で開く事を確認するダイヤログは出てしまうのですが。

 このご提案も同じブックが複数開いてしまいますので今回の趣旨から外れてしまいます。

 もしできないようでしたら諦めます。
(アルマール) 2015/06/25(木) 00:11

 Windowsの機能については、全く詳しくないので、興味をもちつつもROMしておりましたが
 やはり、無理なのでは?

 素人の思い付きとしては、Windowsに渡すメッセージをフックして、それがブックを開こうとするものなら、
 どうこうするとか。
 でも、それができるのか、できるとして、何が、今からブックを開こうとするメッセージなのか判定できるか
 全くわかりません。もちろん、そのコードもかけません。

 ブックを開く既定のプログラムで、エクセルブックの場合、自前プログラムにしておいて、その自前プログラムで
 どうこうする。でも、そんなことができるのか、できたとして、どんなプログラムなのかわかりませんし
 書けません。かけたとしても、エクスプローラ上のダブルクリックによるブックを開く操作に適用されるものの
 エクセルのファイルタブでの開く操作は、やはりエクセルになるのではないかとか。

 無責任なレスになりましたが、気を付けて、うっかり開こうとしてメッセージが出たら、自己責任で処理する。
 開いてしまって、これまでの本人の変更分が破棄されても、それは、その人の責任ということで。
 そういった教育・指導をしていくべきではないかと思います。

(β) 2015/06/25(木) 06:03


 ↑書きこんだ後、ふと。

 「○×.xlsx は既に開いています。2 重に開くと、・・・・」

 このメッセージをフックして、強制的に、開かずにバイパス(いいえが選ばれた状態)すればどうかと、(といってもβには、そのコードは書けませんが)

(β) 2015/06/25(木) 06:54


 二重に開こうとしている場合、当然ユーザーに判断を求めるのはどんなプログラムでも
 必要だと思いますけどねぇ・・・。
 パスが違う同名ブックのときはどうするんだろう? とか思ったり。

 batファイルで開こうとしたブックが既に開かれているか調べて、
 開かれていたら何もしないみたいなコード書いて
 拡張子の関連付けをそのbatファイルにするとできたりしないかな?
(稲葉) 2015/06/25(木) 08:11

こんにちは。

できます。
いまは環境が無いし、環境を再構築する気力もないのでコードは出せませんが
できます。ようはβさんのコメントにあるようなことをすればいいのです。

ファイルを開こうとしたときにはwindowsからExcelにメッセージが送られるので
APIという方法を用いて これを横取り(フック)して、状況に応じてメッセージを
エクセルに渡したり(ファイルが開く)エクセルには渡さずそのまま捨ててしまっ
たり(ファイルは開かない。)します。

「VBAでAPIを使う」「メッセージ フック」などのキーワードで検索すると
解説サイトやサンプルコードがたくさんヒットします。

試してみる際の注意点をいくつか。
・APIのコードはうまく行かないと、エラーメッセージも出ずにいきなり
 エクセルごと落ちます。Windowsごと落ちることもあります。
 万全の体制を整えてから試してください。
(自信のない場合はやめておきましょう。君子危うきに近寄らずです。)
・フックを開始したら必ずアンフックしてください。
 プロシージャを抜けたら自動的に戻ったりはしません。

( 佳 ) 2015/06/25(木) 19:19


こんにちは。

稲葉さんwrote:
>パスが違う同名ブックのときはどうするんだろう? とか思ったり。

パスが違っても同名ブックは開けませんというメッセージが出ます。
ボタンはOKの一択です。
もちろんブックは開きません。

プログラムを作る側としては、ユーザーさんのやろうとしたことができないときは、
やはりなんらかのメッセージを出したくなるのも分かりますが

ユーザーとしては、毎度毎度同じメッセージをだされるとだんだん鬱陶しいです。
確かに、できないことをやらせようとしたわたしが悪いのだけど、
もう分かったから黙って無視してもらえないかなと思ってしまいます。
「ツール」→「オプション」あたりに、特定のメッセージを黙らせる設定がもし
あったら、絶対に使います(^^;

( 佳 ) 2015/06/25(木) 19:55


 >>パスが違う同名ブックのときはどうするんだろう? とか思ったり。 
 >パスが違っても同名ブックは開けませんというメッセージが出ます。 
 この場合強制的に開かなくするのかなって思ったのです。

 てか同じブック開くことって滅多にないと思うのですが・・・。
 そんなに鬱陶しいくらい頻繁に出る状況・環境なら、それを改善する方法を考えますね。

 とはいえ、無視したいときもあるのもわかります。

 シート等をコピーしたとき、コピー先とコピー元の名前の定義が被っているときに、
 新しく名前をつけ直すを選んでしまったときは途中でキャンセルさせてほしかったです。。。

(稲葉) 2015/06/26(金) 09:19


 オプションの「ddeを使う他のアプリケーションを無視する」にチェックすると、

 エクスプローラーからファイル選択開くだと 別プロセスのExcelが起動され、読取専用で開きます。これだと2重起動でのデータ破壊はないですよね
 これブック内のデータに変更がないと メッセージなしで更新してしまいます。

 モジュールレベルの変数は初期化されてしまいます。今まで気にした事ありませんでしたが
 不具合の素にもなりかねませんねえ

 これを応用して何かできないでしょうか?

 所用で何も検証していませんが・・・。

(ichinose) 2015/06/26(金) 09:59


 βさん、稲葉さん、佳さん、ichinoseさん、ご回答ありがとうございます。

 しばらく見ることがでできませんでした。
 皆様の回答を参考にしばらく考えてきます。
 次のご返答には、2、3日かかると思います。
(アルマール) 2015/06/27(土) 10:09

 デスクトップ上のブックのアイコンをWクリックで開いて、同じブックを
 再度Wクリックで開いたら何もメッセージが出ずにブックが開き直ししました。

 ブックを開いた後に編集し、そのブックを再度開いたら
 「○×.xlsx は既に開いています。2 重に開くと、これまでの変更内容は破棄されます。○×.xlsx を開きますか?」
 が出ました。

 また、ブックにTODAY関数を記述しておいた場合は、再度開こうとすると、
 「○×.xlsx は既に開いています。2 重に開くと、これまでの変更内容は破棄されます。○×.xlsx を開きますか?」
 が出ました。

 ブックを起動するVBSを作成しそのVBSにショートカットキーを設定し連続でショートカットキーを押した場合は、

 「○×.xlsx は既に開いています。2 重に開くと、これまでの変更内容は破棄されます。○×.xlsx を開きますか?」
 が出る場合と、後に開いた方が読み取り専用になる場合がありました。
 ブック起動時に実行するマクロやシートに記述してある関数などの影響により、
 1.何も警告が出ずに開く
 2.二重起動の警告が出る
 2.読み取り専用になる
 と分かれるようです。

 今回の質問をした理由は、佳さんの、

 >ユーザーとしては、毎度毎度同じメッセージをだされるとだんだん鬱陶しいです。
 >確かに、できないことをやらせようとしたわたしが悪いのだけど、
 >もう分かったから黙って無視してもらえないかなと思ってしまいます。

 に近いです。
 しかし、いろいろご意見をお伺いした結果、現状のまま(つまり、メッセージが出るに任せる)ことにしました。
 ありがとうございました。
(アルマール) 2015/06/30(火) 00:14

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.