我有简单的代码,它将工作表"数据"移动到激活工作表后。
Sub Workbook_SheetActivate(ByVal Sh As Object)
Worksheets("Data").Move After:=Worksheets(Sh.Name)
Worksheets(Sh.Name).Activate
End Sub
我正在使用
Worksheets(Sh.Name).Activate
因为如果没有此行工作表,"数据"在移动后保持选中状态,这不是意图。
我遇到的问题是,当运行此代码时,excel 大约需要 2-3 秒才能考虑它才能看到结果。
我不明白为什么。如果不将这两个操作链接在一起,则需要几毫秒。有人可以解释一下如何改善这一点以及为什么会发生这种情况吗?
这应该更快:
Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim nam As String
nam = Sh.Name
Application.EnableEvents = False
Worksheets("Data").Move After:=Worksheets(nam)
Worksheets(nam).Activate
Application.EnableEvents = True
End Sub
归调用:当你使用 .Activate
时,你的Sub
Workbook_SheetActivate
再次被调用,你陷入了一个无限循环。
如果您只想取消选择数据范围,则可以使用Cells(1,1).Select
,也可以直接使用Sh
而不是使用Worksheets(Sh.Name)
,因为它们是等效的。
所以你的最终代码将是:
Sub Workbook_SheetActivate(ByVal Sh As Object)
Worksheets("Data").Move After:=Sh
Cells(1,1).Select
End Sub
希望这有帮助。
感谢您的输入。关闭/打开事件有助于摆脱循环。
Application.EnableEvents = False
Worksheets("Data").Move After:=Sh
sh.Activate
Application.EnableEvents = True
我可能应该在我的问题中解释代码的用途。
用户在工作簿中有 50+ 个工作表(请不要问我为什么:)(。他们有一个特别的("数据"(,他们希望在使用其他工作表时能够单击进出。所以这段代码只是导致工作表"数据"跟随它们"
该行:
sh.Activate
用于返回他们刚刚单击的工作表,否则他们会被卡在"数据"工作表上。