2009-07-02 25 views
1

我想在表格中勾勒出圖表數據範圍源代碼,就像圖形數據系列被點擊時,圖形用戶界面將用藍色勾勒範圍一樣。用戶可以選擇各種圖表視圖,每個數據系列的範圍高亮顏色需要與圖表中顯示的顏色相匹配。在Excel中突出顯示圖表數據系列的優雅方法

爲了記錄在案,這裏是我考慮的方法:

  1. 解析圖表系列值串並提取數據範圍
  2. 請在存儲上的範圍,其顏色的信息表中的查找使用

最後,我選擇了2,因爲看起來更容易實現,並正確管理我可能必須存儲方法1的顏色,否則它的好處。

突出顯示過程從Worksheet_Change事件中調用,對圖表名稱,從表中拉出的範圍和顏色進行查找,然後執行單元格格式化。此方法的侷限性是每個新圖表視圖的範圍/顏色數據必須預先計算。這對我當前的實施來說並不是什麼大問題,但是在未來的使用中,圖表可能更具動態性,這對我來說是一個限制因素。

所以,雖然我已經有了這個工作正常的版本,我敢肯定,必須有一個更優雅的方式來實現這一點。

有什麼建議嗎?

回答

5

編輯:

好的,這似乎處理更好的情況。觸發代碼是相同的,但這裏是模塊的新代碼:

Function SeriesRange(s As Series) As Range 
    Dim sf As String, fa() As String 


    sf = s.Formula 
    sf = Replace(sf, "=SERIES(", "") 

    If sf = "" Then 
     Set SeriesRange = Nothing 
     Exit Function 
    End If 

    fa = Split(sf, ",") 


    Set SeriesRange = Range(fa(2)) 

End Function 

Sub x(c As Chart) 
    Dim sc As Series 
    Dim sr As Range 

    If SeriesRange(c.SeriesCollection(1)) Is Nothing Then 
     Exit Sub 
    End If 

    Set sr = SeriesRange(c.SeriesCollection(1)) 

    sr.CurrentRegion.Interior.ColorIndex = xlNone 
    For Each sc In c.SeriesCollection 
     If sc.Interior.Color > 1 Then 
      SeriesRange(sc).Interior.Color = sc.Interior.Color 
     ElseIf sc.Border.ColorIndex > 1 Then 
      SeriesRange(sc).Interior.Color = sc.Border.Color 
     ElseIf sc.MarkerBackgroundColorIndex > 1 And sc.MarkerBackgroundColorIndex < 57 Then 
      SeriesRange(sc).Interior.ColorIndex = sc.MarkerBackgroundColorIndex 
     ElseIf sc.MarkerForegroundColorIndex > 1 And sc.MarkerForegroundColorIndex < 57 Then 
      SeriesRange(sc).Interior.ColorIndex = sc.MarkerForegroundColorIndex 
     Else 
      MsgBox "Unable to determine chart color for data series " & sc.Name & " ." & vbCrLf _ 
        & "It may help to assign a color rather than allowing AutoColor to assign one." 
     End If 
    Next sc 

End Sub 

/編輯

,這大概比優雅更野蠻,但我認爲你想要做什麼。它包含您的第一個項目符號點,以獲取Series對象的範圍以及一個子項,以便運行圖表的SeriesCollection中的所有Series對象。這在Chart_DeActivate上激活。大部分代碼都是頂級的 - 請參閱源代碼的註釋。

在一個模塊:

Function SeriesRange(s As Series) As Range 
    Dim sf As String, fa() As String 
    Dim i As Integer 
    Dim result As Range 

    sf = s.Formula 
    sf = Replace(sf, "=SERIES(", "") 

    fa = Split(sf, ",") 

    Set SeriesRange = Range(fa(2)) 
End Function 

Sub x(c As Chart) 
    Dim sc As Series 
    Dim sr As Range 

    Set sr = SeriesRange(c.SeriesCollection(1)) 

    sr.CurrentRegion.Interior.ColorIndex = xlNone 

    For Each sc In c.SeriesCollection 
     SeriesRange(sc).Interior.Color = sc.Interior.Color 
    Next sc 

End Sub 

ThisWorkbook對象模塊:

' Jacked from C Pearson http://www.cpearson.com/excel/Events.aspx ' 
Public WithEvents CHT As Chart 

Private Sub CHT_Deactivate() 
    x CHT 
End Sub 

Private Sub Workbook_Open() 
    Set CHT = Worksheets(1).ChartObjects(1).Chart 
End Sub 
1

您是否嘗試過使用條件格式?

+0

我沒有,但我實在看不出它的工作作爲靈活地其他兩個選項。對於幾個簡單的圖表來說,它可能會正常工作,但只要範圍可能重疊,我可以看到它成爲一個管理的噩夢。 – Lunatik 2009-07-09 07:52:18

+0

您可以創建一個附加列,這是一種鍵,用於固定每行,以便它始終是唯一的。然後,您可以根據此列執行約束,並根據需要將其隱藏起來以達到審美目的。 – super9 2009-07-09 08:35:50

相關問題