私人子Worksheet_Calculate()崩溃的Excel

时间:2018-06-23 15:51:46

标签: excel vba excel-vba

我正在努力解决Worksheet_Calculate()的问题。如此处的建议Run Sub procedure with IF() statement in cell,我尝试将excel IF()语句转换为Worksheet_Calculate()中的VBA,因为将使用动态公式激活单元格。但是,当VBA中的特定公式满足条件时,要运行的代码会崩溃。如果我在VBE中将代码作为单独的子项运行,则它可以完美运行并根据需要正确执行。下面是代码,非常感谢您的帮助。

Private Sub Worksheet_Calculate()

Dim rng As Range
Dim mainSheet As Worksheet

Set mainSheet = Worksheets("Sheet1")

If (mainSheet.Range("D2").Value = "ABOVE" And mainSheet.Range("F2").Value > mainSheet.Range("E2").Value And mainSheet.Range("H2").Value = "YES" And mainSheet.Range("I2").Value = "1") Or (mainSheet.Range("D2").Value = "BELOW" And mainSheet.Range("F2").Value < mainSheet.Range("E2").Value And mainSheet.Range("H2").Value = "YES" And mainSheet.Range("I2").Value = "1") Then

    'Disable events so as not to overload the worksheet calculate - as the worksheet is calculating dont change/ delete
    Application.EnableEvents = False

    'enter and copy data
    Set rng = Sheets("Sheet3").Range("A:A").End(xlDown)

    rng.Offset(1, 0) = Format(Now(), "dd/mm/yyyy")
    rng.Offset(1, 1) = Format(Now(), "ddd")
    rng.Offset(1, 2) = Format(Now(), "hh:nn")
    rng.Offset(1, 3) = Sheets("Sheet1").Range("C2")
    rng.Offset(1, 4) = Sheets("Sheet1").Range("A2")
    rng.Offset(1, 5) = Sheets("Sheet1").Range("E2")

    'delete row information
    Worksheets("Sheet1").Range("A2").ClearContents
    Worksheets("Sheet1").Range("C2:E2").ClearContents
    Worksheets("Sheet1").Range("G2:H2").ClearContents

    're-sort colums
    Application.Run "SortByMarket"

    Application.ScreenUpdating = True
    'turn back on events
    Application.EnableEvents = True

 End If

此外,这显然不是最有效的编码方式,因此欢迎任何输入/建议。

1 个答案:

答案 0 :(得分:0)

我认为问题在于,每次更改单元格Worksheet_Calculate都会被调用并中断自身。

在您的子标题的开始处使用它:

Application.EnableEvents = False

Application.EnableEevents = True

最后。

提示:

应该只搜索一次并将其另存为范围变量,以减少查找带有值的列中最后一行的次数。

Dim rng As Range

set rng = Sheets("Sheet3").Range("A:A").End(xlDown)

我也不会打扰使用copy,只需将值分配给目标单元格即可,就像使用时间戳值一样。

它看起来应该像这样链接

'enter and copy data
rng.Offset(1, 0) = Format(Now(), "dd/mm/yyyy")
rng.Offset(1, 1) = Format(Now(), "ddd")
rng.Offset(1, 2) = Format(Now(), "hh:nn")
rng.Offset(1, 3) = Sheets("Sheet1").Range("C2")
rng.Offset(1, 4) = Sheets("Sheet1").Range("A2")
rng.Offset(1, 5) = Sheets("Sheet1").Range("E2")