【问题标题】:First step issue in Worksheet_change calculationWorksheet_change 计算中的第一步问题
【发布时间】: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


【解决方案1】:

如果工作表设置为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2015-04-07
    • 2021-01-25
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    相关资源
    最近更新 更多