Worksheet_change 计算中的第一步问题

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...