|
▼VBA初心者 さん:
おはようございます。
>ご回答ありがとうございます。確認してみたところ、確かにこの方法ならイベントは発生しますね。この方法は気づきませんでした。もっともこのコードを書きこんだブックのグラフを選択した場合のみに適応され、その他のブックの場合はやはり同様にイベントが発生しない状況になってしまいますね。。。 実は私の作成したブックででは自前のメニューを表示させてるのですが、このブックを複数立ち上げた場合メニューが増えてしまいうっとうしい為、アクティブなブックのメニューのみ表示させているのです。メニューの表示(非表示)のタイミングはブックのactivate時(deactivate時)なのですが、この時、既述の現象が発生してしまいメニューが切り替わらない状況が発生しています。。。やっぱりEXCELのバグなんでしょうか・・・。おっしゃるとおり仕様変更しかないかなぁ。。。
不特定のブックの既存グラフを選択した状態で
Workbook_WindowActivateイベントや
Workbook_WindowDeactivateイベントを発生させることは
前回のコードの応用で可能です。
不特定なブックにあるグラフのイベントを管理するブックを作ります。
仮にこのブックをmng.xlsとしましょう。
このブックにクラスモジュールを作成します
(クラス名は自動作成されるClass1)。
ここに
'=======================================================
Private WithEvents cht As Chart
Private svwn As Window
'======================================================================
Private Sub cht_Activate()
Application.EnableEvents = False
svwn.Activate
DoEvents
cht.Parent.Select
Application.EnableEvents = True
End Sub
'=====================================================================
Sub set_cht(chtobj As ChartObject, wn As Window)
Set cht = chtobj.Chart
Set svwn = wn
End Sub
このブックのThisworkbookモジュールに
'====================================================================
Private chtcls() As Class1
Private clscnt As Long
Dim WithEvents app As Application
'================================================================
Sub stt_mng()
Set app = Application
End Sub
'========================================================================
Private Sub app_WindowActivate(ByVal Wb As Workbook, ByVal wn As Window)
Dim idx As Long
Dim sht As Worksheet
clscnt = 0
For Each sht In Wb.Worksheets
For idx = 1 To sht.ChartObjects.Count
ReDim Preserve chtcls(1 To clscnt + 1)
Set chtcls(clscnt + 1) = New Class1
chtcls(clscnt + 1).set_cht sht.ChartObjects(idx), wn
clscnt = clscnt + 1
Next
Next
End Sub
'=================================================================
Private Sub app_WorkbookDeactivate(ByVal Wb As Workbook)
Erase chtcls()
clscnt = 0
End Sub
として、stt_mngを実行後、不特定のブックのグラフを選択した状態で
イベントが発生するか確認してください。
私ならこのmng.xlsをアドインブックにして使用します。
但し、ちょっと考えただけでもまだ問題はあります。
例えば、上記のコードは、予め作成されているグラフに関しては有効ですが、
新たに作成するグラフに関してはClass1のインスタンスをどのタイミングで
作成するかを考えなければなりません。
シートをユーザーに自由に触らせる環境でのプログラムは
やっぱり大変です。
|
|