Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-单击饼图的不同部分以运行不同的宏_Excel_Vba_Pie Chart - Fatal编程技术网

Excel VBA-单击饼图的不同部分以运行不同的宏

Excel VBA-单击饼图的不同部分以运行不同的宏,excel,vba,pie-chart,Excel,Vba,Pie Chart,不确定是否可以使用VBA,但我想使用饼图的每个部分作为按钮来运行四个不同的宏 此外,每次值发生变化时(代码如下所示)都会重新创建饼图,因此切片的大小不是固定的。因此,我不认为我可以在切片的顶部放置一个类似的形状并为其指定一个宏 您可以将其设置为图表工作表并使用图表选择事件 选择您的数据范围并按F11。 将图表类型更改为圆形 打开VBA编辑器,打开图表代码并粘贴以下内容: Private Sub Chart_Select(ByVal ElementID As Long, ByVal Arg1 A

不确定是否可以使用VBA,但我想使用饼图的每个部分作为按钮来运行四个不同的宏

此外,每次值发生变化时(代码如下所示)都会重新创建饼图,因此切片的大小不是固定的。因此,我不认为我可以在切片的顶部放置一个类似的形状并为其指定一个宏


您可以将其设置为图表工作表并使用图表选择事件

选择您的数据范围并按F11。
将图表类型更改为圆形

打开VBA编辑器,打开图表代码并粘贴以下内容:

Private Sub Chart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
    Debug.Print ElementID
    Debug.Print Arg1
    Debug.Print Arg2
    Debug.Print ""
End Sub
这三个参数告诉您按下了图表的哪一部分。
当我点击黄色较大的图表对象时,我得到:

 3 
 1 
 4 
蓝色:

3
1
1
我没有做过更多的调试,但我假设3是图表区域,因为如果我点击白色区域,我得到2,0,0。
不管怎样,我想你会找到解决你的工作问题的办法


找到一个包含有关图表事件的某些信息的页面

请尝试下一种方法:

  • 插入一个类模块并将其命名为“ChartEvClass”。复制其模块中的下一个代码:
  • 在标准模块(声明区域)的顶部,创建一个
    Private
    变量:
  • 在同一模块中,复制下一个过程(可由事件调用,例如,
    Sheet\u Activate
    ):
  • 上述
    子部分
    可将事件分配给所有现有图表。运行它并尝试在图表切片上单击播放。事件将返回切片标签

  • 也复制下一个代码。它可用于根据返回的标签运行某些内容:
  • 类代码是动态的,它应该返回它们存在的数量的标签


    请测试并发送一些反馈。

    很好!投票通过。但我认为也可以使用类包装器为工作表上的字符创建事件。我记得我在过去的一段时间里做过那件事。现在没有太多时间,但我会尝试一些东西…完全按照预期工作!非常感谢您将解释分解为易于理解的内容parts@Randy赵:很高兴我能帮忙!
    3
    1
    1
    
    Option Explicit
    
    Public WithEvents EvtChart As Chart
    
    Private Sub EvtChart_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
        Dim elementId As Long, arg1 As Long, arg2 As Long
        Dim arrDL, i As Long
        
        ReDim arrDL(1 To ActiveChart.SeriesCollection(1).DataLabels.count)
        For i = 1 To ActiveChart.SeriesCollection(1).DataLabels.count
            arrDL(i) = Split(ActiveChart.SeriesCollection(1).DataLabels(i).Text, vbLf)(0)
        Next i
        With ActiveChart
            .GetChartElement x, y, elementId, arg1, arg2
            Call DoSomething(Application.Index(arrDL, arg2))        
        End With
    End Sub
    
    Private clsEventCharts() As New ChartEvClass
    
    Sub ActivateChartsEvent()
      If ActiveSheet.ChartObjects.count > 0 Then
            ReDim clsEventCharts(1 To ActiveSheet.ChartObjects.count)
            Dim chtObj As ChartObject, i As Long: i = 1
    
            For Each chtObj In ActiveSheet.ChartObjects
                Set clsEventCharts(i).EvtChart = chtObj.Chart
                i = i + 1
            Next
        End If
    End Sub
    
    Sub DoSomething(strLabel As String)
        MsgBox strLabel
        'use the label to run whatever you need...
    End Sub