2009-07-02 45 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

相关问题