我正在尝试编写一个 Excel 2010 VBA 子程序,以便根据预定义(即由我定义的)标准格式化图表。我希望能够设置的特定属性仅仅是通过双击数据系列时打开的“格式化数据系列”窗口可用的属性。
为了找到需要设置的各种属性的名称,我将对数据系列样式所做的更改录制为宏。但是,尽管我可以通过“格式化数据系列”窗口将线条颜色和标记线条颜色设置为不同的颜色,但录制的宏(注释如下)引用了线条颜色和标记线条颜色的同名(难以区分)对象。
此外,当我实际运行宏时,有两个问题。首先,尽管录制的宏引用了 marker-fill 属性.ForeColor.Brightness
,但执行宏时该行会产生错误。错误显示“对象 ColorFormat 的方法 Brightness 失败”。其次,录制的代码实际上同时设置了系列的标记线颜色和主线,因此在录制的代码中,它们都首先设置为我希望的标记线颜色,然后都设置为我想要的主线颜色。
如何设置标记填充、标记线条颜色和线条颜色。
Sub Macro1()
'
' Macro6 Macro
' On Sheet 1 there is a single embedded chrt
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.SeriesCollection(1).Select
With Selection.Format.Fill
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
' The following (recorded line produces an error)
.ForeColor.Brightness = 0.5
.Transparency = 0
.Solid
End With
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorAccent5
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0.400000006
.Transparency = 0
End With
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorAccent6
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = -0.5
.Transparency = 0
End With
End Sub
答案1
看起来这些格式选项在 Excel 2010 和 2013 中的实现有些尴尬:
- 线条颜色和属性按照宏代码记录的方式设置,使用对象
Series.Format
及其子对象(Fill
、Glow
、Shadow
等 [1])。 - 标记填充颜色全部系列中的标记使用
Series.MarkerBackgroundColor
或进行设置Series.MarkerBackgroundColorIndex
。同样,全部系列中的标记用Series.MarkerForegroundColor
或设定Series.MarkerForegroundColorIndex
。[2] - 或者,可以设置标记填充和线条颜色单独地通过
Series.Points(n).Format.Fill
和Series.Points(n).Format.Line
对象。然而至少在 Excel 2013 中,更改Series.Points(n).Format.Line.ForeColor
还改变相关数据点前紧接着的线段的颜色。
#2 的属性看起来像是以前 Excel DOM 的遗留物,但扩展了功能并.MarkerForegroundColor
可以.MarkerBackGroundColor
接受任何 RGB 值。#3 的属性与 Excel 2010 及更新版本中的新可配置性级别一致,但它们似乎存在错误。错误中一个令人讨厌的方面是,标记线颜色似乎与系列线颜色交织在一起——据我所知,不可能在不影响标记线颜色的情况下更改线颜色,反之亦然。特别是,似乎不可能在使用 VBA 实现统一的系列线颜色的同时逐点应用标记线颜色的变化。(再次说明,我在这里是在 Excel 2013 中进行测试;2010 的行为可能有所不同。)
无论如何,在不需要逐点调整颜色的情况下,如下所示的辅助函数可能有助于更改线条颜色而不影响标记填充或线条颜色(此处,newLineColor 被指定为 Long RGB 值 [3]):
Sub ChangeLineColorOnly(srs as Series, newLineColor as Long)
Dim oldMkrFill as Long, oldMkrLine as Long
' Store old marker colors
oldMkrFill = srs.MarkerBackgroundColor
oldMkrLine = srs.MarkerForegroundColor
' Set the series ForeColor
srs.Format.Fill.ForeColor.RGB = newLineColor
' Restore the old marker colors
srs.MarkerBackgroundColor = oldMkrFill
srs.MarkerForegroundColor = oldMkrLine
End Sub
可以轻松编写上述辅助函数的替代版本,以适应指定为 SchemeColor [4] 的颜色,或仅存储标记线颜色等。
至于.ForeColor.Brightness
故障,它可能是开发 Excel 2010 版本时粗心地重新编码“录制宏”功能造成的。它可能只应插入到某些类型的图表的录制 VBA 代码中,其中是要.Brightness
修改的有效属性。
[1] http://msdn.microsoft.com/en-us/library/office/ff839279(v=office.14).aspx
[2] http://msdn.microsoft.com/en-us/library/office/ff840677(v=office.14).aspx
[3] http://msdn.microsoft.com/en-us/library/zc1dyw8b%28v=vs.90%29.aspx
[4] http://msdn.microsoft.com/en-us/library/office/ff836764(v=office.14).aspx
答案2
这对我有用。
ActiveChart.FullSeriesCollection(1).Select
With Selection.Format.Fill
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 0, 0)
.Transparency = 0
.Solid
End With
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 0, 0)
.Transparency = 0
End With
答案3
我想法这对我来说也是有效的,除了无论我输入什么 RGB 值,它都会将填充变成红色。
ActiveChart.FullSeriesCollection(1).Select With Selection.Format.Fill .Visible = msoTrue .ForeColor.RGB = RGB(255, 0, 0) .Transparency = 0 .Solid End With