录制的数据标签宏不起作用

时间:2014-09-18 15:21:30

标签: excel vba excel-vba charts

所以,我是一个使用VBA但不是那么新的新手,我知道不会尽可能使用.select和喜欢但我仍然会记录宏来找出如何调用某些对象。我正在处理一大段代码,在最后操作图表之前做了各种各样的事情,它没有工作,所以把它分解成一个新的电子表格我发现我操作图表标签的一些行给了我一个错误。我录制了一个宏来确保我没有错误输入任何内容,但无法修复它,然后尝试运行录制的宏,但无法使其工作。

以下是我的代码的目标: 1.将数据标签应用于系列中的一个点。 2.删除我刚申请的标签

(在最终的代码中将有"如果"功能等)

这是宏代码,直接来自录音机:

ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.SeriesCollection(2).Select
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.SeriesCollection(2).Points(1).Select
ActiveChart.SeriesCollection(2).Points(1).ApplyDataLabels
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.SeriesCollection(2).Points(1).DataLabel.Select
Selection.ShowValue = 0
Selection.ShowCategoryName = -1 
' this line ^ gives error 438, object does not support this property or method
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.SeriesCollection(2).Points(1).DataLabel.Select
Selection.Delete

还有一点非常奇怪的是,有时而不是Selection.ShowValue = 0它会使用Selection.ShowValue = False

任何人都知道为什么录制的代码如此跳跃?此外,如果有人可以建议更简单的代码来操作非常有用的数据标签。 我在Windows 7上使用excel 07。

1 个答案:

答案 0 :(得分:0)

VBA中的图表对我来说一直是一个痛苦的后方。话虽这么说,这里有一些代码将一些更常见的对象抛入变量中(因此你可以在一行中打破代码,看看"本地人&#34中发生了什么? ;窗口)。这将迭代图表上的所有点,并添加一个包含" Value"的数据标签。

Sub test()
    Dim myChart As ChartObject 'A "ChartObject" contains a Chart, in which the "SeriesCollection" resides
    Dim chartSeries As Series 'Multiple "Series" can be found in a "SeriesCollection"
    Dim scPoint As Point

    Set myChart = ActiveSheet.ChartObjects("Chart 1")
    Set chartSeries = myChart.Chart.SeriesCollection(1) 'Get the first "Series" in the "SeriesCollection" for this chart

    'loop through the points in this Series. As it loops the point will be available in the "scPoint" variable. 
    For Each scPoint In chartSeries.Points
        With scPoint.DataLabel 'Finally the "DataLabel" is part of the "Point"
            .ShowValue = True 'Just show the value. There are other options here, just create a new line and start typing with a period to see what other options are available for a "DataLabel"
        End With
    Next scPoint

    'Instead of iterating, if you just want to address a single point's datalabel then:
    chartSeries.Points(2).DataLabel.ShowValue
End Sub