Vba 私有子工作表_Calculate()崩溃excel

Vba 私有子工作表_Calculate()崩溃excel,vba,excel,Vba,Excel,我正在努力解决工作表_Calculate()的问题。正如这里所建议的,我已尝试将excel IF()语句转换为工作表_Calculate()中的VBA,因为单元格将被动态公式激活。但是,当VBA中的特定公式满足条件时,要运行的代码将崩溃。如果我把VBE中的代码作为一个单独的子代码来运行,那么它可以完美地运行,并根据需要正确地执行。下面是代码,非常感谢您的帮助 Private Sub Worksheet_Calculate() Dim rng As Range Dim mainSheet As

我正在努力解决工作表_Calculate()的问题。正如这里所建议的,我已尝试将excel IF()语句转换为工作表_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
Private子工作表_Calculate()
变暗rng As范围
将主工作表调整为工作表
设置主工作表=工作表(“表1”)
如果(mainSheet.Range(“D2”).Value=“上方”和mainSheet.Range(“F2”).Value>mainSheet.Range(“E2”).Value=“是”和mainSheet.Range(“I2”).Value=“1”)或(mainSheet.Range(“D2”).Value=“下方”和mainSheet.Range(“F2”).Value

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

我认为问题在于,每次更改单元格工作表时,都会调用Calculate并中断其本身

在sub的开头使用此选项:

Application.EnableEvents = False

最后

小贴士:

只需搜索一次并将其保存为范围变量,就可以减少在包含值的列中查找最后一行的次数

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")

你好,Brendan,谢谢你的回复。你说的完全有道理,但是,我一直收到这个错误:运行时错误'2147417848(80010108)对象“\u工作表”的“方法”“范围”失败,Set rng=行突出显示..?在您发布错误消息后意识到了问题。请参阅编辑,摘自“是”,感谢您的帮助Brendan。根据上述内容,您知道为什么它没有在第3页的最后一行中输入信息吗?它粘贴在最后一行中数据行,而不是下一行?也许你可以发布你的代码和工作表的屏幕截图。这可能会有帮助,否则请检查你的偏移行是1。我这边行。工作表3中的所有列是否都有相同数量的非空白单元格?如果是这样,你可以尝试将行偏移2,尽管这不是必需的。很难说看看你能看到什么,试着调试-在SETRNG行上插入一个换行符,这可能会有所帮助。
'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")