Производительность запуска ClearContents очень низка, когда WrapText включен в Excel - PullRequest
2 голосов
/ 24 марта 2009

Я отлаживаю следующий код в Excel 2007 VBA, который кажется очень простым. По какой-то причине обработка 900 строк данных занимает около 30 минут. Я думаю, что я сузил его до некоторого форматирования ячеек, в частности, опции WrapText. Есть ли что-то, чего мне здесь не хватает, что может повысить производительность при удалении этих строк.

Sub ClearContentsOfActive()

    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Dim NumLines
    NumLines = ActiveSheet.UsedRange.Rows.Count

    Range("2:" & NumLines + 3).Select
    Selection.ClearContents
    Selection.Delete Shift:=xlUp

    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

End Sub

Кроме того, пользователь не испытывал этих задержек в Excel 2003 с тем же кодом. Заранее спасибо

Обновление

В ответ на избыточность строки ClearContents, это оригинальный код, который работал в Excel 2003, поэтому я оставил его. Комментирование этой строки было одной из первых вещей, которые я попробовал, поскольку я согласился, что она, возможно, была излишней. См. Ниже мои показатели производительности psuedo.

Test1

Selection.ClearContents  ''//  Takes ~30 mins
Selection.Delete Shift:=xlUp  ''// then this takes <1min

Test2

'Selection.ClearContents  '// If this line is commented
Selection.Delete Shift:=xlUp  ''// then this line takes ~30 mins

Причина, по которой я считаю, что это как-то связано с функцией WrapText, заключается в том, что при очистке строки WrapText, которую он выполняет, и операции AutoFit в строке. Я думал, что сокрытие обновлений экрана или отключение событий поможет.

Ответы [ 2 ]

1 голос
/ 27 марта 2009

Так что, похоже, это связано со свойством ColorIndex ячеек, а не с функцией WrapText. Макрос для страницы имел следующий код

For r = 0 to 1000
  For c = 0 to 15
    Sheets.Cells(r, c).ColorIndex = 14
  Next c
Next r

Я рекомендовал, чтобы пользователь использовал ConditionalFormatting, все вместе испортил макрос, и это исправило его проблемы с производительностью.

Условное форматирование основывалось на формуле на всем листе, которая стала желтой, если для следующего значения установлено значение true

=IF(ROW()>10, FALSE, LEN($A1)>0)
1 голос
/ 24 марта 2009

Действительно ли необходимо вызывать .ClearContents перед вызовом .Delete? Мне кажется, что вызов .ClearContents является избыточным. Вы очищаете значения в диапазоне ячеек, которые вы просто удаляете из существования в следующей строке.

Не знаю, поможет ли это с проблемой производительности, но стоит попробовать.

edit: В ответ на ваше обновление, как насчет того, чтобы избежать выбора и просто сделать следующее:

Range("2:" & NumLines + 3).Delete shift:=xlUp

Вы также можете попытаться избавиться от переноса текста заранее:

Range("2:" & NumLines + 3).WrapText = False
Range("2:" & NumLines + 3).Delete shift:=xlUp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...