0

我有 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

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

提前感谢您的宝贵时间!

4

1 回答 1

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
于 2013-07-03T20:19:35.633 回答