На данный момент у меня есть:
Private Sub Worksheet_Calculate()
ActiveSheet.ChartObjects("Chart").Activate
Dim ch As Chart
Set ch = ActiveChart
If Range("D4").Value = 0 Then
ch.SeriesCollection("Series1").Format.Line.ForeColor.RGB = RGB(255, 255, 255)
ElseIf Range("D4").Value > 2 Then
ch.SeriesCollection("Series1").Format.Line.ForeColor.RGB = RGB(0, 255, 0)
ElseIf Range("D4").Value <= 2 And Range("D4").Value >= 1 Then
ch.SeriesCollection("Series1").Format.Line.ForeColor.RGB = RGB(0, 200, 0)
ElseIf Range("D4").Value < -2 Then
ch.SeriesCollection("Series1").Format.Line.ForeColor.RGB = RGB(255, 0, 0)
ElseIf Range("D4").Value < 0 And Range("D4").Value >= -1 Then
ch.SeriesCollection("Series1").Format.Line.ForeColor.RGB = RGB(200, 0, 0)
Else
ch.SeriesCollection("Series1").Format.Line.ForeColor.RGB = RGB(0, 0, 0)
End If
End Sub
Он смотрит на значение в D4, и если D4 находится между моими границами, он присваивает серии графиков определенный цвет (это значение отсутствует на графике, а скорее является индикатором, используемым для классификации движения графика).
Я хочу пропустить это через 10 различных коллекций серий диаграмм, где в каждом цикле я спускаюсь на одну ячейку. поэтому перейдите к ячейке D5, проверьте все условия для серии 2, затем к ячейке D6, проверьте все условия для серии 3.
Я застрял здесь, так как знаю, как это сделать для половины этого, но не знаю, как зациклиться на чарт-сериях.
Учитывая ваш комментарий, это может быть решением:
Private Sub Worksheet_Calculate()
Set rng = Sheets("Sheet1").Range("D4:D10")
For i = 1 To 7
ProcessSeries i, rng.Cells(i).Value
Next
End Sub
Sub ProcessSeries(i As Integer, j As Double)
With Worksheets("Sheet1").ChartObjects("Chart") _
.SeriesCollection("Series" & i).Format.Line.ForeColor
If j < -2 Then
.RGB = RGB(255, 0, 0) ' for values up to -2
ElseIf j < -1 Then
.RGB = RGB(0, 0, 0) ' for values from -2 to -1
ElseIf j < 0 Then
.RGB = RGB(200, 0, 0) ' for values from -1 to 0
ElseIf j = 0 Then
.RGB = RGB(255, 255, 255) ' for value of 0
ElseIf j < 1
.RGB = RGB(0, 0, 0) ' for values from 0 to 1
ElseIf j <= 2 Then
.RGB = RGB(0, 200, 0) ' for values from 1 to 2
Else
.RGB = RGB(0, 255, 0) ' for values above 2
End If
End With
End Sub
В Worksheet_Calculate ProcessSeries вызывается для каждого «i» от 1 до 7. «i» и значение связанной ячейки из «D4:D10» предоставляются для ProcessSeries.
При запуске ProcessSeries в качестве номера серии данных указывается «i» (мы ожидаем, что серии будут называться как «Series1»..Series7», что делается автоматически при создании диаграммы). «j» дает номер из соответствующей ячейки «D4:D10».
Думаю, вам нужно проверить, содержит ли Range("D4:D10") только целые числа.
спасибо, а что-нибудь вокруг этого есть? поскольку эти цифры часто могут выглядеть как -1,4333
Конечно, я просто имел в виду целые числа, а это неверно. Изменен код: Sub ProcessSeries (i As Integer, j As Double)
Спасибо, не могли бы вы рассказать мне, как это на самом деле работает? Я новичок в VBA, и по логике вещей это похоже на то, что каждой серии и ячейке присваивается идентификатор и каждый раз используется для расчета?
Я положил некоторые пояснения.
вы помещаете все это в модуль листа 2? или саб в основном модуле?
Worksheet_Calculate
должен находиться в его модуле, ProcessSeries
может находиться в любом модуле (лучше вместе с Worksheet_Calculate или в модуле проекта), при необходимости можно добавить модификатор доступа Public.
Спасибо! один вопрос: я пытаюсь запустить worksheet_calculate на отдельном листе (чтобы заставить его происходить только тогда, когда этот список значений обновляется с помощью формулы). Private Sub Worksheet_Calculate() Worksheets("Sheet1").ChartObjects(" Chart").Activate With Sheets("Sheet1") Set rng = .Range("D4:D10") End With For i = от 1 до 7 ProcessSeries i, rng.Cells(i).Value Next End Sub это говорит "By Несоответствие типа аргумента ссылки».. есть идеи?