VBA перемещение определенной таблицы до / после выбранной таблицы занимает слишком много времени - почему? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть простой код, который перемещает лист «Данные» после активированного листа.

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 голосов
/ 17 апреля 2019

Это должно быть быстрее:

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
0 голосов
/ 24 апреля 2019

Спасибо за ваш вклад, ребята.Выключение / включение событий помогло выйти из цикла.

    Application.EnableEvents = False
    Worksheets("Data").Move After:=Sh
    sh.Activate
    Application.EnableEvents = True

Мне следовало бы объяснить, для чего код использовался в моем вопросе.

У пользователя было более 50 рабочих листовв рабочей тетради (пожалуйста, не спрашивайте меня, почему :)).У них был один конкретный («Данные»), который они хотели иметь возможность щелкать и выгружать во время работы с другими рабочими листами.Таким образом, этот код просто заставлял «Данные» рабочего листа «следовать за ними»

Строка:

sh.Activate

Использовалась для возврата к рабочему листу, на который они только что нажали, иначе онизастряли на листе данных.

0 голосов
/ 17 апреля 2019

Это происходит из-за рекурсивного вызова: когда вы используете .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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...