Excel VBA仅显示每个系列的标签';最大值

Excel VBA仅显示每个系列的标签';最大值,vba,excel,charts,Vba,Excel,Charts,我试图创建一个宏,它在图表中循环显示系列,并且仅显示最大/最小标签,具体取决于最大/最小值 有些序列只有负值,在这些情况下,我只希望显示最小数据点标签,反之亦然,对于值为0或更大的序列 到目前为止,我掌握的代码是: Sheets("Curve").ChartObjects("Chart 14").Activate For Each serie In ActiveChart.SeriesCollection Dim pointCount As Integer Dim

我试图创建一个宏,它在图表中循环显示系列,并且仅显示最大/最小标签,具体取决于最大/最小值

有些序列只有负值,在这些情况下,我只希望显示最小数据点标签,反之亦然,对于值为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
图纸(“曲线”)。图表对象(“图表14”)。激活
对于ActiveChart.SeriesCollection中的每个系列
Dim pointCount为整数
作为变量的Dim pointValues
pointCount=serie.Points.Count
pointValues=系列值
对于pointIndex=1到pointCount
如果PointValue(pointIndex)<1000,则
serie.Points(pointIndex).HasDataLabel=True
如果结束
下一点索引
下赛季
端接头

当我手动输入阈值时,它可以正常工作,但我想用最大(系列)值替换“1000”,这样图表中的每个系列只有一个可见标签。

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

  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
选项显式
子图()
作为变体的暗淡系列
暗点索引与长点索引相同
将最大点变长
Dim MaxPointIndex尽可能长
暗点一样长
Dim MinPointIndex尽可能长
图纸(“曲线”)。图表对象(“图表14”)。激活
对于ActiveChart.SeriesCollection中的每个系列
Dim pointCount为整数
作为变量的Dim pointValues
pointCount=serie.Points.Count
pointValues=系列值
MinPoint=10000'设置为大于任何系列中任何点的值
MaxPoint=0
对于Pointindex=1到pointCount
如果PointValue(Pointindex)>MaxPoint,则
MaxPoint=点值(点索引)
MaxPointIndex=点索引
ElseIf PointValue(Pointindex)=0,则
serie.Points(MaxPointIndex).HasDataLabel=True
其他的
serie.Points(MinPointIndex).HasDataLabel=True
如果结束
下赛季
端接头

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

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

假设给定序列的原始Y值在D2:D10中,我们将使用G2:G10作为额外数据。在G2中输入 =如果($D2=最大($D$2:$D$10),$D2,NA()) 把这个填到G10。修改此公式,以便在所有值均为负值时查找最小值

复制G2:G10并按住CTRL键,同时为此系列选择X值。复制选择图表,使用“特殊粘贴”,然后选择“将数据添加为新系列”、“列中”和“第一列中的类别”

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


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

一种方法是执行两次for..Next循环,一次用于计算PointValue数组中的最大点值,一次用于设置点等于最大点值时的标签。谢谢,但我似乎无法将此应用于图表中的数据标签:我在“serie.Points”处收到一条错误消息(MaxPointIndex).HasDataLabel=True“说运行时错误1004,inmvalid参数。嗯,我没有得到错误。从远处调试这类东西很困难。如果您对它感到满意,您可以将您的文件上载到www.wikisend.com并在这里共享链接吗?无论如何,您使用的Excel版本和图表样式是什么?(另外,我稍微修改了代码,如果序列有负值标签,则添加最小值标签,否则添加最大值标签。)