图表子不再工作,现在在不更改代码的情况下崩溃

问题描述 投票:0回答:1

我创建了以下子程序作为整个 VBA 代码集的一部分。它过去工作时没有错误,并且给了我我正在寻找的东西。然后在某个时候它仍然有效,但最终的格式将被关闭。我需要手动翻转数据源,并且不会执行条形的格式化(即条形周围的黑色修剪)。最后,图表的代码现在抛出错误。

我不明白的是为什么会发生这种变化,因为子中的代码没有改变。

为了进行错误检查,我做了以下操作。

  1. 将提供的数据减少到一切按预期运行的程度
  2. 在关闭和打开自动计算、屏幕更新等的情况下运行子程序
  3. 将图表位置从默认位置更改为大约 CW35 的指定位置

子代码:

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

总体方案

  1. 设置选项显式
  2. 关闭自动计算、屏幕更新、状态栏显示和启用事件
  3. 确定数据的第一个和最后一个日期
  4. 删除工作表“睡眠图表”(如果存在)
  5. 创建工作表“睡眠图表”
  6. 调整图表上方表格的大小和格式,提供所有标题文本、单元格大小和边框,并在表格内提供条件格式。
  7. 在表格右侧提供所有标题和公式。
  8. 通过子程序将所有红条填充到表格中。
  9. 用 c 或 s 填写表格内的单元格,以指示与通过子项在睡眠日记中的条目相对应的 15 分钟时间
  10. 通过子设置打印区域
  11. 添加条形图并设置其格式。 (当它不崩溃时)
  12. 打开自动计算、屏幕更新、状态栏显示和启用事件

问题

为什么我的子程序向我抛出错误?我该怎么做才能纠正它?

我正在运行 Excel 2013。请温柔一点,因为我完全是自学 VBA。如果需要更多信息,请告诉我,我尽力做到彻底,而不是复制和粘贴所有内容。

excel vba charts
1个回答
0
投票

此代码仅在工作表

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 个图表。这就是想要的吗?但这是另一个问题了。

© www.soinside.com 2019 - 2024. All rights reserved.