Excel VBA只显示每个系列最大​​值的标签

我试图创build一个macros,它通过图表中的一系列循环,只显示取决于最大/最小值的最大/最小标签。

有些系列只有负值,在这种情况下,我希望只显示最小的数据点标签,反之亦然。

我到目前为止的代码是:

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 

当我手动input阈值时,它可以正常工作,但是我想用Max(系列)值replace“1000”,以便图表中的每个系列只有一个标签可见。

以下修改的例程包括MaxPoint,MaxPointIndex,MinPoint和MinPointIndexvariables,这些variables在每个系列点的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 

我有一个替代方法,不需要VBA。 它增加了一个额外的系列,在最大的不可见的数据点,这一点有一个数据标签。 如果数据发生变化,而且不同的点是最大的,它也会dynamic变化,而不必重新运行VBA程序。

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

假设给定序列的原始Y值在D2:D10中,我们将使用G2:G10作为我们的额外数据。 在G2中input= IF($ D2 = MAX($ D $ 2:$ D $ 10),$ D2,NA())并填充到G10。 修改这个公式的情况下,如果一切都是负面的,你可能会寻找最小值。

复制G2:G10并保持CTLR,同时select本系列的X值。 复制。 select图表,使用select性粘贴,然后select添加数据为新系列,在第一列中的列,类别中。

select添加的系列,这是一个点(除非最多有两个点),格式为没有行和没有标记。 将您的数据标签添加到此系列。

重复图表中的其他系列。