我有一个子程序,使用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
答案 0 :(得分:2)
因为这是一个事件过程,它会触发工作表中的任何更改,这一行实际上会再次引发事件:
ActiveSheet.Cells(finalrow, 2).Value = DoB
您需要的是一种内部禁用事件来触发的方法,而此事件具有优先权。幸运的是,有一种方法可以做到这一点,它是Application的内置属性:
您可以Application.EnableEvents = False
(在开头)然后Application.EnableEvents = True
(在结尾处)。
这将阻止由于此过程发生的更改以递归方式提升事件。