Application.ScreenUpdating在VBA中停止宏执行

时间:2012-10-23 07:52:22

标签: vba excel-vba excel-2010 excel

我没有经验丰富的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也不会显示任何错误 - 它只是默默地失败。

Anyidea为什么会这样,以及如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

首先,我会说这是一段可怕的代码。我无法理解为什么微软发布了这么糟糕的东西。例如:

  • 未输入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将减少更新活动工作表的任何例程的运行时间。

答案 1 :(得分:1)

在这种情况下,出现了以下问题,乍看之下并未立即找到:

  • 工作表
  • 中有自动验证规则
  • 自动验证规则基于用户空间功能,即匹配的代码规则为公式:=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尝试重新计算规则时,完全未分离的例程中的代码将失败。