2013-10-16 26 views
3

我有一個圖表系列使用一種顏色(它可以是msoThemeColorAccent<#>或任何其他)的標記線,另一種顏色的標記填充(它可以是msoThemeColorAccent<#>,較輕x%或任何其他),並沒有線。我想確定圖表系列是否使用標記行的msoThemeColorAccent<#>,使用msoThemeColorAccent<#>msoThemeColorAccent<#>,標記填充是否使用較輕的x%,以及是否使用哪種特定的重音顏色。獲取主題顏色信息圖表系列

我試着返回一系列的一些屬性,沒有運氣。在對圖表系列(爲了測試目的,將其設置爲具有線條,其顏色與標記線條和標記填充相同,設置在Accent1處)相同的子系統的執行過程中的斷點處,一個With sr結構,我在即時窗口測試:

? .Format.Line.BackColor.ObjectThemeColor, .Format.Line.ForeColor.ObjectThemeColor 
0    0 
? .Format.Fill.BackColor.ObjectThemeColor, .Format.Fill.ForeColor.ObjectThemeColor 
0   -2 

我期望以某種方式獲得的msoThemeColorAccent1的值(= 5),這是在我的系列中使用。有沒有辦法做到這一點?

我發現的所有示例都使用msoThemeColorIndex來設置顏色,而沒有將其作爲讀取的值。 PS:在第一部分中,我沒有成功,在一系列顏色統一的情況下。我預見如果我克服了這個障礙,在檢測正確的TintAndShade,甚至在沒有線條,不同標記填充與標記線的目標情況下,我可能仍然存在問題。

+0

你能發表更多的代碼嗎?具體來說,我想看看你是如何設置這些屬性,因爲你說*「[圖表系列對象]'sr' ...被設置爲有線條,其顏色與標記線和標記相同填充,設置爲Accent1「。*和/或是否可以鏈接到任何您提到的例子,並通過'msoThemeColorIndex'設置顏色。 – CBRF23

回答

1

所以這很有趣。我創建一個使用所有默認值折線圖,然後我運行這個程序:

enter image description here

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

0

這是DeerSpotter解決方案之一。 但是,在將圖表類型更改爲某個臨時ChartType並將其更改回原始之後。你正在失去一些格式。舉個例子,你得到第二個軸後,什麼並不總是需要。

所以,當你的圖表線顏色自動設置,你不能簡單地得到它的顏色指數。您總是會收到0或16777215 - 白色。 最好的解決方案就是在嘗試更改或獲取圖表線條顏色之前,先用Line.Visible tur off和trun on做這個小動作。之後,你可以簡單地閱讀和chnage你的線條顏色。

ppSeries.Format.Line.Visible = msoFalse 
ppSeries.Format.Line.Visible = msoTrue