VBA在选定工作表之前/之后移动特定工作表需要很长时间 - 为什么



我有简单的代码,它将工作表"数据"移动到激活工作表后。

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

用于返回他们刚刚单击的工作表,否则他们会被卡在"数据"工作表上。

相关内容

最新更新