Vba 运行时错误';438';在一张工作表的每个图表中循环

Vba 运行时错误';438';在一张工作表的每个图表中循环,vba,excel,Vba,Excel,我使用宏遍历工作表的每个图表,以隐藏任何带有#N/a值/标题的数据标签(我在图表中使用两个系列,一个绿色,一个红色,取决于目标) 当我运行这个子对象时,我得到了这样的信息:“运行时错误'438':对象不支持这个属性或方法 发生这种情况的代码行是: 对于l=1到.SeriesCollection(k).Points(j).DataLabels.Count 我一直在研究这个问题的许多其他问题/答案,但当涉及到这种错误时,每个案例似乎都有所不同 是否有人对VBA有更好的理解,可以指出问题所在 S

我使用宏遍历工作表的每个图表,以隐藏任何带有#N/a值/标题的数据标签(我在图表中使用两个系列,一个绿色,一个红色,取决于目标)

当我运行这个子对象时,我得到了这样的信息:“运行时错误'438':对象不支持这个属性或方法

发生这种情况的代码行是:
对于l=1到.SeriesCollection(k).Points(j).DataLabels.Count

我一直在研究这个问题的许多其他问题/答案,但当涉及到这种错误时,每个案例似乎都有所不同

是否有人对VBA有更好的理解,可以指出问题所在

   Sub LoopThroughCharts()
'PURPOSE: Loop through every graph in the a selected worksheet

Dim sht As Worksheet
Dim CurrentSheet As Worksheet
Dim cht As ChartObject

Application.ScreenUpdating = False
Application.EnableEvents = False

Set CurrentSheet = ActiveSheet

With ActiveWorkbook.Worksheets("Graph Annuel")
  For Each cht In .ChartObjects
    cht.Activate
    With ActiveChart
    For k = 1 To .SeriesCollection.Count
        For j = 1 To .SeriesCollection(k).Points.Count
            For l = 1 To .SeriesCollection(k).Points(j).DataLabels.Count
               If .SeriesCollection.Points(j).DataLabels.Item(l).Caption = "#N/A" Then
                   .SeriesCollection.Points(j).DataLabels.Item(l).Delete
                End If
            Next l
        Next j
    Next k
   End With
  Next cht
End With

CurrentSheet.Activate
Application.EnableEvents = True

End Sub

由于
对象没有
数据标签
属性,因此无法迭代
点(j).DataLabels

尝试以下操作(修改为不删除标题,只使用空字符串):

尝试从集合中删除,您将遇到错误,除非您在反向索引中执行此操作(这是可能的,但在这种情况下,当您可以只使用空字符串时,这不是必需的)


还添加了一些逻辑,以确保在数据标签已被删除时不会出错(即,
srs.HasDataLabel
可能为
True
,而对于序列中的单个
,它可能为
False

我不确定,但我打赌是单点对象(例如,
Points(j)
没有
DataLabels
集合。请简单地尝试
.SeriesCollection(j).DataLabels.Count
?我将在明天的工作中首先尝试!谢谢先生:)
Dim cObj As ChartObject, cht As Chart, srs As Series, p As Integer
For Each cObj In ActiveSheet.ChartObjects
    Set cht = cObj.Chart
    With cht
        For Each srs In .SeriesCollection
            If srs.HasDataLabels Then
                For p = 1 To srs.Points.Count
                    If srs.Points(p).HasDataLabel Then
                        If srs.DataLabels.Item(p).Caption = "#N/A" Then
                            srs.DataLabels.Item(p).Caption = ""
                        End If
                    End If
                Next
            End If
        Next
    End With
Next