我创建了以下子程序作为整个 VBA 代码集的一部分。它过去工作时没有错误,并且给了我我正在寻找的东西。然后在某个时候它仍然有效,但最终的格式将被关闭。我需要手动翻转数据源,并且不会执行条形的格式化(即条形周围的黑色修剪)。最后,图表的代码现在抛出错误。
我不明白的是为什么会发生这种变化,因为子中的代码没有改变。
为了进行错误检查,我做了以下操作。
子代码:
Sub AddSleepFrequencyChart()
Dim ws As Worksheet
Dim rng As Range
Dim CounterX As Long
Set ws = ThisWorkbook.Worksheets("Sleep Chart")
ws.Shapes.AddChart2(201, xlColumnClustered).Select
With ActiveChart
.Parent.Top = 551
.Parent.Left = 876
.SetSourceData Source:=Range("'Sleep Chart'!$DC$10:$DD$33")
'**********************************************************************
'The following line SOMETIMES throws an error
'**********************************************************************
.ChartTitle.Text = "Sleep Duration Frequency"
.ChartTitle.Format.TextFrame2.TextRange.Characters.Text = "Sleep Duration Frequency"
End With
With ActiveChart.ChartTitle.Format.TextFrame2.TextRange.Characters(1, 24).ParagraphFormat
.TextDirection = msoTextDirectionLeftToRight
.Alignment = msoAlignCenter
End With
With ActiveChart.ChartTitle.Format.TextFrame2.TextRange.Characters(1, 24).Font
.BaselineOffset = 0
.Bold = msoFalse
.NameComplexScript = "+mn-cs"
.NameFarEast = "+mn-ea"
.Fill.Visible = msoTrue
.Fill.ForeColor.RGB = RGB(89, 89, 89)
.Fill.Transparency = 0
.Fill.Solid
.Size = 14
.Italic = msoFalse
.Kerning = 12
.Name = "+mn-lt"
.UnderlineStyle = msoNoUnderline
.Spacing = 0
.Strike = msoNoStrike
End With
ActiveChart.ChartGroups(1).GapWidth = 0
ActiveChart.ChartGroups(1).Overlap = 0
With ActiveChart.PlotArea.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorAccent1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
End With
With ActiveChart.PlotArea.Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
End With
With ActiveChart.Axes(xlCategory).Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
End With
With ActiveChart.FullSeriesCollection(1).Format.Line
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorText1
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
End With
End Sub
对于错误测试的第1步,我将数据天数减少到4月8日,最后一次测试它没有问题。我试图了解向图表上方的表格添加额外行与图表本身有什么关系。我唯一能想到的是表格越来越接近图表的默认位置。我觉得奇怪的另一个原因是图表基于屏幕截图中突出显示的列,并且只有在所有其余文本、公式、格式都应用到新工作表上之后才调用图表子。突出显示的单元格是静态的且大小恒定。我完全不确定为什么上表中的额外行会产生影响。
对于错误检查步骤 2,我运行了整个程序并让它在打开计算、更新等之前崩溃。我删除了图表,然后逐步完成上面的子部分以插入图表。然后,我再次运行整个程序,并将黄色箭头立即向下拖动到最后的步骤,其中自动计算和更新等重新打开。我在这两种情况下都遇到了错误。
对于错误检查步骤 3,这是为了重新定位图表而修改的一小部分代码。
ActiveChart.SetSourceData Source:=Range("'Sleep Chart'!$DC$10:$DD$33")
'**********************************************************************
'The following line SOMETIMES throws an error
'**********************************************************************
ActiveChart.ChartTitle.Text = "Sleep Duration Frequency"
ActiveChart.ChartTitle.Format.TextFrame2.TextRange.Characters.Text = "Sleep Duration Frequency"
整个计划的作用是以防万一它很重要。
在“睡眠日记”表上,我有四列记录日期、时间、操作和类型。有一个标题行,数据从第 2 行开始,一直延续到数据底部,并在底部添加新条目。虽然我当前的列表恰好是按时间顺序排列的,但我试图编写整个程序,就好像它不是按时间顺序排列的一样。我认为我还没有达到那部分。
A B C D
date Time action Sleep Type
2024/04/03 02:11 Laid Down CPAP
2024/04/03 02:45 Fell Asleep CPAP
2024/04/03 03:10 Woke Up CPAP
2024/04/03 03:25 Laid Down CPAP
2024/04/03 04:02 Laid Down CPAP
2024/04/03 05:25 Laid Down CPAP
2024/04/03 05:30 Fell Asleep CPAP
2024/04/03 12:25 Woke up CPAP
2024/04/04 02:05 Laid Down CPAP
2024/04/04 02:15 Fell Asleep CPAP
2024/04/04 08:05 Woke Up CPAP
2024/04/04 15:30 Laid Down CPAP
2024/04/04 15:35 Fell Asleep CPAP
2024/04/04 17:15 Woke Up CPAP
2024/04/04 17:15 Laid Down CPAP
2024/04/04 17:17 Fell Asleep CPAP
2024/04/04 17:45 Woke Up CPAP
2024/04/04 17:45 Laid Down CPAP
2024/04/04 17:47 Fell Asleep CPAP
2024/04/04 18:15 Woke Up CPAP
为什么我的子程序向我抛出错误?我该怎么做才能纠正它?
我正在运行 Excel 2013。请温柔一点,因为我完全是自学 VBA。如果需要更多信息,请告诉我,我尽力做到彻底,而不是复制和粘贴所有内容。
此代码仅在工作表
Sleep Chart
是活动工作表时才有效。否则 ws.Shapes.AddChart2(201, xlColumnClustered).Select
将选择图表形状,但不会使其成为 ActiveChart
。
这么短的解决方法:
...
...
Set ws = ThisWorkbook.Worksheets("Sleep Chart")
ws.Activate
ws.Shapes.AddChart2(201, xlColumnClustered).Select
With ActiveChart
...
End With
...
...
但一般来说,应该避免使用
.Select
并使用对象来代替。
例如:
...
Dim thisChart As Chart
...
Set ws = ThisWorkbook.Worksheets("Sleep Chart")
Set thisChart = ws.Shapes.AddChart2(201, xlColumnClustered).Chart
With thisChart
...
End With
...
然后始终使用
thisChart
而不是 ActiveChart
。
顺便说一句:
Shapes.AddChart
每次被调用时总是会广告一个新的图表。因此,调用 10 次后,您的工作表中将有 10 个图表。这就是想要的吗?但这是另一个问题了。