循环遍历 Excel VBA 中的特定图表以更改系列颜色
Looping through a specific chart in Excel VBA to Change the Series colour
一段时间以来一直在尝试更改 Excel 到 VBA 中特定图表的系列颜色。我有更改所有图表的代码——这很方便,但并非所有图表都具有相同数量的系列。这是我到目前为止所拥有的。例如,如果我只想更改图表 4 的系列颜色。
Sub Serieschange()
Dim myChart As ChartObject
For Each myChart In Sheets("Sheet1").ChartObjects
myChart.Chart.ChartType = xlXYScatterSmoothNoMarkers
myChart.Chart.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(255, 0, 0)
myChart.Chart.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(50, 656, 989)
myChart.Chart.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(60, 2, 5)
myChart.Chart.SeriesCollection(4).Format.Line.ForeColor.RGB = RGB(20, 900, 3)
'TRY TO GET CODE TO LOOP FOR SPECIFIC CHARTS
'If ChartObjects = ChartObjects("Chart 4") Then
'myChart.Chart.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(3, 0, 0)
'myChart.Chart.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(2, 656, 989)
'myChart.Chart.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(1, 2, 5)
'End If
Next myChart
End Sub
这个就可以了,按需搭配:
Option Explicit
Sub Serieschange()
Dim SeriesCounter As Long
Dim myChart As ChartObject
For Each myChart In Sheets("Sheet1").ChartObjects
With myChart.Chart
SeriesCounter = .SeriesCollection.Count
.ChartType = xlXYScatterSmoothNoMarkers
Select Case SeriesCounter
Case 4
.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(255, 0, 0)
.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(50, 656, 989)
.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(60, 2, 5)
.SeriesCollection(4).Format.Line.ForeColor.RGB = RGB(20, 900, 3)
Case 3
.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(3, 0, 0)
.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(2, 656, 989)
.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(1, 2, 5)
End Select
End With
Next myChart
End Sub
这是一个简单的例子。
Option Explicit
Sub Serieschange()
Dim series5RGB As Variant
Dim series3RGB As Variant
series5RGB = Array(RGB(255, 0, 0), _
RGB(50, 656, 989), _
RGB(60, 2, 5), _
RGB(20, 900, 3), _
RGB(100, 100, 100))
series3RGB = Array(RGB(255, 255, 255), _
RGB(355, 355, 355), _
RGB(555, 555, 555))
Dim i As Long
Dim rgbSeries As Variant
Dim myChart As ChartObject
For Each myChart In Sheets("Sheet1").ChartObjects
With myChart.Chart
rgbSeries = IIf(.SeriesCollection.Count = 3, series3RGB, series5RGB)
.ChartType = xlXYScatterSmoothNoMarkers
For i = 1 To .SeriesCollection.Count
.SeriesCollection(i).Format.Line.ForeColor.RGB = rgbSeries(i - 1)
Next i
End With
Next myChart
End Sub
运行 第一个循环中的第二个循环,遍历 SeriesCollection
集合中的每个 Series
。
为了使事情变得更简单,还可以定义一个 Array
以包含您认为可能需要的尽可能多的颜色。 (谨慎行事 - 太多总比太少好 - 如果需要可以考虑使用 Mod
到 "overflow")
在这个例子中,我没有使用 For Each Series In Chart.SeriesCollection
,而是使用整数循环来更容易地从数组中获取颜色
Sub Serieschange()
Dim myChart As ChartObject, MaxColours As Long, CurrentSeries As Long, myColours As Variant
'Create an Array of the possible colours
myColours = Array(RGB(255, 0, 0), _
RGB(50, 656, 989), _
RGB(60, 2, 5), _
RGB(20, 900, 3) _
) 'Add more colours as desired
MaxColours = 1 + UBound(myColours) 'If we have more Series than Colours, we can start from the beginning again
For Each myChart In ThisWorkbook.Worksheets("Sheet1").ChartObjects 'Loop through every Chart in the Sheet
With myChart.Chart
.ChartType = xlXYScatterSmoothNoMarkers
If .SeriesCollection.Count > 0 Then 'Check we have any Series to colour first!
For CurrentSeries = 1 To .SeriesCollection.Count 'Loop through every Series in the Chart
.SeriesCollection(CurrentSeries).Format.Line.ForeColor.RGB = myColours((CurrentSeries - 1) Mod MaxColours)
Next CurrentSeries
End If
End With
Next myChart
End Sub
一段时间以来一直在尝试更改 Excel 到 VBA 中特定图表的系列颜色。我有更改所有图表的代码——这很方便,但并非所有图表都具有相同数量的系列。这是我到目前为止所拥有的。例如,如果我只想更改图表 4 的系列颜色。
Sub Serieschange()
Dim myChart As ChartObject
For Each myChart In Sheets("Sheet1").ChartObjects
myChart.Chart.ChartType = xlXYScatterSmoothNoMarkers
myChart.Chart.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(255, 0, 0)
myChart.Chart.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(50, 656, 989)
myChart.Chart.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(60, 2, 5)
myChart.Chart.SeriesCollection(4).Format.Line.ForeColor.RGB = RGB(20, 900, 3)
'TRY TO GET CODE TO LOOP FOR SPECIFIC CHARTS
'If ChartObjects = ChartObjects("Chart 4") Then
'myChart.Chart.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(3, 0, 0)
'myChart.Chart.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(2, 656, 989)
'myChart.Chart.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(1, 2, 5)
'End If
Next myChart
End Sub
这个就可以了,按需搭配:
Option Explicit
Sub Serieschange()
Dim SeriesCounter As Long
Dim myChart As ChartObject
For Each myChart In Sheets("Sheet1").ChartObjects
With myChart.Chart
SeriesCounter = .SeriesCollection.Count
.ChartType = xlXYScatterSmoothNoMarkers
Select Case SeriesCounter
Case 4
.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(255, 0, 0)
.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(50, 656, 989)
.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(60, 2, 5)
.SeriesCollection(4).Format.Line.ForeColor.RGB = RGB(20, 900, 3)
Case 3
.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(3, 0, 0)
.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(2, 656, 989)
.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(1, 2, 5)
End Select
End With
Next myChart
End Sub
这是一个简单的例子。
Option Explicit
Sub Serieschange()
Dim series5RGB As Variant
Dim series3RGB As Variant
series5RGB = Array(RGB(255, 0, 0), _
RGB(50, 656, 989), _
RGB(60, 2, 5), _
RGB(20, 900, 3), _
RGB(100, 100, 100))
series3RGB = Array(RGB(255, 255, 255), _
RGB(355, 355, 355), _
RGB(555, 555, 555))
Dim i As Long
Dim rgbSeries As Variant
Dim myChart As ChartObject
For Each myChart In Sheets("Sheet1").ChartObjects
With myChart.Chart
rgbSeries = IIf(.SeriesCollection.Count = 3, series3RGB, series5RGB)
.ChartType = xlXYScatterSmoothNoMarkers
For i = 1 To .SeriesCollection.Count
.SeriesCollection(i).Format.Line.ForeColor.RGB = rgbSeries(i - 1)
Next i
End With
Next myChart
End Sub
运行 第一个循环中的第二个循环,遍历 SeriesCollection
集合中的每个 Series
。
为了使事情变得更简单,还可以定义一个 Array
以包含您认为可能需要的尽可能多的颜色。 (谨慎行事 - 太多总比太少好 - 如果需要可以考虑使用 Mod
到 "overflow")
在这个例子中,我没有使用 For Each Series In Chart.SeriesCollection
,而是使用整数循环来更容易地从数组中获取颜色
Sub Serieschange()
Dim myChart As ChartObject, MaxColours As Long, CurrentSeries As Long, myColours As Variant
'Create an Array of the possible colours
myColours = Array(RGB(255, 0, 0), _
RGB(50, 656, 989), _
RGB(60, 2, 5), _
RGB(20, 900, 3) _
) 'Add more colours as desired
MaxColours = 1 + UBound(myColours) 'If we have more Series than Colours, we can start from the beginning again
For Each myChart In ThisWorkbook.Worksheets("Sheet1").ChartObjects 'Loop through every Chart in the Sheet
With myChart.Chart
.ChartType = xlXYScatterSmoothNoMarkers
If .SeriesCollection.Count > 0 Then 'Check we have any Series to colour first!
For CurrentSeries = 1 To .SeriesCollection.Count 'Loop through every Series in the Chart
.SeriesCollection(CurrentSeries).Format.Line.ForeColor.RGB = myColours((CurrentSeries - 1) Mod MaxColours)
Next CurrentSeries
End If
End With
Next myChart
End Sub