2

我不是经验丰富的 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为什么会发生这种情况以及如何解决?

4

2 回答 2

3

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

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

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

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

我唯一的建议是,您计算机上的 Sheet1 上的此代码有一些东西会导致此错误。

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

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

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

于 2012-10-23T16:06:14.553 回答
1

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

  • 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 尝试重新计算规则时,完全未分离的例程中的代码会失败。

于 2012-10-24T09:31:32.083 回答