问题描述
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-Error 或更改 DataStavba 区域外的单元格后始终在第一步计算。 从上面可以看出,我尝试使用双 IF,但它也无法正常工作。问题是客户端将错误的数据放入 DataStavba(单元格 f14 从 OK 切换到 ERROR),但仍然计算 Kalkmix - 结果可能是文件关闭。如果在 DataStavba 中更改了另一个值,则不会在第一步中计算 Kalkmix = 所需的场景。 Print.Debug 总是正确的。
解决方法
如果工作表设置为 xlCalculationAutomatic,则在工作表计算后触发 Worksheet_Change。因此,当您说 xlCalculationManual 时,为时已晚,因为已经计算了更改。您可能想要的是将工作表始终设置为 xlCalculationManual,并根据您自己的条件有选择地调用 Sheet.Calculate。
我建议如下:
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