删除系列后恢复图表默认颜色

Restore chart default colours after deleting series

嗨,我不敢相信我找不到这个问题的答案,但我已经看过了。

在 Excel 中,我想将默认调色板顺序恢复到我已从中删除了一些系列的图表。

也就是说,如果我的调色板是:红色、绿色、蓝色、黄色、橙色、灰色 我最初有一个图表,其中包含 6 条线,它们是按此顺序排列的。

如果我再删除绿线、蓝线和黄线:

我希望有一种方法可以更新图表,这样我就可以 return 把它变成红色、绿色、蓝色,而不是剩下的红色、橙色、灰色——也就是说,如果我重新创建从头开始的最终图表:

显然我可以从头开始重新创建或手动更改颜色,但我经常这样做,而且 select 所有列并删除我不想要的列通常比通过并制作更容易逐行图表。

我使用的是公司 excel,权限很小,所以请不要使用插件。只是想知道这在标准 excel 环境中是否可行。

手动程序是 save the graph model 并在删除系列后重新加载它。

VBA 解决方案可能与此类似:

Sub SubParallelMeridianFormat()
    
    'Declarations.
    Dim IntCounter01 As Integer
    Dim Ser01 As Series
    Dim Char01 As Object
    Dim LngColourPalette(1 To 6) As Long
    
    'Setting LngColourPalette.
    LngColourPalette(1) = vbRed
    LngColourPalette(2) = vbGreen
    LngColourPalette(3) = vbBlue
    LngColourPalette(4) = vbYellow
    LngColourPalette(5) = RGB(255, 165, 0)
    LngColourPalette(6) = 16711680
    
    'Setting Char01.
    Set Char01 = ActiveSheet.Shapes("Graph 1")
    
    'If there are not enouth colour, the macro is terminated.
    If Char01.Chart.SeriesCollection.Count > UBound(LngColourPalette) Then
        MsgBox "The graph contains " & Char01.Chart.SeriesCollection.Count & " series while only " & UBound(LngColourPalette) & " colours have been specified. No changes will be applied. Add more colours to the code and try again.", vbCritical + vbOKOnly, "Not enouth colour"
        Exit Sub
    End If
    
    'Changing colours.
    For Each Ser01 In Char01.Chart.SeriesCollection
        IntCounter01 = IntCounter01 + 1
        Ser01.Format.Line.ForeColor.RGB = LngColourPalette(IntCounter01)
    Next
    
End Sub

您可能需要编辑 LngColourPaletteChar01 的设置。

为了从 pre-existing 图中获取颜色列表,您可以使用此代码:

Sub SubColourList()
    
    'Declarations.
    Dim Ser01 As Series
    Dim Char01 As Object
    Dim IntCounter01 As Integer
    
    'Setting Char01.
    Set Char01 = ActiveSheet.Shapes("Graph 1")
    
    'Reporting colours.
    For Each Ser01 In Char01.Chart.SeriesCollection
        IntCounter01 = IntCounter01 + 1
        Debug.Print "LngColourPalette(" & IntCounter01 & ") = "; Ser01.Format.Line.ForeColor.RGB
    Next
    
End Sub

这里有一个list of colour constants for VBA and a list of colour codes in multiple coding style

我做了一些测试,大多数只调整颜色的宏似乎会造成混乱,特别是如果你想通过使用“图表设计->更改颜色”选项来调整图表。所以我采用了“删除所有系列并再次添加它们”的方法。这在我的电脑 (Office 365) 上运行良好。 Select 图表和 运行 这个宏(你可以分配一个快捷键来加快速度:https://www.excelcampus.com/vba/keyboard-shortcut-run-macro/):

Sub ChartRemoveReAddData()

    Dim DataArr() As String
    Dim n As Long
    
    Set AChart = Application.ActiveChart
    If Not AChart Is Nothing Then
        'First add series to DataArr
        i = 0
        For Each Ser1 In AChart.SeriesCollection
            sFmla = Ser1.Formula
            ReDim Preserve DataArr(i)
            DataArr(i) = sFmla
            i = i + 1
        Next Ser1
        'Again, but now reverse to remove them
        For n = AChart.SeriesCollection.Count To 1 Step -1
            AChart.SeriesCollection(n).Delete
        Next n
        AChart.ClearToMatchStyle
        AChart.ClearToMatchColorStyle
        For i = 0 To UBound(DataArr)
            Set S = AChart.SeriesCollection.NewSeries
            S.Formula = DataArr(i)
        Next i
    End If
   
End Sub

关于颜色的更多细节:Excel 有 10 种主​​题颜色(加上 2 种用于超链接),您可以通过单击找到它们,例如字体颜色或背景颜色按钮。该概述的最后 6 个与图表相关。它们被命名为 Accent 1 到 Accent 6 (https://docs.microsoft.com/en-us/office/vba/api/Office.MsoThemeColorIndex)。正如您所看到的,当您 select 您的图表和 select“图表设计 - 更改颜色”时,这些颜色会显示出来。所以例如ChartColor = 11(在 VBA 中)表示您的图表显示颜色 Accent 1(第一个系列)、Accent 3(第二个系列)、Accent 5(第三个系列)。

此方法将遍历图表,捕获现有系列的公式,删除现有系列,然后从存储的公式中将它们添加回来。这样一来,Excel 将重新应用默认颜色。

我认为它比其他建议的答案更简单,甚至是标记为“答案”的那个,它实际上会按照要求执行。

Sub RebuildChartWithDefaultSeriesColors()
  With ActiveChart.SeriesCollection
    Dim nSrs As Long
    nSrs = .Count
    Dim vSrsFmla As Variant
    ReDim vSrsFmla(1 To nSrs)
    Dim iSrs As Long
    For iSrs = nSrs To 1 Step -1
      vSrsFmla(iSrs) = .Item(iSrs).Formula
      .Item(iSrs).Delete
    Next
    For iSrs = 1 To nSrs
      With .NewSeries
        .Formula = vSrsFmla(iSrs)
      End With
    Next
  End With
End Sub