Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8074 / 13645 ツリー ←次へ | 前へ→

【35173】埋め込みグラフ選択時イベントが発生しない VBA初心者 06/2/22(水) 21:28 質問[未読]
【35176】Re:埋め込みグラフ選択時イベントが発生し... ichinose 06/2/23(木) 9:00 発言[未読]
【35277】Re:埋め込みグラフ選択時イベントが発生し... VBA初心者 06/2/24(金) 22:37 お礼[未読]
【35280】Re:埋め込みグラフ選択時イベントが発生し... ichinose 06/2/25(土) 9:06 発言[未読]

【35173】埋め込みグラフ選択時イベントが発生しな...
質問  VBA初心者  - 06/2/22(水) 21:28 -

引用なし
パスワード
   二つのブックを開いた状態で、片方のブック上の埋め込みグラフを選択した状態のまま他方のブックをアクティブにした場合に、アクティブイベントが発生しません。また、埋め込みグラフが選択されているブックでも非アクティブイベントが発生していません。この時ブックがアクティブになった、もしくは非アクティブになったことを判定することは可能でしょうか?
教えていただけると助かります。
以上よろしくお願いいたします。

【35176】Re:埋め込みグラフ選択時イベントが発生...
発言  ichinose  - 06/2/23(木) 9:00 -

引用なし
パスワード
   ▼VBA初心者 さん:
おはようございます。
現象確認しました(Excel2000、Excel2002で確認)。
これは、バグだよね?・・(仕様かもしれないか・・)。

一番は、作成するプログラムの仕様を変更することですが・・・。


例えば、book1.xlsというブックの
Thisworkbookモジュールに
'=======================================================
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
  MsgBox Wn.Caption & "----Activate"
End Sub


というイベントを記述しておきます。

別のブックのChart1.XlsのSheet1というシートに
Chartobjectを一つ作成してください(Sheet1に適当なグラフを作成すると言うことです)。
このブックのThisworkbookモジュールに

'======================================================================
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
'=======================================================================
Private Sub Workbook_WindowActivate(ByVal wn As Window)
  If wn.ActiveSheet.ChartObjects.Count > 0 Then
    set_cht
    End If
End Sub
'========================================================================
Private Sub Workbook_WindowDeactivate(ByVal wn As Window)
  MsgBox wn.Caption & "-----Deactivate"
End Sub
'=========================================================================
Sub set_cht()
  Set cht = ActiveSheet.ChartObjects(1).Chart
  Set svwn = ActiveWindow
End Sub


このChart1.XlsのSheet1をアクティブにした状態で(あくまでもSheet1がアクティブであって、Sheet1にあるグラフを選択した状態ではありません)
一度、set_chtを実行してください。

その後、Chart1.XlsのSheet1上にあるグラフを選択した状態でbook1.xlsをアクティブ
にしてみてイベントが発生するか否か確認してください。

私が簡単に試した限りではイベントが発生しますが、
動作の不安定な箇所があるかもしれません。

【35277】Re:埋め込みグラフ選択時イベントが発生...
お礼  VBA初心者  - 06/2/24(金) 22:37 -

引用なし
パスワード
   ご回答ありがとうございます。確認してみたところ、確かにこの方法ならイベントは発生しますね。この方法は気づきませんでした。もっともこのコードを書きこんだブックのグラフを選択した場合のみに適応され、その他のブックの場合はやはり同様にイベントが発生しない状況になってしまいますね。。。 実は私の作成したブックででは自前のメニューを表示させてるのですが、このブックを複数立ち上げた場合メニューが増えてしまいうっとうしい為、アクティブなブックのメニューのみ表示させているのです。メニューの表示(非表示)のタイミングはブックのactivate時(deactivate時)なのですが、この時、既述の現象が発生してしまいメニューが切り替わらない状況が発生しています。。。やっぱりEXCELのバグなんでしょうか・・・。おっしゃるとおり仕様変更しかないかなぁ。。。

【35280】Re:埋め込みグラフ選択時イベントが発生...
発言  ichinose  - 06/2/25(土) 9:06 -

引用なし
パスワード
   ▼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のインスタンスをどのタイミングで
作成するかを考えなければなりません。

シートをユーザーに自由に触らせる環境でのプログラムは
やっぱり大変です。

8074 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free