Certifique-se de que seu código no item de lista nº 4 precisa estar no módulo de classe para myChartClass
e não no código Sheet1
.
EDIT (para resolver o erro 'membro não encontrado'): Revise o código da etapa 4 para:
Private Sub MyChartClass_BeforeDoubleClick(ByVal ElementID As Long, _
ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
Select Case ElementID
Case xlLegend
Me.MyChartClass.HasLegend = False
Cancel = True
Case xlAxis
Me.MyChartClass.HasLegend = True
Cancel = True
End Select
End Sub
A única alteração é a inserção de MyChartClass
entre Me
e HasLegend
nos dois locais em que ocorrem.
Por que isso funciona: Me
refere-se à instância do módulo de classe que o contém, cl_ChartEvents
, que não é o que foi vinculado ao gráfico de interesse. O objeto MyChartClass
é o que está vinculado ao Chart
. (Um nome melhor para MyChartClass
provavelmente seria MyChartObj
, ou algo assim.) Portanto, é preciso detalhar em Me.MyChartClass
para manipular o limite Chart
.
EDIT 2 (para fornecer código para aplicar o tratamento personalizado de eventos a todos os gráficos de uma pasta de trabalho): Substitua o código da etapa 3 pelo seguinte:
Dim ChartColl As New Collection
Sub LinkCharts()
Dim workCls As cl_ChartEvents
Dim ws As Worksheet
Dim ch As Chart, chob As ChartObject
' Link all standalone charts
For Each ch In ActiveWorkbook.Charts
' Must create a new instance of the class for each chart
Set workCls = New cl_ChartEvents
' Link each chart to the myChartClass member of the new class instance
Set workCls.myChartClass = ch
' Add the new instance of the class into the Collection object
ChartColl.Add workCls
Next ch
' Link all charts in objects in sheets
For Each ws In ActiveWorkbook.Worksheets
For Each chob In ws.ChartObjects
Set workCls = New cl_ChartEvents
Set workCls.myChartClass = chob.Chart
ChartColl.Add workCls
Next chob
Next ws
End Sub
Sub UnlinkCharts()
' Removing the cl_ChartEvents instances from the Collection causes
' causes them to be destroyed by garbage collection
Do Until ChartColl.Count = 0
ChartColl.Remove 1
Loop
End Sub
Se você quiser que apenas determinados gráficos da pasta de trabalho sejam modificados, a solução estará mais envolvida. Você terá que encontrar alguma maneira de marcar os gráficos que deseja modificar ou os gráficos que não deseja modificar. e verifique cada gráfico conforme você se depara com a marca. Muito factível, no entanto.