【问题标题】:Trying to empty cells to plot gaps in chart试图清空单元格以绘制图表中的空白
【发布时间】:2015-11-13 22:05:54
【问题描述】:

我有一系列数据,从单元格 C169:N174 运行,获取折线图。单元格数据可以是数字,也可以是空的(Excel 为空) - 公式返回数字或空白文本 ("")。

当通过数据验证触发操作时,我需要将最右侧单元格 (N169:N174) 中的公式从左侧复制到 C169:C174)。为此,我有以下代码:

Range("N169:N174").AutoFill Destination:=Range("C169:N174")
Range("C169:N174").Select

复制公式后,我需要清除任何包含文本 ("") 的单元格。为此,我有以下代码:

Range("C169:M174").SpecialCells(xlCellTypeFormulas, 2).Select
Selection.ClearContents

此代码针对两组数据运行。相同的代码,不同的单元格。范围是 C169:N174 和 C145:N150。我首先为 range1 (C145:N15) 编写了代码 - 复制公式然后删除带有 ("") 的单元格。然后对 range2 (C169:N174) 执行相同的操作。完整代码:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False

If Target.Address = "$B$2" Then

'mcroCopyTrendedRentFormulas
    Range("N145:N150").AutoFill Destination:=Range("C145:N150"), Type:=xlFillDefault
    Range("C145:N150").Select

    'mcroClearTrendedRentEmptyCells
    Range("C145:N150").SpecialCells(xlCellTypeFormulas, 2).Select
    Selection.ClearContents

    'mcroCopyAskingRentFormulas
    Range("N169:N174").AutoFill Destination:=Range("C169:M174")
    Range("C169:N174").Select

    'mcroClearAskingRentEmptyCells
    Range("C169:M174").SpecialCells(xlCellTypeFormulas, 2).Select
    Selection.ClearContents

    Range("A1").Select

End If

End Sub

一旦代码被触发,如果我在它完成运行之前单击工作表上的任意位置(我刚刚计时并且花了 45 秒),我会收到一条错误消息:

“1004 错误:未找到单元格”

“1004 错误:Range 类的 AutoFill 方法失败”。

如果我让代码运行整个 45 秒,它就可以工作。如果我单击工作表中的任意位置并收到任一错误,请停止调试器并尝试再次运行它,我会收到两个错误之一。

所以也许加快执行速度是问题所在?

我不知道 - 这里对任何事情都开放。

【问题讨论】:

  • 剩下的我会继续看,但真的很急,你应该在Worksheet_Change 的末尾打开 ScreenUpdating,或者将它移到 If 语句中。正如您现在拥有的那样,只要工作表发生更改,它就会关闭,并且永远不会重新打开。 (PS:很好地问了第一个问题!)
  • 代码运行时为什么要click anywhere?为什么不让它运行呢?
  • 尝试在代码开头将Application.EnableEvents 设置为False,然后在最后将其设置为True

标签: vba excel


【解决方案1】:

我稍微编辑了代码,主要是删除了多余的.Select 行(好吧,将它们注释掉)并结合了.Select.ClearContents。这应该运行得更快一些。注意ScreenUpdatingCalculation的使用。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$2" Then
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

    'mcroCopyTrendedRentFormulas
    Range("N145:N150").AutoFill Destination:=Range("C145:N150"), Type:=xlFillDefault
    'Range("C145:N150").Select

    'mcroClearTrendedRentEmptyCells
    Range("C145:N150").SpecialCells(xlCellTypeFormulas).ClearContents

    'mcroCopyAskingRentFormulas
    Range("N169:N174").AutoFill Destination:=Range("C169:M174")
    'Range("C169:N174").Select

    'mcroClearAskingRentEmptyCells
    Range("C169:M174").SpecialCells(xlCellTypeFormulas).ClearContents

    Range("A1").Select

End If
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub

我还从您的 SpecialCells() 中删除了 2,因为我认为这不是必需的,并且在我删除它之前也对我抛出了错误。

当它运行时,让它运行而不点击。实际上,当任何宏在 Excel 中运行时,最好让它静置并运行。

【讨论】:

  • 好东西 - 非常感谢。不知道为什么(可能是 .select 更改),但在此之后代码执行得更快。几秒钟比半分钟加更早。
  • 以及为什么点击 - 是运行时间的函数。当它在几秒钟内运行时,无需单击。但是当它说话 30-45 秒时,情况就不同了。
  • Avoiding .Select 是 VBA 的最佳实践,它确实减慢了速度,也为 VB 留出了空间来完成您想要的工作。此外,ScreenUpdatingCalculationEnableEvents 也应该加快速度。另外,当需要一些时间运行时,是否需要在 Excel 中单击?您可以在其他程序中工作,但是当您在运行宏时打扰它(即单击)时,Excel 往往不喜欢它。
  • 有趣 - 很高兴了解 .select。考虑到合并成一行的能力,这似乎没有必要。非常感谢您的帮助 - smf
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多