【问题标题】:Excel VBA only show labels for each series' max valueExcel VBA 仅显示每个系列最大​​值的标签
【发布时间】:2013-05-19 22:17:06
【问题描述】:

我正在尝试创建一个在图表中循环遍历系列的宏,并且仅根据最大/最小值显示最大/最小标签。

有些系列只有负值,在这些情况下,我希望只显示最小数据点标签,反之亦然,适用于具有 0 或更大值的系列。

我目前的代码是:

Sheets("Curve").ChartObjects("Chart 14").Activate
For Each serie In ActiveChart.SeriesCollection
        Dim pointCount As Integer
        Dim pointValues As Variant
        pointCount = serie.Points.Count
        pointValues = serie.Values
        For pointIndex = 1 To pointCount
          If pointValues(pointIndex) < 1000 Then
            serie.Points(pointIndex).HasDataLabel = True
          End If
        Next pointIndex
      Next serie
End Sub

当我手动输入阈值时效果很好,但我想用 Max(series) 值替换“1000”,以便图表中的每个系列只有一个可见的标签。

【问题讨论】:

  • 一种方法是执行 For..Next 循环两次,一次计算 PointValue 数组中的最大点值,一次设置标签,如果该点等于最大点值。跨度>

标签: vba excel charts


【解决方案1】:

我有另一种方法,它不需要 VBA。它添加了一个额外的系列,最大处有一个不可见的数据点,这个点有一个数据标签。如果数据发生变化并且不同的点为最大值,它也会动态变化,而无需重新运行 VBA 过程。

对于图表中的每个系列,您需要使用与系列的 Y 值大小相同的范围。

假设给定系列的原始 Y 值在 D2:D10 中,我们将使用 G2:G10 作为额外数据。在 G2 中输入 =IF($D2=MAX($D$2:$D$10),$D2,NA()) 并将其填写到 G10。修改此公式,以应对如果一切都为负数,您可能会寻找最小值的情况。

复制 G2:G10 并按住 CTRL,同时选择该系列的 X 值。复制。选择图表,使用选择性粘贴,然后在列中选择将数据添加为新系列,在第一列中选​​择类别。

选择添加的系列,即一个点(除非最大有两个点),格式为无线无标记。将您的数据标签添加到此系列。

对图表中的其他系列重复。

【讨论】:

    【解决方案2】:

    以下修改后的例程包括 MaxPoint、MaxPointIndex、MinPoint 和 MinPointIndex 变量,这些变量在 For 循环中对每个系列的点进行计算。如果序列只有正值,则设置最大值点的标签,否则设置最小值。

      Option Explicit
    
      Sub chart()
      Dim serie As Variant
      Dim Pointindex As Long
      Dim MaxPoint As Long
      Dim MaxPointIndex As Long
      Dim MinPoint As Long
      Dim MinPointIndex As Long
      Sheets("Curve").ChartObjects("Chart 14").Activate
      For Each serie In ActiveChart.SeriesCollection
          Dim pointCount As Integer
          Dim pointValues As Variant
          pointCount = serie.Points.Count
          pointValues = serie.Values
          MinPoint = 10000              'set to value greater than any point in any serie
          MaxPoint = 0
          For Pointindex = 1 To pointCount
              If pointValues(Pointindex) > MaxPoint Then
                  MaxPoint = pointValues(Pointindex)
                  MaxPointIndex = Pointindex
              ElseIf pointValues(Pointindex) < MinPoint Then
                  MinPoint = pointValues(Pointindex)
                  MinPointIndex = Pointindex
              End If
          Next Pointindex
          If MinPoint >= 0 Then
              serie.Points(MaxPointIndex).HasDataLabel = True
          Else
              serie.Points(MinPointIndex).HasDataLabel = True
          End If
      Next serie
      End Sub
    

    【讨论】:

    • 谢谢你,但我似乎无法将数据标签应用到我的图表:我在“serie.Points(MaxPointIndex).HasDataLabel = True”处收到一条错误消息,说运行时错误1004,无效参数。
    • 嗯,我没有收到错误消息。很难从远处调试这种东西。如果您对它感到满意,您可以将您的文件上传到 www.wikisend.com 并在此处分享链接吗?无论如何,您使用的是什么版本的 Excel,它是什么样式的图表? (另外,我稍微修改了代码,如果系列有负值标签,则放置最小值标签,否则放置最大值标签。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多