- ベストアンサー
手動かプログラムでの起動かの判断
ユーザーがエクセルをダブルクリックして起動したのか それとも別プログラムからOPENされたのか 判断する方法はあるでしょうか? ユーザーが手動で起動したら警告メッセージを出し 別プログラムから自動でOPENされたら何もメッセージを出さないという 処理をWorkbook_Openに書きたいのですが こういう場合はどう書けばいいのでしょうか? ちなみに別プログラムは複数あり 今後増える可能性があり、私の管理下にも無い為 別プログラムに判別する為の処理を入れる事は出来ません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 > 別プログラムからOPEN というのは、どんなプログラムでしょう? 仮に、 Excel VBA、から、Workbooks.Open メソッドで、 ということでお話ししますが、条件によっては、 VBAからでなくとも流用出来ます。 > 処理をWorkbook_Openに書きたいのですが Workbook_Open イベントでなくても良ければ、 Workbook_Open イベントの代りに、 標準モジュールに、 Private Sub Auto_Open() MsgBox "手動で起動したら警告メッセージ" End Sub とプロシージャを置いて、ここで処理すれば十分、 という場合もあるかと思います。 通常、ブックを開くと、まず、 Workbook_Open イベント が発生します。 もしも手動で開かれた場合は、この後に、 Private Sub Auto_Open() が呼び出されます。 手動であろうがなかろうが、共通の処理がある場合などでは、 以下のサンプルのようにしてみては如何でしょう。 従来、Workbook_Open イベント で処理していた内容を、 標準モジュールのPrivate Sub WbkOpenSeq()に書くようにして、 Application.OnTime メソッドを使って、実行プロシージャを呼ぶようにすれば、 Private Sub Workbook_Open() Private Sub Auto_Open() Private Sub WbkOpenSeq() の順に実行されるようになります。 WbkOpenSeq実行時に、手動で開いたどうか判るように書いています。 flgAutoOpen と名付けたフラグは、 手動で開かれたなら、True、それ以外は、False、という意味です。 Private Sub Auto_Open() を通った=手動で開かれた場合だけ、 flgAutoOpen はTrueになります。 (以下の記述中、Workbook_Open、Auto_Open、の二つは規定の名前です。 それ以外のプロシージャ名、変数名、は、私が勝手に付けている名前です。) ' ' ========== ThisWorkbook モジュール ========== Private Sub Workbook_Open() Application.OnTime Now, "WbkOpenSeq" End Sub ' ' ============================================= ' ' =============== 標準モジュール ============== Private flgAutoOpen As Boolean Private Sub Auto_Open() flgAutoOpen = True End Sub Private Sub WbkOpenSeq() ' ' 共通の処理があればココに。 If flgAutoOpen Then ' ' 手動 MsgBox "手動で起動したら警告メッセージ" Else ' ' 手動じゃない ' ' 従来 Workbook_Open イベントで処理していた内容をココに。 End If ' ' 共通の処理があればココに。 End Sub ' ' =============================================
お礼
「Private Sub Auto_Open()」こういうのあったんですね。 初めて知りました。完璧です。これで対処できます。ありがとうございました!