[[20130220115100]] 『VBA/他ブックが開いたタイミングでトリガー』(くろたろう) ページの最後に飛ぶ

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

 

『VBA/他ブックが開いたタイミングでトリガー』(くろたろう)

 以下に関して可能かどうか、また代替案があるかを伺いたいです。

 コードが記述されているAブックにて
 自ブック以外が開かれた事を知ることはできますか?

 ワークブックのイベントを眺めてみましたが、
 他ブックが1つだけなら「Workbook_WindowDeactivate」が使えるかも…
 程度で、開かれるブックが2つ以上の場合対応出来ません。

 なにか良い方法がありましたらご教示下さい。
 また、こちらは勉強用ですので急ぎのものではありません。

 どうぞ、よろしくお願い致します。
 (win7・Excel2007)

 自ブックの ThisWorkbookモジュールに

 Option Explicit

 Dim WithEvents xlApp As Application

 Private Sub Workbook_Open()
    Set xlApp = Application
 End Sub

 Private Sub xlApp_WorkbookOpen(ByVal Wb As Workbook)
    If Not Wb Is ThisWorkbook Then
        MsgBox Wb.Name & "がひらかれたよ〜"
    End If
 End Sub

 (ぶらっと)

 ぶらっとさん
 早速のお返事、ありがとうございます!
 望む通り動く事を確認しました。
 ちゃんと、csv等を開いても教えてくれるんですね。

 コードはシンプルなので流れはわかるんですが、
 普段見慣れない構成なので、「WithEvents 」「Application」あたりが
 なんの仕事をしているか調べて勉強します!
 (くろたろう)


 なんとなく調べてわかりました。
 Excelのイベントを受け取るオブジェクト変数をセットしてるんですね。

 「Excel_WorkbookOpen」で最初から用意してくれてないのは
 「WithEvents」以外にも、Excelのなにかを受け取るキーワードがあるんでしょうか。

 何言ってるの…といった事を聞いているのかもしれませんが
 自分的に新分野なので、検索に利用出来る語句等あれば教えて頂けないでしょうか。
 よろしくお願い致します。
 (くろたろう)

 う〜んと・・・難しい質問だねぇ・・

 わかる範囲でメモすると、

 ・まず、Excel/VBA で Application というと、これはエクセルそのものということはいいね。
 ・アップしたコードは Set xlApp = Application 。ここでSetしたエクセルは、このブックが動いているエクセル。
  PC上には、このほかに別エクセルが立ち上がっているかもしれないね。そこにはこのxlAPPではアクセスできない。
 ・Set xlApp = New Application とすると、自分のエクセルとは異なるエクセルを別区画で立ち上げることができる。

 まぁ、ここまでは、質問とは離れた説明。

 で、

 >「Excel_WorkbookOpen」で最初から用意してくれてない

 もっともな疑問かもしれない。でも、ThisWorkbookモジュールは、基本的に、このブックを制御するためのモジュール。
 プロジェクトエクスプローラ上に VBAPoject(ブック名) のさらに上位のメンバ(エクセルそのもの)があって
 そこに Applicationモジュールなんてのがあれば、そこに、エクセルそのものを制御するコードがかけそうに
 思うけど、【それは、ない】し、かりにあったとして、そのコードは、どこに保存されるかということを考えると
 どこかのブックの一部として保存するしかないので、仮にブックが複数開かれていた場合、VBAコンパイラーは
 困ってしまうと思わない?

 ということなので、ThisWorkbookモジュールで、エクセルそのものを xlApp として定義し、このエクセル内での
 動き(イベント)を捕捉して処理せざるを得ないということなんだけどね。

 >「WithEvents」以外にも、Excelのなにかを受け取るキーワードがあるんでしょうか。

 まず、この質問は横に置き(ごめんね)
 ・新規ブックでThisWorkbookモジュールを表示。
 ・(General) と表示されているコンボボックスをあけると、そこにはメンバとして Workbook しかないよね。
  で、それを選んで、次に、その右のコンボボックスをあけると、Workbookレベルで扱うことができるイベントが
  リストアップされるね。
 ・次にモジュール先頭に Dim WithEvents xlApp As Application を記述したあと左側のコンボボックスを開くと
  Workook のほかに、さっきはなかった xlApp が登場している。
 ・これを選んで、右側のコンボボックスを開くと、このxlApp(エクセル)から受け取り処理できるイベントが
  リストアップされる。

 そちらの表現、【「WithEvents」以外にも、Excelのなにかを受け取るキーワード】
 これは、ちょっと正しくない表現かな? Dim WithEvent 変数名 As オブジェクト型 と書くことで
 そのオブジェクトから受け取ることができるイベント処理ができるということで、WithEvent 以外・・・・
 というより As Application 以外 ということではなかったのかな?

 なんだか、書いていて自分でも収拾がつかなくなってきたけど、こんな説明でわかってもらえたかなぁ・・・?

 (ぶらっと)

 ぶらっとさん
 貴重なお時間をいただき、ありがとうございます。
 詳しくご説明いただき恐縮です。

 「Excel_WorkbookOpen」使用云々に関しては、
 今回の「xlApp_WorkbookOpen」のように、
 各ブックのThisWorkbookモジュールから呼び出す想定をしていましたが
 そこがそもそも間違いでした。

 シートモジュールで「Worksheet_」、ThisWorkbookモジュールで「Workbook_」と同様、
 Applicationモジュールにて使用、というのが確かに当然の造りですね。

 「WithEvents」以外にも〜も前提が違ってたようです。
 ちょっとここらは説明難しいので流して下さい…
 Applicationを理解していないが為です。

 【オブジェクトから受け取ることができるイベント処理ができる】
 という事で、コンボボックスなどのイベント処理が出来るようですね。
 こちらは覚えておいて、もし活用出来る場面があったら利用したいです。

 それにしても「WorkbookRowsetComplete」なんて、
 なにをするのかわからないイベントが用意されてるんですね
 (検索したら「ピボットテーブルで行セット アクションを起動するか、
 レコードセットを詳細表示する」とありましたが、正直良くわからないw)
 (くろたろう)

コメント返信:

[ 一覧(最新更新順) ]


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