【问题标题】:Application.ScreenUpdating stops macro execution in VBAApplication.ScreenUpdating 停止 VBA 中的宏执行
【发布时间】:2012-10-24 17:31:32
【问题描述】:

我不是经验丰富的 VBA 程序员,我需要社区来发现 Excel 的问题。

我的问题是,在 Excel 中,代码在以下行之后立即停止执行: Application.ScreenUpdating = True

我使用以下来自 msdn 网站的示例代码:

Dim elapsedTime(2) 
Application.ScreenUpdating = True 
For i = 1 To 2 
    If i = 2 Then Application.ScreenUpdating = False 
    startTime = Time 
    Worksheets("Sheet1").Activate 
    For Each c In ActiveSheet.Columns 
        If c.Column Mod 2 = 0 Then 
            c.Hidden = True 
        End If 
    Next c 
    stopTime = Time 
    elapsedTime(i) = (stopTime - startTime) * 24 * 60 * 60 
Next i 
Application.ScreenUpdating = True 
MsgBox "Elapsed time, screen updating on: " & elapsedTime(1) & _ 
     " sec." & Chr(13) & _ 
     "Elapsed time, screen updating off: " & elapsedTime(2) & _ 
     " sec."

来源:http://msdn.microsoft.com/en-us/library/office/ff193498.aspx

但是,Msgbox 永远不会被执行,VBA 也不会显示任何错误 - 它只是默默地失败。

知道为什么会发生这种情况以及如何解决吗?

【问题讨论】:

  • 对我来说没问题:您是否将代码添加到模块中的 Sub 中?
  • 您在哪个事件中编写了这段代码?我建议使用按钮单击事件调用宏来隔离错误源
  • 刚刚将代码粘贴到一个模块中并且运行良好。为什么这个问题被赞成了??
  • 另外,您是否单步执行代码以确定执行失败的确切原因?
  • 您好,我确实单步执行了代码,并且它完全停止在 Screenupdating = True 的行上。但是,我找到了错误的根源——验证自动规则的功能失败。修复它,然后代码开始正常工作。

标签: vba excel excel-2010


【解决方案1】:

这不是答案;像以前的海报一样,我无法让这个例程失败。

首先,我要说这是一段可怕的代码。我不明白为什么微软发布了这么糟糕的东西。例如:

  • elapsedTime 未键入。 (应该是Dim elapsedTime(2) As Double
  • i、startTime 和 stopTime 未定义。
  • Activate 在第一个循环的定时块内,因此,如果 Sheet1 在开始时不是活动工作表,则激活它的时间将添加到第一个循环的持续时间中。
  • 两个循环之间的列未隐藏,因此第二个循环无关。如果您再次运行该例程,则两个循环的持续时间相同。

Excel 中有一个错误,我很少遇到,而且几年都没有。当我遇到它时,我花了很长时间才发现我落后于计划的原因,并且忘记记录下一次的细节。某些错误 Excel 不会停止并报告故障;相反,它终止当前函数并继续调用例程中的下一条语句。这个子程序是直接调用的,所以没说完就停下来。

我唯一的建议是您计算机上 Sheet1 上的此代码存在某些问题,导致此错误。

您似乎认为Application.ScreenUpdating = True 语句失败。这是可能的,但不太可能。根据您的描述,您只知道例程没有到达MsgBox 语句。

我怀疑c.Hidden = True。我看到一个问题询问隐藏列的最大数量,但没有人知道最大数量。一个答案是您无法隐藏合并区域的一部分,但我无法复制该错误。看看您的 Sheet1:是否隐藏了一些偶数列但不是全部?取消隐藏列并重试。例程是否在一致的列上失败?隐藏 1,024 列后它会失败吗?

祝您调查顺利。但是,我建议您放弃这个致命的代码并接受Application.ScreenUpdating = False 将减少任何更新活动工作表的例程的运行时间。

【讨论】:

  • 如您所想,Sheet1 上的代码有问题。更多信息如下。
  • @oleg。很高兴您找到了原因。
【解决方案2】:

在这种情况下,出现以下问题,乍一看并没有立即发现:

  • Sheet 中有自动验证规则
  • 自动验证规则基于用户空间函数,即匹配的代码规则为公式:=NOT(IsValidCell(INDIRECT("RC";FALSE)))
  • 此功能有问题。

baqd 代码示例:

Function IsValidCell(ByVal CellValue As String) As Boolean
IsValidCell = False
If CellValue Like "#####" Then
    IsValidColumn = True ' Notice bug
Else ' Notice second bug
End Function

结果是当 excel 尝试重新计算规则时,完全不分离的例程中的代码会失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2018-08-10
    • 2017-04-21
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多