我有VBA代码,其中包含函数Worksheet_Calculate()
和Worksheet_Change(ByVal Target As Range)
,因为我想在进行任何重新计算时以及修改工作表中的某些特定单元格时更新某些单元格。这两个子例程都调用完全相同的子例程。但是,其中一个正常工作(Worksheet_Change)而另一个(Worksheet_Calculate)没有,即使它们都调用完全相同的函数。
我采取的下一步是在任何重新计算发生时我认为出现问题的地方设置断点,令我惊讶的是,Worksheet_Calculate()
执行的代码这次正常工作(当踩过时代码使用断点等)。另外,即使在正常模式下(不是在调试中),它也会偶尔正常工作,但这是非常随机的。我不知道造成这种情况的原因。以下是我的潜艇的缩短版本(MakeVisible
,UpdateBaseline
,UpdateDerivative1
...是我后面定义的所有子程序:
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
在花了一些时间进行调试之后,我认为有一些竞争条件,因为UpdateBaseline
,UpdateDerivative1
等中的代码实际上正在调整大小并移动一些形状对象(如星形,直连接器等),即使我用来定位它们的变量似乎具有正确的值,它们也会移动到错误的位置。我的直觉告诉我,移动形状或改变它们的属性需要一些可能导致一些竞争条件的计算,但这只是一个疯狂的猜测,它可能完全不相关。
谢谢!
答案 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()
。
谢谢!