excel vba изменение цвета диаграммы для точки данных на основе значения точки


У меня есть некоторые диаграммы, в которых значения X являются текстами и значениями Y являются численными. Я хочу, чтобы каждый цвет был красным, если значение Y для бара меньше нуля, зеленое, если оно больше или равно нулю. Кроме того, если значение X на панели «NET CHANGE», мне нужно, чтобы полоска была желтой. Я следил за направлениями в предыдущем потоке StackOverflow здесь: Изменение цветов бара с использованием VBA на основе метки категории .

Я получаю ошибку времени выполнения 451. Свойство allow 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, который дал мне ошибку «свойство или метод, не определенный для этого объекта».

Любые мысли о том, что я делаю неправильно?

Заранее спасибо за вашу помощь.

Вы сталкиваетесь с трудностями при использовании ClassCollection (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 

Вот альтернатива, которая не требует VBA, и работает динамически по мере обновления формул. Ознакомьтесь с примером «Условная форматированная диаграмма» в этом уроке:

Условное форматирование в диаграммах Excel

Давайте будем гением компьютера.