excel vba根据点值更改数据点的条形图颜色

use*_*231 6 excel charts vba points


我有一些图表,其中X值是文本,Y值是数字.如果条形图的Y值小于零,我想为每个条形颜色着色,如果大于或等于零,则为绿色.此外,如果条形的X值是"NET CHANGE",我需要条形为黄色.我按照之前的StackOverflow线程中的说明进行操作:使用基于类别标签的VBA更改条形颜色.

我得到运行时错误451属性让过程没有定义,属性get过程没有返回一个对象.

我的代码如下:

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
Run Code Online (Sandbox Code Playgroud)

错误出现在IF语句中.我也试过.Points(pointIterator).Value,它给我一个"没有为这个对象定义的属性或方法"错误.

对我做错了什么的想法?

在此先感谢您的帮助.

chu*_*uff 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
Run Code Online (Sandbox Code Playgroud)