Usando o Chart BeforeDoubleClick com um objeto gráfico na planilha

1

Eu estou tentando obter uma macro para trabalhar em um gráfico em uma planilha usando o evento Chart.BeforeDoubleClick.

Eu tenho conseguido usar o evento BeforeDoubleClick (sem o uso de módulos de classe) em um gráfico independente. Mas eu gostaria de fazê-lo funcionar em um gráfico incorporado como objeto em uma planilha. A ideia é replicar isso para vários gráficos em uma única planilha.

Seguindo as dicas em este livro (pp. 172-3), fiz o seguinte:

  1. Criada nova pasta de trabalho. Na planilha Sheet1 adicionamos 2 colunas de dados aleatórios e adicionamos um gráfico de dispersão na mesma planilha ao lado dos dados.

  2. Inseriu um módulo de classe chamado "cl_ChartEvents" com código:

    Public WithEvents myChartClass As Chart
    
  3. Criado um módulo padrão com código:

    Dim myClassModule As New cl_ChartEvents
    Sub InitializeChart()
    Set myClassModule.myChartClass = _ 
    Worksheets("Sheet1").ChartObjects(1).Chart
    End Sub
    
  4. No editor do VBA, clique duas vezes no objeto "Sheet1 (Sheet1) e no código inserido:

    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.HasLegend = False
            Cancel = True
        Case xlAxis
            Me.HasLegend = True
            Cancel = True
        End Select
    End Sub  
    
  5. Clique em Executar e execute a macro InitializeChart.

Quando clico duas vezes na legenda no gráfico, nada acontece e o Excel simplesmente abre a caixa de propriedades Format Legend como de costume.

Eu fiz meu dever de casa on-line olhando para fóruns etc. mas não consegui encontrar nenhuma outra dica de como o evento BeforeDoubleClick poderia ser implementado para trabalhar em um gráfico dentro de uma planilha regular. A abordagem do livro parece indicar que isso é factível.

Qualquer ajuda seria apreciada! Fazer isso funcionar ajudaria muitos outros com perguntas semelhantes que vi na web. Obrigado.

    
por A.S 12.12.2014 / 23:01

1 resposta

2

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.

    
por 30.12.2014 / 03:54