在单步执行代码并正常运行时,Excel / VBA的行为有所不同

时间:2016-07-18 23:53:24

标签: excel vba

我有VBA代码,其中包含函数Worksheet_Calculate()Worksheet_Change(ByVal Target As Range),因为我想在进行任何重新计算时以及修改工作表中的某些特定单元格时更新某些单元格。这两个子例程都调用完全相同的子例程。但是,其中一个正常工作(Worksheet_Change)而另一个(Worksheet_Calculate)没有,即使它们都调用完全相同的函数。

我采取的下一步是在任何重新计算发生时我认为出现问题的地方设置断点,令我惊讶的是,Worksheet_Calculate()执行的代码这次正常工作(当踩过时代码使用断点等)。另外,即使在正常模式下(不是在调试中),它也会偶尔正常工作,但这是非常随机的。我不知道造成这种情况的原因。以下是我的潜艇的缩短版本(MakeVisibleUpdateBaselineUpdateDerivative1 ...是我后面定义的所有子程序:

Private Sub Worksheet_Calculate()

    MakeVisible
    UpdateBaseline

    If ([F4] > 0) Then
        UpdateDerivative1
    End If
    If ([F4] > 1) Then
        UpdateDerivative2
     End If
    If ([F4] > 2) Then
       UpdateDerivative3
    End If
    If ([F4] > 3) Then
       UpdateDerivative4
    End If


End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Application.Intersect(Sheets("Main").Range("C7:C61"), Range(Target.Address)) Is Nothing Then

        MakeVisible
        UpdateBaseline

        If ([F4] > 0) Then
            UpdateDerivative1
        End If
        If ([F4] > 1) Then
            UpdateDerivative2
        End If
        If ([F4] > 2) Then
           UpdateDerivative3
        End If
        If ([F4] > 3) Then
            UpdateDerivative4
        End If
    End If
End Sub

在花了一些时间进行调试之后,我认为有一些竞争条件,因为UpdateBaselineUpdateDerivative1等中的代码实际上正在调整大小并移动一些形状对象(如星形,直连接器等),即使我用来定位它们的变量似乎具有正确的值,它们也会移动到错误的位置。我的直觉告诉我,移动形状或改变它们的属性需要一些可能导致一些竞争条件的计算,但这只是一个疯狂的猜测,它可能完全不相关。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情

Dim ignoreEvents As Boolean 

Private Sub Worksheet_Calculate()

    If ignoreEvents = True Then Exit Sub
    ignoreEvents = True

    ' your code here 

    ignoreEvents = False
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    If ignoreEvents = True Then Exit Sub
    ignoreEvents = True

    ' your code here 

    ignoreEvents = False
End Sub

答案 1 :(得分:0)

感谢@Slai,我能够找到问题所在。该错误确实是由于代码对当前活动工作表的依赖性造成的,但是在我为特定单元格指定工作表后(我已将[F4]更改为[Main!F4]以及所有其他工作表)它未被修复因为我确保我的所有代码都特别适用于[Main!<Cell>]Sheets("Main").Range("<Cell>"),所以我仍然无法弄清楚问题是什么,这会对当前活动的工作表产生任何依赖性dissappear。但是,我添加了代码以使当前活动的工作表返回到&#34; Main&#34;当Worksheet_Calculate()被触发时,这会导致正确的行为。我添加的代码是Worksheets("Main").Activate的第一行Worksheet_Calculate()

谢谢!