プロが教えるわが家の防犯対策術!

ユーザーがエクセルをダブルクリックして起動したのか
それとも別プログラムからOPENされたのか
判断する方法はあるでしょうか?

ユーザーが手動で起動したら警告メッセージを出し
別プログラムから自動でOPENされたら何もメッセージを出さないという
処理をWorkbook_Openに書きたいのですが
こういう場合はどう書けばいいのでしょうか?

ちなみに別プログラムは複数あり
今後増える可能性があり、私の管理下にも無い為
別プログラムに判別する為の処理を入れる事は出来ません。

A 回答 (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
' ' =============================================
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/01 03:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています