所以這很有趣。我創建一個使用所有默認值折線圖,然後我運行這個程序:
Sub getLineCOlors()
Dim cht As Chart
Dim srs As Series
Dim colors As String
Dim pt As Point
Set cht = ActiveSheet.ChartObjects(1).Chart
For Each srs In cht.SeriesCollection
With srs.Format.Line
colors = colors & vbCrLf & srs.Name & " : " & _
.ForeColor.RGB
End With
Next
Debug.Print "Line Colors", colors
End Sub
立即窗口然後顯示:
Line Colors
Series1 : 16777215
Series2 : 16777215
Series3 : 16777215
但這顯然並非如此。很明顯,它們都是不同的顏色。如果,而不是.RGB
我做.ObjectThemeColor
,那麼我得到所有0
,這是通過觀察圖表,同樣和明顯錯誤!
Line Colors
Series1 : 0
Series2 : 0
Series3 : 0
現在,這裏是它得到有趣:
如果已經創建的圖表後,我改變了系列的顏色(甚至讓他們保持不變,通過分配到同一個ThemeColors),那麼功能顯示有效的RGB:
Line Colors
Series1 : 5066944
Series2 : 12419407
Series3 : 5880731
就好像Excel(和PowerPoint /等)完全無法識別折線圖上的自動指定的顏色。一旦你分配一種顏色,那麼它可能會讀取顏色。
注:折線圖是挑剔的,因爲你沒有一個.Fill
做,而是.Format.Line.ForeColor
(和.BackColor
)和IIRC還有其他一些怪癖,也一樣可以選擇單個點,並改變它的填充顏色,然後影響前面線段的視覺外觀等等...
這是限於折線圖嗎?也許吧。我過去的經歷說「可能」,雖然我不能說這是一個錯誤,但它肯定是一個錯誤。
如果我運行一個柱形圖類似的程序 - 再次僅使用自動分配的默認顏色,
Sub getCOlumnColors()
Dim cht As Chart
Dim srs As Series
Dim colors As String
Dim pt As Point
Set cht = ActiveSheet.ChartObjects(2).Chart
For Each srs In cht.SeriesCollection
With srs.Format.Fill
colors = colors & vbCrLf & srs.Name & " : " & _
.ForeColor.RGB
End With
Next
Debug.Print "Column Colors", colors
End Sub
然後我得到什麼似乎是有效的RGB值:
Column Colors
Series1 : 12419407
Series2 : 5066944
Series3 : 5880731
但是:它仍然無法識別有效的ObjectThemeColor
。如果我改變.RGB
那麼這個輸出:
Column Colors
Series1 : 0
Series2 : 0
Series3 : 0
因此,基於這些觀察,肯定是一些無法進入ObjectThemeColor
和/或自動分配的色彩格式.RGB
財產。
正如蒂姆·威廉姆斯所證實的那樣,這是一個遠遠早於2005年的錯誤,至少與RGB有關,並且可能將這個錯誤傳遞給Excel 2007+與ObjectThemeColor等等。這不太可能要解決任何時間很快的話,所以我們需要一個黑客的解決方案:)
更新的解決方案
結合上述兩種方法!將每個系列從行轉換爲xlColumnClustered,然後從.Fill中查詢顏色屬性,然後將系列圖表類型更改回其原始狀態。這可能比試圖利用順序索引更可靠(這將是不可靠的,在所有的,如果用戶已經重新排序的系列,例如,使得「系列1」是在指數3等)
Sub getLineColors()
Dim cht As Chart
Dim chtType As Long
Dim srs As Series
Dim colors As String
Set cht = ActiveSheet.ChartObjects(1).Chart
For Each srs In cht.SeriesCollection
chtType = srs.ChartType
'Temporarily turn this in to a column chart:
srs.ChartType = 51
colors = colors & vbCrLf & srs.Name & " : " & _
srs.Format.Fill.ForeColor.RGB
'reset the chart type to its original state:
srs.ChartType = chtType
Next
Debug.Print "Line Colors", colors
End Sub
圖片來源:David Zemens
你能發表更多的代碼嗎?具體來說,我想看看你是如何設置這些屬性,因爲你說*「[圖表系列對象]'sr' ...被設置爲有線條,其顏色與標記線和標記相同填充,設置爲Accent1「。*和/或是否可以鏈接到任何您提到的例子,並通過'msoThemeColorIndex'設置顏色。 – CBRF23