图例条目、范围、饼图、删除、条件

Posted

技术标签:

【中文标题】图例条目、范围、饼图、删除、条件【英文标题】:LegendEntries, Range, PieChart, Delete, Condition 【发布时间】:2016-10-17 06:42:10 【问题描述】:

这几天我一直在试图找出错误或我做错了什么。我在这里展示了当前的输出以及它应该是什么。我想也许我在定义范围时出现了一些错误,或者LegendEntries(i)Points(i) 的索引不同。有什么建议吗?或者也许我怎么能从另一种方法做到这一点?

这里的事情是获取图表并删除与“0”值关联的图例和标签。

第一个图形是我当前的输出。 第二个是我的期望输出,以及我期望通过我的代码得到的输出。

具有 0 值的图例是“Asia”和“Latam”,但我当前的输出是抛出“Latam”,它应该抛出“RoW”,因为“RoW”与 0 值无关,它的值是“5.0%”。

Sub CreateChart()
On Error Resume Next
Sheets(1).ChartObjects.Delete

    Dim MyChart As Chart
    Dim rowi As Integer
    Dim MyRange As Range


rowi = Range("I7").Row ' Index to select last row non empty, in this example it's row number 11.
Do While Sheets(1).Cells(rowi, Range("I7").Column).Value = _
IsEmpty(Cells(rowi, Range("I7").Column))
rowi = rowi + 1
Loop

'----------------------------------------------------CHART---------------------------------------------------------------

Set MyRange = Range("I6:M6" & ",I" & rowi & ":M" & rowi)

Set MyChart = Sheets(1).Shapes.AddChart(xlPie).Chart

     MyChart.SetSourceData Source:=MyRange

With MyChart.SeriesCollection(1)
 .HasDataLabels = True
 .DataLabels.NumberFormat = "0.0%"
End With

With MyChart
 .HasLegend = True
End With

For i = 1 To (Range("M6").Column - Range("I6").Column + 1)

If  Cells(rowi, Range("I6").Column + i - 1).Value = 0 Then
MyChart.SeriesCollection(1).Points(i).DataLabel.Delete
MyChart.Legend.LegendEntries(i).Delete
End If

Next i
End Sub

【问题讨论】:

【参考方案1】:

托马斯,给你。您遇到的问题是,每次您从 LegendEntries 对象中删除一个图例条目时,其余条目的索引号都会向下移动 1 以填充该孔。所以在你删除索引3(亚洲)之后,索引4变成了3,5变成了4,等等……为了解决这个问题,我只是通过索引号倒退,从而确保删除不会影响事物的顺序来吧。

 Sub CreateChart()
    On Error Resume Next
    Sheets(1).ChartObjects.Delete
        Dim MyChart As Chart
        Dim rowi As Integer
        Dim MyRange As Range
    rowi = Range("I7").Row ' Index to select last row non empty, in this example it's row number 11.
    Do While Sheets(1).Cells(rowi, Range("I7").Column).Value = _
        IsEmpty(Cells(rowi, Range("I7").Column))
        rowi = rowi + 1
    Loop

    '----------------------------------------------------CHART---------------------------------------------------------------

    Set MyRange = Range("I6:M6" & ",I" & rowi & ":M" & rowi)

    Set MyChart = Sheets(1).Shapes.AddChart(xlPie).Chart
         MyChart.SetSourceData Source:=MyRange

    With MyChart.SeriesCollection(1)
     .HasDataLabels = True
     .DataLabels.NumberFormat = "0.0%"
    End With
    MyChart.HasLegend = True

    For i = (Range("M6").Column - Range("I6").Column + 1) To 1 Step -1 ' <---CHANGED THIS
        If Cells(rowi, Range("I6").Column + i - 1).Value = 0 Then
            MyChart.SeriesCollection(1).Points(i).DataLabel.Delete
            MyChart.Legend.LegendEntries(i).Delete
        End If
    Next i
End Sub

希望对您有所帮助,如果您有任何问题,请随时提问。

【讨论】:

天才!!非常感谢! 很高兴听到托马斯!祝你项目的其余部分好运。

以上是关于图例条目、范围、饼图、删除、条件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ArcMap Desktop 中从图例中删除图表符号

如何使用 plotly subplots() 删除重复的图例条目

饼图图例颜色未更新 mpandroidchart

dc.js饼图图例溢出

Highcharts 与饼图切片颜色相同的图例颜色

Python - 图例与饼图重叠