在Excel中高亮显示图表数据系列的优雅方法

我想在表格中概述图表数据范围源,就像图表数据系列被点击一样,graphics用户界面将以蓝色勾勒一个范围。 用户可以select各种图表视图,每个数据系列的范围高亮颜色需要与图表中显示的颜色相匹配。

为了logging,这里是我考虑的方法:

  1. parsing图表系列值string并提取数据范围
  2. 在存储关于要使用的范围和颜色的信息的表上进行查找

最后,我select了第二种方式,因为这样做似乎更容易实施,并且正确地pipe理我可能必须存储方法1的颜色,否定其好处。

通过Worksheet_Change事件调用突出显示过程,查看图表名称,从表格中拉出的范围和颜色,然后执行单元格格式化。 这种方法的局限性在于每个新图表视图的范围/颜色数据必须预先计算。 这对我目前的实施来说并不是什么大问题,但是在未来的使用中,图表可能更具有dynamic性,这是我的一个限制因素。

所以,虽然我已经有了这个工作的好版本,但我确定必须有一个更优雅的方式来实现这一点。

有什么build议么?

编辑:

好的,这似乎更好地处理更多的情况。 触发代码是相同的,但这里是模块的新代码:

 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 

你有没有尝试过使用条件格式?