6

我有一些图表,其中 X 值是文本,Y 值是数字。如果条的 Y 值小于零,我想将每个条着色为红色,如果大于或等于零,则将其着色为绿色。另外,如果条的 X 值为“NET CHANGE”,我需要条为黄色。我在这里按照以前的 StackOverflow 线程中的说明进行操作:根据类别标签使用 VBA 更改条形颜色

我收到运行时错误 451 Property let procedure not defined 并且 property get procedure 没有返回对象。

我的代码如下:

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,它得到了“未为此对象定义的属性或方法”错误。

对我做错了什么有任何想法吗?

在此先感谢您的帮助。

4

2 回答 2

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
于 2012-12-13T21:23:47.933 回答
3

这是一个不需要 VBA 的替代方案,并且随着公式的更新而动态工作。查看本教程中的“条件格式条形图”示例:

Excel 图表中的条件格式

于 2013-01-15T03:25:43.140 回答