Excel VBA: добавление / удаление многих команд в контекстном меню происходит очень медленно, особенно на больших листах - это исправимо? - PullRequest
0 голосов
/ 05 марта 2020

Недавно я заметил, что создание моего контекстного меню (которое добавляет множество различных макрос-кнопок в зависимости от того, в какой электронной таблице вы находитесь, и т. Д. c.) Становится довольно медленным.

В целях тестирования я иметь следующий тестовый макрос в vba объекта книги:

Private Sub App_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    Dim OnActionString As String
    Dim cmdNew As CommandBarButton

    For Each icbc In Application.CommandBars("cell").Controls
        If icbc.Tag = "brccm" Then icbc.Delete
    Next icbc

    For i = 1 To 70
        Set cmdNew = Application.CommandBars("cell").Controls.Add
        With cmdNew
            .Caption = "RecordedOrNot"
            .OnAction = "UTILITY_RecordedOrNot"
            .BeginGroup = False
            .Tag = "brccm"
        End With
    Next

End Sub

Даже на пустом листе контекстное меню, вызываемое правой кнопкой мыши, появляется примерно через 2 секунды. У меня есть большой рабочий лист с примерно 80 000 строк и большим количеством данных, и на него уходит 7 секунд.

Похоже, это должен быть очень быстрый код - кто-нибудь знает, почему он медленный или знаете способ ускорить его или почему он медленнее на больших листах и ​​т. д. c.? Есть ли способ отключить что-то в приложении. * Делая это, это помогает?

Готов попробовать что-нибудь на этом этапе, так как это связано с критическим набором инструментов в моем отделе.

1 Ответ

1 голос
/ 10 марта 2020

Один из вариантов может состоять в том, чтобы предварительно загрузить все элементы управления при открытии рабочей книги ... и затем сделать элементы управления видимыми (или нет) в зависимости от вашей логики дисплея c. Мое тестирование на листе со случайными данными в Range («A1: Z80000») показало, что это выполняется примерно в трети времени по сравнению с добавлением и удалением элементов управления в реальном времени (примерно 1,4 с, чтобы показать / скрыть, против 4,5 с, чтобы удалить / добавить в мой P C).

Option Explicit

Private Sub Workbook_Open()

    Dim cmdNew As CommandBarButton
    Dim icbc As CommandBarControl
    Dim i As Long

    For Each icbc In Application.CommandBars("cell").Controls
        If icbc.Tag = "brccm" Then icbc.Delete
    Next icbc

    For i = 1 To 70
        Set cmdNew = Application.CommandBars("cell").Controls.Add
        With cmdNew
            .Caption = "RecordedOrNot"
            .OnAction = "UTILITY_RecordedOrNot"
            .BeginGroup = False
            .Tag = "brccm"
        End With
      Next

End Sub

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    Dim icbc As CommandBarControl

    For Each icbc In Application.CommandBars("cell").Controls
        If icbc.Tag = "brccm" Then
            icbc.Visible = False ' Include visibility logic here True/False
        End If
    Next icbc

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