Утечка производительности во время выполнения с VBA - PullRequest
0 голосов
/ 10 июля 2019

Я создал лист Excel с макросом VBA.Записанные данные читаются из двоичного файла.Из этого двоичного файла я считаю, что каждый х байт представляет кадр.Кадр записан в строку с заголовком.

Первый выпуск: Когда я записываю эти данные, со временем происходит заметная утечка производительности: первые 250 кадров выполняются вминуты, затем следующие 150 занимают одну минуту.В целом, в начале процесса ~ 10 кадров выполняется за 1 секунду.После нескольких сотен кадров обработка одного кадра занимает больше секунды.Время измеряется вручную, в соответствии с индикатором выполнения.

Второй выпуск: У меня есть событие Worksheet_SelectionChange на листе, которое вызывает Cells(row, 1).EntireRow.Hidden, устанавливая его на True или False в зависимости от ситуации.После некоторой проверки отладчика я понял, что эти инструкции занимают все больше времени в зависимости от объема данных, записанных во время сеанса.Например, это занимает хорошие 10 секунд с ~ 400 кадрами.

Теперь часть, которая заставляет меня думать, что есть место для улучшения: Если я сохраню файл, закройте его, снова откройте его,и измените выбор, Cells(row, 1).EntireRow.Hidden занимает незначительное количество времени.Я бы даже сказал, ожидаемое количество времени.Если я только сохраню файл и оставлю его открытым, заметных изменений не будет.

Что я пробовал: Чтобы улучшить производительность, в начале основного саба япозвоните:

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.AskToUpdateLinks = False
    Application.DisplayAlerts = False
    Application.Calculation = xlcalculationmanual
    ThisWorkbook.Date1904 = False
    ActiveWindow.View = xlNormalView

(и в конце поменяйте их обратно на исходные значения)

Я уже максимально избегаю использования Select и Activate.Я также избегаю массивов, используя вместо этого Коллекции, так как я читаю их быстрее.Я использую оператор With всякий раз, когда это необходимо.Я проверяю, что Worksheet_SelectionChange отключено перед записью в файл.

Я считаю, что обе проблемы связаны, но я не понимаю, в чем причина или как я могу ее решить.Что я делаю не так?

РЕДАКТИРОВАТЬ: Использование Application.SaveWorkspace каждые 100 кадров делает работу: он приостанавливает процесс (заметно благодаря индикатору выполнения) на ~ 2 секунды, но количествосэкономленное время на обработку следующих 100 кадров полностью компенсируется.Я думаю, что моя проблема решена сейчас, если нет более чистого способа сделать это.Большое спасибо всем вам в комментариях!

РЕДАКТИРОВАТЬ 2: Проблема решена: я добавлял комментарии к некоторым ячейкам, каждый раз используя selectedCell.Comment.Shape.TextFrame.AutoSize = True, например:

    With sheet.Cells(row, column)
        .AddComment txt
        .Comment.Shape.TextFrame.AutoSize = True
    End With

Цель состоит в том, чтобы заставить их выглядеть красиво.По некоторым причинам это то, что замедляло весь процесс каждый раз, когда он вызывался.

Вместо этого я сейчас вызываю следующий фрагмент в самом конце.Для информации, 100 кадров теперь обрабатываются менее чем за 10 секунд, и время обработки является постоянным.Для ~ 400 кадров следующий фрагмент занял 16 секунд (приблизительно).

    Dim comment As Comment
    For Each comment In sheet.Comments
        comment.Shape.TextFrame.AutoSize = True
    Next comment
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...