Excel条形图-相同名称的相同颜色和图例条目

Excel条形图-相同名称的相同颜色和图例条目,excel,vba,charts,Excel,Vba,Charts,我想绘制一段时间内机器的状态图。例如,它可能会“运行”2小时,然后“停止”1小时,每个状态可能会出现多次。使用堆叠条形图,我想显示该状态及其停留在该状态的时间。 我发现excel正在为每个新状态实例分配一个新的颜色和图例条目,即使该状态已经发生。 如何使图表中的相同命名状态具有相同的颜色(例如,每次显示“running”时,它都具有相同的颜色和单个图例条目)?谢谢状态名称存储为序列名称。图表中的每个堆栈都有一个系列。可以遍历系列并根据系列名称设置它们的样式。也可以使用LegendEntries对

我想绘制一段时间内机器的状态图。例如,它可能会“运行”2小时,然后“停止”1小时,每个状态可能会出现多次。使用堆叠条形图,我想显示该状态及其停留在该状态的时间。 我发现excel正在为每个新状态实例分配一个新的颜色和图例条目,即使该状态已经发生。

如何使图表中的相同命名状态具有相同的颜色(例如,每次显示“running”时,它都具有相同的颜色和单个图例条目)?谢谢

状态名称存储为序列名称。图表中的每个堆栈都有一个系列。可以遍历系列并根据系列名称设置它们的样式。也可以使用LegendEntries对象从图例中删除条目

将这些元素组合到一个循环中,可以更新系列颜色(如果它与标题匹配),然后从图例中删除该项目(如果它不是前两个系列中的一个)。这假设“运行”和“停止”在开始时交替出现,并且是要保留在图例中的条目。如果不是这样,您可以做更多的逻辑来发现要保留的条目

Sub style_chart()

    Dim cht As Chart
    Dim ser As Series

    'uses the active chart... assume it is selected
    Set cht = ActiveChart

    With cht
        'reset legend so that it matches series
        .HasLegend = False
        .HasLegend = True

        'iterate backwards to delete
        For i = .SeriesCollection.Count To 1 Step -1
            Set ser = .SeriesCollection(i)

            'set series colors based on name
            If ser.Name = "running" Then
                ser.Format.Fill.ForeColor.RGB = RGB(0, 176, 80)
            ElseIf ser.Name = "stopped" Then
                ser.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
            End If

            'delete the legend entry if after first 2
            If i > 2 Then
                .Legend.LegendEntries(i).Delete
            End If
        Next i
    End With

End Sub
之前

之后

我正在使用VBA生成数据。我不介意图表是使用VBA格式化还是通过常规excel界面格式化。