我有简单的代码,可以在激活工作表后将工作表“数据”移动到。
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秒才能看到结果。
我不明白为什么。如果不将这两个操作链接在一起,则需要花费毫秒的时间。有人可以解释一下如何改善它,为什么会这样?
答案 0 :(得分:0)
发生这种情况是由于递归调用:当您使用.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
希望这会有所帮助。
答案 1 :(得分:0)
这应该更快:
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
答案 2 :(得分:0)
感谢您的投入。关闭/打开事件有助于摆脱循环。
Application.EnableEvents = False
Worksheets("Data").Move After:=Sh
sh.Activate
Application.EnableEvents = True
我可能应该解释我的问题中使用的代码。
用户在工作簿中有50多个工作表(请不要问我为什么:))。他们特别希望有一个(“数据”),他们希望能够在与其他工作表一起工作时单击和退出。因此,这段代码只是导致工作表“数据”“遵循它们”
该行:
sh.Activate
曾经用来返回他们刚刚单击的工作表,否则他们被卡在“数据”工作表上。