VBA在选定工作表之前/之后移动特定工作表的时间太长-为什么?

时间:2019-04-17 12:00:48

标签: excel 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秒才能看到结果。

我不明白为什么。如果不将这两个操作链接在一起,则需要花费毫秒的时间。有人可以解释一下如何改善它,为什么会这样?

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

曾经用来返回他们刚刚单击的工作表,否则他们被卡在“数据”工作表上。