Чтобы удалить все скрытые столбцы и строки в листе я использую:эффективно удалить все скрытые столбцы и строки в листе
With activeworkbook.Sheets(1)
LR = LRow(activeworkbook.Sheets(1)) ' will retrieve last row no in the sheet
lc = LCol(activeworkbook.Sheets(1)) ' will retrieve last column no in the sheet
For lp = lc To 1 Step -1 'loop through all columns
If .Columns(lp).EntireColumn.Hidden = True Then .Columns(lp).EntireColumn.Delete
Next lp
For lp = LR To 1 Step -1 'loop through all rows
If .Rows(lp).EntireRow.Hidden = True Then .Rows(lp).EntireRow.Delete
Next
end with
Но это занимает очень много времени, у меня есть более чем 300 столбцов и 1000 строк. Когда я попытался оценить общее время, необходимое для этих операций, я нашел следующие строки взяли большую часть времени:
For lp = lc To 1 Step -1 'loop through all columns
If .Columns(lp).EntireColumn.Hidden = True Then _
.Columns(lp).EntireColumn.Delete
Next lp
но следующий цикл намного быстрее.
Есть ли у вас предложения по улучшению скорости выполнения?
Код для LRow и функций LCol ниже, и я подтвердить, она возвращает правильную последнюю строку и последний столбец:
Function LRow(sh As Worksheet)
On Error Resume Next
LRow = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
matchCase:=False).Row
On Error GoTo 0
End Function
Function LCol(sh As Worksheet)
On Error Resume Next
LCol = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
matchCase:=False).Column
On Error GoTo 0
End Function
Я смотрел на использовании .specialcells для выбора всех видимых столбцов, и обратный его удаление.
Было бы неплохо подтвердить, что функция 'LCol (...)' возвращает правильный столбец. Поскольку это, как правило, одна короткая строка кода, я сомневаюсь, нужна ли такая подфункция, даже не говоря уже о возврате правильного номера индекса столбца. Используйте 'Applciation.ScreenUpdating = False', чтобы ускорить процесс. Если вы удаляете формулы, установите вычисление в 'xlCalculationManual'. 'EnableEvents' обычно отключает несколько мс. – Jeeped
Что произойдет, если вы переключите оба цикла, т. Е. Сначала удалите строки, затем столбцы? – LocEngineer
Хороший вопрос, попробовал и подтвердил, что удаление строк продолжается намного быстрее, чем удаление столбца. – cooolboy