工作表更改计算中的第一步问题


Private Sub Worksheet_Change(ByVal Target As Range)
Dim Stavba, DataStavba, Kalkmix As Range
Set Stavba = Range("f9:f14")
Set DataStavba = Range("e5:e8")
Set Kalkmix = Range("i10:j11")
If Not Intersect(Target, DataStavba) Is Nothing And Range("F14") = "Error" Then
'Application.EnableEvents = False
Debug.Print "Cells changed inside: " & Target.Address(0, 0)
Application.Calculation = xlCalculationManual
'Application.EnableEvents = True
Stavba.Calculate
Else:
Application.Calculation = xlCalculationAutomatic
Debug.Print "Cells changed outside: " & Target.Address(0, 0)
End If

'If Intersect(Target, DataStavba) Is Nothing Then
'   Application.Calculation = xlCalculationAutomatic
'Debug.Print "Cells changed outside: " & Target.Address(0, 0)
'End If

End Sub

目标是当用户更改范围DataStavba中的数据,并且F14=Error(这表明DataStavba中的值不适合Kalkmix(时,只计算范围Stavba内的数据,而不计算范围Kalkmix内的数据(因为该区域的计算太复杂(。但在Else的情况下,计算Sheet(包括Kalmix(中的所有单元格

问题出在哪里?按照我想要的方式工作,除了第一步,即Kalkmix总是在";切换";OK错误,反之亦然,或更改DataStavba区域外的单元格。从上面可以看出,我曾尝试过双IF,但也没有正常工作。问题是客户端将错误的数据放入DataStavba(单元格f14从OK切换到ERROR(,但Kalkmix仍在计算中,结果可能是文件关闭。若DataStavba中的另一个值发生了更改,则第一步中也不会计算Kalkmix=所需场景。打印调试总是正确的。

如果工作表设置为xlCalculationAutomatic,则工作表计算后会触发Worksheet_Change。所以当你说xlCalculationManual时,已经太晚了,因为变化已经计算好了。您可能想要的是将工作表始终设置为xlCalculationManual,并选择性地调用sheet。根据自己的标准进行计算。

我建议如下:

Private Sub Workbook_Open()
Application.Calculation = xlCalculationManual
Application.CalculateBeforeSave = False
End Sub
Private Sub Workbook_close()
Application.Calculation = xlCalculationAutomatic
Application.CalculateBeforeSave = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Kalkmix As Range, EverythingExceptKalkmix As Range
Set Kalkmix = Range("I10:J11")
Set EverythingExceptKalkmix = Union(Range("A:H"), _
Range("K:" & Split(Cells(1, Columns.Count).Address, "$")(1)), _
Range("I1:J9"), _
Range("I12:J" & Rows.Count) _
)
'Check if the data is good
Range("F14").Calculate

If Range("F14") = "Error" Then
EverythingExceptKalkmix.Calculate
Else
'If its "OK" then calculate the whole sheet
Me.Calculate
End If
End Sub

最新更新