2017-10-04 49 views
0

新手VBA用戶在這裏。希望有人能幫忙?我認爲這可能很簡單,但我是一個noobie。更改VBA代碼填充系列圖的顏色

我有兩種類型的圖表將被BI工具填充到Excel中,我需要根據一些規則對它們中的可用系列進行着色。

第1張圖顯示按年份(年份是系列)的支出,並且從幾個月到24個月有不同程度的歷史記錄。這意味着我現在的24個月的數據分佈在 2015年,2016年,2017年.......明年這改變到2016年,2017年,2018年,因爲我只保持滾動24個月。

無論我需要最近一年(例如2017年)的條形圖數據中的數據集以藍色顯示,前一年(例如2016年)以橙色顯示,然後是前一年(例如2015)灰色。

有可能我不會總是有24個月(即全新的客戶),所以如果只有6個月,同樣的着色邏輯適用,並且最近一年需要以藍色顯示。

Expenditure Chart

第二個圖表更簡單,我認爲。我所顯示的圖表顯示了基於表現的系列值 - 這些系列被稱爲「準時」,「寬容」和「後期」。

他們的顏色需要:「準時」=中等綠色......「寬容」=淺綠色......「遲到」=紅色。

的這裏的是,1 或或所有3這些系列的可以存在沒有預測給定的圖表中,所以我需要的VBA,以確定哪些系列是可用的,然後顏色相應。

Performance Chart

我一直在玩的代碼,但它只是我從其它飼料拼湊起來的,並且不以任何方式從建基地。我想我需要使用ForEach類型的語法,因爲我知道我需要在每個SeriesCollection對象中都有一個循環。

如果有人能幫忙,我會很感激。

+0

如果您添加了一些示例數據和典型情節的截圖,這會增加獲得幫助的機率。 –

+0

感謝您的建議 - 我添加了一些圖片,顯示我需要的內容以及目前正在鏈接的樞紐。 –

+0

看着圖表,它看起來不像你需要VBA。列總是保持相同的顏色。只需修改每個圖表的樣式以符合要求即可。 – jsotola

回答

1

這裏是你的第一個問題,一個簡單的小程序,在您的圖表藍色,橙色重新着色的系列,和灰色,但反向的默認順序:

Sub ReverseDefaultColors() 
    Dim iSrs As Long, nsrs As Long 

    If ActiveChart Is Nothing Then 
    MsgBox "Select a chart and try again.", vbExclamation, "No Active Chart" 
    Else 
    With ActiveChart 
     nsrs = .SeriesCollection.Count 
     ' work backwards from last series 
     For iSrs = nsrs To 1 Step -1 
     Select Case nsrs - iSrs 
      Case 0 ' last series 
      .SeriesCollection(iSrs).Format.Fill.ForeColor.ObjectThemeColor = _ 
       msoThemeColorAccent1 
      Case 1 ' next to last series 
      .SeriesCollection(iSrs).Format.Fill.ForeColor.ObjectThemeColor = _ 
       msoThemeColorAccent2 
      Case 2 ' etc. 
      .SeriesCollection(iSrs).Format.Fill.ForeColor.ObjectThemeColor = _ 
       msoThemeColorAccent3 
     End Select 
     Next 
    End With 
    End If 
End Sub 

下面是另一個關於第二個問題,着色綠色,淺綠色和紅色根據系列名稱(根據需要調整RGB)。你應該注意到有些人(約8%的男性,少於1%的女性)可能會有區別綠色和紅色的問題。出於這個原因,藍色和橙色經常被用作首選配色方案。

Sub ColorGreenToRed() 
    Dim iSrs As Long, nSrs As Long 
    If ActiveChart Is Nothing Then 
    MsgBox "Select a chart and try again.", vbExclamation, "No Active Chart" 
    Else 
    With ActiveChart 
     nSrs = .SeriesCollection.Count 
     For iSrs = 1 To nSrs 
     ' only format series whose names are found 
     Select Case LCase$(.SeriesCollection(iSrs).Name) 
      Case "on time" 
      .SeriesCollection(iSrs).Format.Fill.ForeColor.RGB = _ 
       RGB(0, 176, 80) ' Green 
      Case "in tolerance" 
      .SeriesCollection(iSrs).Format.Fill.ForeColor.RGB = _ 
       RGB(146, 208, 80) ' Light Green 
      Case "late" 
      .SeriesCollection(iSrs).Format.Fill.ForeColor.RGB = _ 
       RGB(255, 0, 0) ' Red 
     End Select 
     Next 
    End With 
    End If 
End Sub 
相關問題