Я создал лист 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