【发布时间】:2021-04-20 13:25:58
【问题描述】:
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 总是正确的。
【问题讨论】:
-
如果您有一些示例数据,也许人们会更容易提供帮助。您有
Stavba, DataStavba, Kalkmix范围,但不清楚哪些类型的值或要计算,只有它们的范围。也许价值观有问题。样本数据会更清楚。 -
当您说 F14 = "Error" 时,您的意思是该值是一个字符串,还是您的意思是布尔值 IsError() ?如果单元格值变成#NAME?或#REF!当数据不正确时,您可以使用 IsError 函数进行检查。
-
此外,如果工作表设置为 xlCalculationAutomatic,则 Worksheet_Change 在工作表计算后触发。因此,当您说 xlCalculationManual 时,为时已晚,因为已经计算了更改。您可能想要的是将工作表始终设置为 xlCalculationManual,并根据您自己的标准选择性地调用 Sheet.Calculate。
标签: excel vba onchange worksheet