如果它在另一个系列上,则标记折线图系列

时间:2013-07-03 18:30:54

标签: excel vba excel-vba excel-formula

我有2张纸,每张约10-20张图。每个图形具有相同的格式,具有相同的系列名称。一个系列称为“预测花费”,另一个系列称为“花费应该是”。当预测支出线超过消费支出线时,我需要标记图表。我想在给定的点上做一个红点。

我尝试通过制作其他数据表并操纵值来尝试使用一系列有条件的技巧,但没有成功。

VBA可能就是解决方案。我从来没有在图表上使用VBA,所以我不知道如何处理。我一直在做研究,但由于我对图表的经验不足,我不知道如何根据我的需要修改代码。

我认为比较2系列的阵列将是答案。然后,这将为每个图表循环,然后为每张图表循环。

我发现这段代码似乎对我有用,但我不明白所引用的是什么。我猜这是假设htere只是一个系列中的一个图表:

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

请解释您的答案,以便我能理解并重复。

提前感谢您的时间!

1 个答案:

答案 0 :(得分:1)

这似乎对我很好。

Sub tester()
    Dim co As ChartObject
    For Each co In ActiveSheet.ChartObjects
        CheckChart co.Chart
    Next co

End Sub

Sub CheckChart(cht As Chart)

    Dim s As Series, sForecast As Series, sShould As Series
    Dim i As Long

    'see if we can find the required series on this chart
    For Each s In cht.SeriesCollection
        Debug.Print s.Name
        If s.Name = "forecast spendings" Then Set sForecast = s
        If s.Name = "spendings should-be" Then Set sShould = s
    Next s

    'series located?
    If sShould Is Nothing Or sForecast Is Nothing Then
        MsgBox "required series not found!"
    Else
        'found the series, so compare the point values
        'assumes same # of points in both lines
        '   and same start/end
        For i = 1 To sShould.Points.Count
            If sForecast.Values(i) > sShould.Values(i) Then
                'label point
                With sForecast.Points(i)
                    .HasDataLabel = True
                    .DataLabel.Position = xlLabelPositionAbove
                    .DataLabel.Text = "!!!"
                    .DataLabel.Characters.Font.Color = vbRed
                End With

            End If
       Next i
    End If

End Sub