excel vba - 将值写入单元格时延迟

时间:2014-11-19 17:11:53

标签: excel vba excel-vba

我有一个子程序,使用vlookup从另一个工作表中检索出生日期并将其写入当前工作表。子工作正常,但速度很慢。我知道有一些方法可以加速vba,例如避免在vba代码中使用excel命令,但我通过它并发现当我将日期写入单元格时发生延迟。有什么建议吗?

Private Sub Worksheet_Change(ByVal Target As Range)

Dim finalrow As Long, DoB As Date

ActiveSheet.Unprotect

finalrow = ActiveSheet.Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).row

    If finalrow > 13 Then
        ActiveSheet.Range(Cells(finalrow - 1, 1), Cells(finalrow - 1, 26)).Locked = True
        ActiveSheet.Range(Cells(finalrow - 1, 1), Cells(finalrow - 1, 3)).Interior.Color = RGB(200, 200, 200)
        ActiveSheet.Range(Cells(finalrow, 1), Cells(finalrow, 26)).Locked = False
        ActiveSheet.Cells(finalrow + 1, 1).Locked = False
        DoB = Application.WorksheetFunction.VLookup(ActiveSheet.Cells(finalrow, 1).Value, Sheet1.Range("A:B"), 2, False)
        ActiveSheet.Cells(finalrow, 2).Value = DoB     ' this line causes delay
    Else
        ActiveSheet.Cells(finalrow + 1, 1).Locked = False
    End If

ActiveSheet.Protect

End Sub

1 个答案:

答案 0 :(得分:2)

因为这是一个事件过程,它会触发工作表中的任何更改,这一行实际上会再次引发事件:

ActiveSheet.Cells(finalrow, 2).Value = DoB

您需要的是一种内部禁用事件来触发的方法,而此事件具有优先权。幸运的是,有一种方法可以做到这一点,它是Application的内置属性:

您可以Application.EnableEvents = False(在开头)然后Application.EnableEvents = True(在结尾处)。

这将阻止由于此过程发生的更改以递归方式提升事件。