我正在为我的办公室编写一个格式化Excel加载项的图表。
为了处理嵌入式图表和图表,我在第一个子程序中编写了两个循环。每次激活图表时,都会调用第二个子例程来处理ActiveChart
格式化。
我的部分目标是将数据标签应用于折线图,但是即使我设置了DataLabel.ShowSeriesName = True
,我的代码也会生成空白数据标签,如图1所示。有两种情况下正确添加标签,如下所述。
Option Explicit
Sub CESAR_style ()
Dim a as application
Dim wb As Workbook
Dim ws As Worksheet
Dim chtO As ChartObject
Dim cht As Chart
Set twb = ThisWorkbook
Set a = Application
' Turn off events
a.EnableEvents = False
' Loop through all chart sheets
For Each cht In a.Charts
cht.Activate
Call Format
Next
' Loop through all chart objects
For Each ws In ActiveWorkbook.Worksheets
For Each chtO In ws.ChartObjects
chtO.Activate
Call Format
Next
Next
a.EnableEvents = True
End Sub
Private Sub Format()
Dim i As Integer
Dim j As Integer
With ActiveChart
' Count the series in the chart
i = .SeriesCollection.Count
' Code here to add a new series used to make a 'Today' _
reference line dividing history and future
' Add series data labels, excluding the new series added above
' For each data series
For j = 1 To i
With .FullSeriesCollection(j)
' For Line charts
If .ChartType = xlLine Then
' Turn off leader lines for full series
.HasLeaderLines = False
' Add series data label to right of last point in series
With .Points(.Points.Count)
' If a label already exists remove it
If .HasDataLabel = True Then
.HasDataLabel = False
Else
End If
此代码正常运行,但当.ApplyDataLabels
运行时,会创建空白数据标签,如图1所示[空白数据标签] 1
' Add a series data label
.ApplyDataLabels ShowSeriesName:=True, _
ShowValue:=False, _
HasLeaderLines:=False
End With
Else
' Code here to handle stacked area charts; working properly
End If
End With
Next
End With
End Sub
我在.ApplyDataLabels
添加了一个断点。如果我用F5或播放按钮继续代码,它会继续给我空白标签。但是,如果我使用F8或Step Into执行代码,代码会成功执行,我会得到我想要的标签,如图2所示。
Correct data labels
第二个令人困惑的质量是当我将.ApplyDataLabels
段移动到CESAR_style子例程时,代码成功运行。
我尝试使用sleep
延迟代码,但没有成功。
在我如何设置这两个子程序时,我是否做错了什么?
非常感谢任何帮助或见解。如果需要其他信息来解决问题,请告诉我。
答案 0 :(得分:0)
一般情况下,对于VBA,我发现如果某些内容在您通过它时有效,而不是在您运行它时,则会出现选择/焦点问题。当您逐步执行代码时,您可能会选择图表所在的工作表,这样您就可以看到代码正在做什么,这有效地为您的宏做了一步。在激活图表之前,尝试激活图表所在的工作表。如果这不起作用,请尝试在工作表上选择一个单元格。