我有一些图表,其中X值是文本,Y值是数字。如果条形图的Y值小于零,我想为每个条形颜色着色,如果大于或等于零,则为绿色。此外,如果条形的X值是“NET CHANGE”,我需要条形为黄色。我按照之前的StackOverflow线程中的说明进行操作:Changing Bar colors using VBA based on category label。
我收到运行时错误451属性let过程未定义且属性获取过程未返回对象。
我的代码如下:
For chartIterator = 1 To ActiveSheet.ChartObjects.count
For pointIterator = 1 To ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator).Chart.SeriesCollection(1).Points.count
If ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator).Chart.SeriesCollection(1).Values(pointIterator) >= 0 Then
ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator).Chart.SeriesCollection(1).Points(pointIterator).Interior.Color = _
RGB(146, 208, 80)
Else
ActiveWorkbook.Sheets("Due To Chart").ChartObjects(chartIterator).Chart.SeriesCollection(1).Points(pointIterator).Interior.Color = _
RGB(255, 0, 0)
End If
Next pointIterator
Next chartIterator
IF语句出现错误。我也试过.Points(pointIterator).Value,它让我得到了一个“没有为这个对象定义的属性或方法”错误。
对我做错了什么的想法?
提前感谢您的帮助。
答案 0 :(得分:6)
您在使用SeriesCollection(1).Values时遇到了麻烦,您将其视为可以迭代的数组。相反,这是一个返回SeriesCollection中的点值的函数。
需要将函数的结果分配给数组变量,然后迭代数组以测试数组中的值是否大于或小于零。然后,您可以将颜色分配给图表点。
这段代码可以解决问题:
Sub color_chart()
Dim chartIterator As Integer, pointIterator As Integer, _
seriesArray() As Variant
For chartIterator = 1 To ActiveSheet.ChartObjects.Count
seriesArray = ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator). _
chart.SeriesCollection(1).Values
For pointIterator = 1 To UBound(seriesArray)
If seriesArray(pointIterator) >= 0 Then
ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator). _
chart.SeriesCollection(1).Points(pointIterator).Interior.Color = _
RGB(146, 208, 80)
Else
ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator). _
chart.SeriesCollection(1).Points(pointIterator).Interior.Color = _
RGB(255, 0, 0)
End If
Next pointIterator
Next chartIterator
End Sub
答案 1 :(得分:3)
这是一个不需要VBA的替代方案,并且在公式更新时动态工作。查看本教程中的“条件格式化条形图”示例: