VBA: как пропустить оператор IF через серию ячеек и диаграмм

На данный момент у меня есть:

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.

Я застрял здесь, так как знаю, как это сделать для половины этого, но не знаю, как зациклиться на чарт-сериях.

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая ваш комментарий, это может быть решением:

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».

Спасибо! один вопрос: я пытаюсь запустить 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 Несоответствие типа аргумента ссылки».. есть идеи?

user26829351 14.08.2024 22:40

Думаю, вам нужно проверить, содержит ли Range("D4:D10") только целые числа.

rotabor 14.08.2024 22:48

спасибо, а что-нибудь вокруг этого есть? поскольку эти цифры часто могут выглядеть как -1,4333

user26829351 14.08.2024 23:06

Конечно, я просто имел в виду целые числа, а это неверно. Изменен код: Sub ProcessSeries (i As Integer, j As Double)

rotabor 14.08.2024 23:13

Спасибо, не могли бы вы рассказать мне, как это на самом деле работает? Я новичок в VBA, и по логике вещей это похоже на то, что каждой серии и ячейке присваивается идентификатор и каждый раз используется для расчета?

user26829351 15.08.2024 01:20

Я положил некоторые пояснения.

rotabor 15.08.2024 17:21

вы помещаете все это в модуль листа 2? или саб в основном модуле?

user26829351 16.08.2024 19:17
Worksheet_Calculate должен находиться в его модуле, ProcessSeries может находиться в любом модуле (лучше вместе с Worksheet_Calculate или в модуле проекта), при необходимости можно добавить модификатор доступа Public.
rotabor 16.08.2024 21:44

Другие вопросы по теме