2017-09-21 7 views
0

グラフオブジェクトでクリックイベントをキャプチャするクラスモジュールを作成しました。 1つのチャートでは期待通りに機能しますが、複数のチャートがある場合は、作成された最後のチャートだけがチャートクラスの機能を維持します。以下は、各グラフオブジェクトにグラフクラスを適用するために使用しているコードです。複数のチャートオブジェクトにクラスを適用する - VBA

Option Explicit 

Global gclsDrill As New clsDrill 

'Purpose: Initialize the Drill down class on each chart object 

Sub InitChart() 

Dim oChtObj As ChartObject 
Dim oWorksheet As Worksheet 


If oWorksheet Is Nothing Then Set oWorksheet = Sheets("Charts") 

For Each oChtObj In oWorksheet.ChartObjects 
    Set gclsDrill.Chart = oChtObj.Chart 
Next 

End Sub 

なぜ1つのチャートオブジェクトでのみ動作し、すべてのオブジェクトではなく、関連する情報が見つからないのかわかりません。誰でもアイデアはありますか?ありがとう。

+1

おそらく、上のループで毎回gclsDrillオブジェクトのChartプロパティを上書きするためです。したがって、ループの最後には最後だけが保持されます。ループのたびに新しいclsDrillオブジェクトを作成する必要があると思われます。しかし、私はあなたのclsDrillクラスの他の詳細を知らないので、それが最善であるかどうかわかりませんが、私の推測ではそれは問題ありません。 – MacroMarc

+0

正直、ありがとう! –

+0

興味があれば[https://peltiertech.com/chart-events-microsoft-excel/](Microsoft Excelのチャットイベント)のチュートリアルを書いています。 –

答えて

0

クラスのグローバルインスタンスを使用する代わりに、コレクションを使用します。それぞれのグラフのクラスの新しいインスタンスを作成し、各インスタンスをコレクションに追加します。

Option Explicit 

Global colCls As Collection 'clsDrill 

'Purpose: Initialize the Drill down class on each chart object 

Sub InitChart() 

    Dim oChtObj As ChartObject 
    Dim oWorksheet As Worksheet 

    Set colCls = New Collection 

    If oWorksheet Is Nothing Then Set oWorksheet = Sheets("Charts") 

    For Each oChtObj In oWorksheet.ChartObjects 
     colCls.Add GetHandler(oChtObj.Chart) 
    Next 

End Sub 

Function GetHandler(cht As Chart) As clsDrill 
    Dim rv As New clsDrill 
    Set rv.Chart = cht 
    Set GetHandler = rv 
End Function 
+0

ありがとう、ティム、それは完璧に動作します。私はそのようなものだとは思っていましたが、実装方法は不明でした。 –

関連する問題