Excel VBA图表,仅在最后一点上显示数据标签

Excel VBA图表,仅在最后一点上显示数据标签,excel,vba,label,Excel,Vba,Label,我只想在我的折线图上的最后一个点上添加数据标签,目前我正在使用下面的,这很好,但前提是我知道最后一个点是什么数字。 我做了很多搜索,在excel帮助中找到了points(points.count)对象,但我似乎无法让它对我起作用。 请你建议一种只在我的图表上显示最后一点的方式,或者(理想情况下)在工作表上显示所有图表的方式 Sub Data_Labels() ' ' Data_Labels Macro ActiveSheet.ChartObjects("Menck Chart").Ac

我只想在我的折线图上的最后一个点上添加数据标签,目前我正在使用下面的,这很好,但前提是我知道最后一个点是什么数字。 我做了很多搜索,在excel帮助中找到了points(points.count)对象,但我似乎无法让它对我起作用。 请你建议一种只在我的图表上显示最后一点的方式,或者(理想情况下)在工作表上显示所有图表的方式

Sub Data_Labels()
'
' Data_Labels Macro

    ActiveSheet.ChartObjects("Menck Chart").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Select
    Selection.Delete
    ActiveSheet.ChartObjects("Menck Chart").Activate
    ActiveChart.SeriesCollection(1).Select
    ActiveChart.SeriesCollection(1).Points(59).Select
    ActiveChart.SeriesCollection(1).Points(59).ApplyDataLabels
    ActiveChart.SeriesCollection(1).DataLabels.Select
    Selection.Format.TextFrame2.TextRange.Font.Size = 9


End Sub

试试这个。首先,它将数据标签应用于所有点,然后从每个点(最后一个点除外)删除数据标签

我使用
Points.Count-1
这样,For/Next循环在最后一个点之前停止

Sub Data_Labels()
'
Data_Labels Macro
Dim ws As Worksheet
Dim cht as Chart
Dim srs as Series
Dim pt as Point
Dim p as Integer
Set ws = ActiveSheet
Set cht = ws.ChartObjects("Menck Chart")
Set srs = cht.SeriesCollection(1)
    '## Turn on the data labels
    srs.ApplyDataLabels
    '## Iterate the points in this series
    For p = 1 to srs.Points.Count - 1 
        Set pt = srs.Points(p)
        '## remove the datalabel for this point
        p.Datalabel.Text = ""
    Next
    '## Format the last datalabel to font.size = 9
    srs.Points(srs.Points.Count).DataLabel.Format.TextFrame2.TextRange.Font.Size = 9


End Sub

试试这个。首先,它将数据标签应用于所有点,然后从每个点(最后一个点除外)删除数据标签

我使用
Points.Count-1
这样,For/Next循环在最后一个点之前停止

Sub Data_Labels()
'
Data_Labels Macro
Dim ws As Worksheet
Dim cht as Chart
Dim srs as Series
Dim pt as Point
Dim p as Integer
Set ws = ActiveSheet
Set cht = ws.ChartObjects("Menck Chart")
Set srs = cht.SeriesCollection(1)
    '## Turn on the data labels
    srs.ApplyDataLabels
    '## Iterate the points in this series
    For p = 1 to srs.Points.Count - 1 
        Set pt = srs.Points(p)
        '## remove the datalabel for this point
        p.Datalabel.Text = ""
    Next
    '## Format the last datalabel to font.size = 9
    srs.Points(srs.Points.Count).DataLabel.Format.TextFrame2.TextRange.Font.Size = 9


End Sub

简短回答

 Dim NumPoints as Long
 NumPoints = ActiveChart.SeriesCollection(1).Count
 ActiveChart.SeriesCollection(1).Points(NumPoints).ApplyDataLabels
长答案

 Dim NumPoints as Long
 NumPoints = ActiveChart.SeriesCollection(1).Count
 ActiveChart.SeriesCollection(1).Points(NumPoints).ApplyDataLabels
ActiveChart
的使用很模糊,需要额外的步骤来选择感兴趣的图表。如果明确指定感兴趣的图表,宏将更加健壮,更易于阅读。我还建议对块使用
,或者创建中间变量,因为反复阅读
ActiveChart.SeriesCollection(1).Points
会让人痛苦,并且会弄乱代码。请按如下方式尝试后一种方法:

 Dim chartMenck As Chart, menckPoints as Points, menckDataLabel as DataLabel
 Set chartMenck = Sheet1.ChartObjects("Menck Chart").Chart 
 Set menckPoints  = chartMenck SeriesCollection(1).Points
 menckPoints(menckPoints.Count).ApplyDataLabels
 Set menckDataLabel = menckPoints(menckPoints.Count).DataLabel
 menckDataLabel.Font.Size = 9

在我看来,这几乎是原文长度的一半,而且更容易阅读。

简短回答

 Dim NumPoints as Long
 NumPoints = ActiveChart.SeriesCollection(1).Count
 ActiveChart.SeriesCollection(1).Points(NumPoints).ApplyDataLabels
长答案

 Dim NumPoints as Long
 NumPoints = ActiveChart.SeriesCollection(1).Count
 ActiveChart.SeriesCollection(1).Points(NumPoints).ApplyDataLabels
ActiveChart
的使用很模糊,需要额外的步骤来选择感兴趣的图表。如果明确指定感兴趣的图表,宏将更加健壮,更易于阅读。我还建议对
块使用
,或者创建中间变量,因为反复阅读
ActiveChart.SeriesCollection(1).Points
会让人痛苦,并且会弄乱代码。请按如下方式尝试后一种方法:

 Dim chartMenck As Chart, menckPoints as Points, menckDataLabel as DataLabel
 Set chartMenck = Sheet1.ChartObjects("Menck Chart").Chart 
 Set menckPoints  = chartMenck SeriesCollection(1).Points
 menckPoints(menckPoints.Count).ApplyDataLabels
 Set menckDataLabel = menckPoints(menckPoints.Count).DataLabel
 menckDataLabel.Font.Size = 9
在我看来,这几乎是原版的一半,而且更容易阅读。

VBA中的另一种方式(例如,在个人工作簿中粘贴为新的热键宏):

对于不耐烦,ShowValue:=True:

Option Explicit

Sub LastPointLabel()
  Dim mySrs As Series
  Dim iPts As Long
  Dim bLabeled As Boolean
  If ActiveChart Is Nothing Then
    MsgBox "Select a chart and try again.", vbExclamation, "No Chart Selected"
  Else
    For Each mySrs In ActiveChart.SeriesCollection
      bLabeled = False
      With mySrs
        For iPts = .Points.count To 1 Step -1
          If bLabeled Then
            ' handle error if point isn't plotted
            On Error Resume Next
            ' remove existing label if it's not the last point
            mySrs.Points(iPts).HasDataLabel = False
            On Error GoTo 0
          Else
            ' handle error if point isn't plotted
            On Error Resume Next
            ' add label
            mySrs.Points(iPts).ApplyDataLabels _
                ShowSeriesName:=True, _
                ShowCategoryName:=False, _
                ShowValue:=True, _
                AutoText:=True, LegendKey:=False
            bLabeled = (Err.Number = 0)
            On Error GoTo 0
          End If
        Next
      End With
    Next
  End If
End Sub
VBA中的另一种方式(例如,在个人工作簿中粘贴为新的热键宏):

对于不耐烦,ShowValue:=True:

Option Explicit

Sub LastPointLabel()
  Dim mySrs As Series
  Dim iPts As Long
  Dim bLabeled As Boolean
  If ActiveChart Is Nothing Then
    MsgBox "Select a chart and try again.", vbExclamation, "No Chart Selected"
  Else
    For Each mySrs In ActiveChart.SeriesCollection
      bLabeled = False
      With mySrs
        For iPts = .Points.count To 1 Step -1
          If bLabeled Then
            ' handle error if point isn't plotted
            On Error Resume Next
            ' remove existing label if it's not the last point
            mySrs.Points(iPts).HasDataLabel = False
            On Error GoTo 0
          Else
            ' handle error if point isn't plotted
            On Error Resume Next
            ' add label
            mySrs.Points(iPts).ApplyDataLabels _
                ShowSeriesName:=True, _
                ShowCategoryName:=False, _
                ShowValue:=True, _
                AutoText:=True, LegendKey:=False
            bLabeled = (Err.Number = 0)
            On Error GoTo 0
          End If
        Next
      End With
    Next
  End If
End Sub

你有没有试过对每一句话都用一个For?你有没有试过对每一句话用一个For?