VBA 根据包含一些文本的 headers 更新图表
VBA to update chart based on headers containing some text
我有一张图表可以帮助我按人绘制一系列事件。在绘制图表时,我需要一些 classes 的事件来保持一致性。
例如,简在她的职业生涯中被雇用过两次。我希望 class 的租金保持不变。但是,Excel 会将它们打断为不同的 classes,因为一个名为 01-Hire,另一个名为 02-Hire。在下面的示例中,所有雇员都应该是蓝色的。
我想要一些代码在 header 中搜索 "Hire",然后应用一致的颜色。 注意,序列之间可能有不同的header,所以代码需要足够聪明,只对包含相同文本(而不是序列号)的事物进行分组。
我能找到的最接近这样做的是在这里:
Private Sub FormatShapeLegend(sheet As Worksheet, legendName As String, targetColor As MsoRGBType)
Dim shp As Shape
Dim chrt As Chart
Dim s As Series
For Each shp In sheet.Shapes
If shp.HasChart Then
Set chrt = shp.Chart
'Loop the dataseries to find the legend with the desired name.
For Each s In chrt.SeriesCollection
'If the name fits, go ahead and format the series.
If LCase(s.Name) = LCase(legendName) Then
s.Format.Fill.ForeColor.RGB = targetColor
End If
Next
End If
Next
End Sub
FormatShapeLegend ActiveSheet, "ISO", RGB(0, 0, 255)
我想对下面的所有 class 执行此操作,类似于图表。
期望的输出
数据table
原始代码
行标签 01 - 雇用 01 - 晋升 01 - 任期 02 - 雇用 02 - 晋升 02 - 任期 03 - 雇用 03 - 晋升 03 - 任期
简 38 10 29
本 15 50 10
乔 68 56 10 7
丽莎 61 41
珍妮 24
杰里 81 16
如果您的系列标签总是重复 "Hire x"、"Prom x"、"Term x",那么这样的方法会起作用:
Dim s As Series, x As Long
x = 0
For Each s In ActiveSheet.ChartObjects(1).Chart.SeriesCollection
x = x + 1
s.Format.Fill.ForeColor.RGB = Array(vbBlue, vbRed, vbGreen)(x Mod 3)
Next s
如果您需要根据系列名称进行操作,则:
Dim s As Series, clr As Long, nm As String
For Each s In ActiveSheet.ChartObjects(1).Chart.SeriesCollection
nm = LCase(s.Name)
clr = vbYellow 'default
If nm Like "*hire*" Then
clr = vbBlue
ElseIf nm Like "*prom*" Then
clr = vbGreen
ElseIf nm Like "*term*" Then
clr = vbRed
End If
s.Format.Fill.ForeColor.RGB = clr
Next s
我有一张图表可以帮助我按人绘制一系列事件。在绘制图表时,我需要一些 classes 的事件来保持一致性。
例如,简在她的职业生涯中被雇用过两次。我希望 class 的租金保持不变。但是,Excel 会将它们打断为不同的 classes,因为一个名为 01-Hire,另一个名为 02-Hire。在下面的示例中,所有雇员都应该是蓝色的。
我想要一些代码在 header 中搜索 "Hire",然后应用一致的颜色。 注意,序列之间可能有不同的header,所以代码需要足够聪明,只对包含相同文本(而不是序列号)的事物进行分组。
我能找到的最接近这样做的是在这里:
Private Sub FormatShapeLegend(sheet As Worksheet, legendName As String, targetColor As MsoRGBType)
Dim shp As Shape
Dim chrt As Chart
Dim s As Series
For Each shp In sheet.Shapes
If shp.HasChart Then
Set chrt = shp.Chart
'Loop the dataseries to find the legend with the desired name.
For Each s In chrt.SeriesCollection
'If the name fits, go ahead and format the series.
If LCase(s.Name) = LCase(legendName) Then
s.Format.Fill.ForeColor.RGB = targetColor
End If
Next
End If
Next
End Sub
FormatShapeLegend ActiveSheet, "ISO", RGB(0, 0, 255)
我想对下面的所有 class 执行此操作,类似于图表。
期望的输出
数据table
原始代码
行标签 01 - 雇用 01 - 晋升 01 - 任期 02 - 雇用 02 - 晋升 02 - 任期 03 - 雇用 03 - 晋升 03 - 任期
简 38 10 29
本 15 50 10
乔 68 56 10 7
丽莎 61 41
珍妮 24
杰里 81 16
如果您的系列标签总是重复 "Hire x"、"Prom x"、"Term x",那么这样的方法会起作用:
Dim s As Series, x As Long
x = 0
For Each s In ActiveSheet.ChartObjects(1).Chart.SeriesCollection
x = x + 1
s.Format.Fill.ForeColor.RGB = Array(vbBlue, vbRed, vbGreen)(x Mod 3)
Next s
如果您需要根据系列名称进行操作,则:
Dim s As Series, clr As Long, nm As String
For Each s In ActiveSheet.ChartObjects(1).Chart.SeriesCollection
nm = LCase(s.Name)
clr = vbYellow 'default
If nm Like "*hire*" Then
clr = vbBlue
ElseIf nm Like "*prom*" Then
clr = vbGreen
ElseIf nm Like "*term*" Then
clr = vbRed
End If
s.Format.Fill.ForeColor.RGB = clr
Next s