• ベストアンサー

手動かプログラムでの起動かの判断

ユーザーがエクセルをダブルクリックして起動したのか それとも別プログラムからOPENされたのか 判断する方法はあるでしょうか? ユーザーが手動で起動したら警告メッセージを出し 別プログラムから自動でOPENされたら何もメッセージを出さないという 処理をWorkbook_Openに書きたいのですが こういう場合はどう書けばいいのでしょうか? ちなみに別プログラムは複数あり 今後増える可能性があり、私の管理下にも無い為 別プログラムに判別する為の処理を入れる事は出来ません。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.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 ' ' =============================================

snowsan062
質問者

お礼

「Private Sub Auto_Open()」こういうのあったんですね。 初めて知りました。完璧です。これで対処できます。ありがとうございました!

関連するQ&A