Самый быстрый способ очистить все содержимое листа VBA

40

У меня есть большой лист, который должен удалить все содержимое. Когда я пытаюсь просто очистить его без VBA, он переходит в не отвечающий режим. При использовании макроса, например:

Sub ClearContents ()
 Application.Calculation = XlManual
 Application.ScreenUpdating = False

  Sheets("Zeroes").Cells.ClearContents

 Application.ScreenUpdating = True
End Sub

Он также не отвечает. Какой самый быстрый способ сделать это?

  • 0
    Содержит ли лист условное форматирование?
  • 0
    Нет условного форматирования, нет.
Показать ещё 1 комментарий
Теги:
excel-vba
excel

4 ответа

74
Лучший ответ

Диапазон .Cells не ограничивается теми, которые используются, поэтому ваш код очищает содержимое 1 048 576 строк и 16 384 столбца - 17 179 869 184 общих ячеек. Это займет некоторое время. Просто снимите UseRange вместо:

Sheets("Zeros").UsedRange.ClearContents

В качестве альтернативы вы можете удалить лист и снова добавить его:

Application.DisplayAlerts = False
Sheets("Zeros").Delete
Application.DisplayAlerts = True
Dim sheet As Worksheet
Set sheet = Sheets.Add
sheet.Name = "Zeros"
  • 0
    Я не уверен, что это сработает. Я попытался сделать это из VBA и просто выделил фрагмент (200 строк, 5000 столбцов) и удалил, и это заморозило его. Затем я включил цикл и просто попытался перебрать 1000 строк, что тоже не сработало. Я могу просто зациклить его вручную и удерживать F8 ...
  • 0
    @ hc91 - Интересно. Похоже, есть достаточно данных, что Excel вызывает проблему, а не VBA. Вы всегда можете удалить лист и повторно добавить его. Смотрите редактирование.
Показать ещё 4 комментария
10

Технически, и из принятого Коминтерном обходного пути, я считаю, что вы действительно хотите удалить все ячейки в листе. Что удаляет форматирование (см. Сноску для исключений) и т.д., А также содержимое ячеек. Т.е. Sheets("Zeroes").Cells.Delete

В сочетании с пропуском UsedRange, ScreenUpdating и Calculation он должен быть почти неосторожным:

Sub DeleteCells ()
    Application.Calculation = XlManual
    Application.ScreenUpdating = False
    Sheets("Zeroes").UsedRange.Delete
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
End Sub

Или, если вы предпочитаете соблюдать состояние расчета, Excel в настоящее время находится в:

Sub DeleteCells ()
    Dim SaveCalcState
    SaveCalcState = Application.Calculation
    Application.Calculation = XlManual
    Application.ScreenUpdating = False
    Sheets("Zeroes").UsedRange.Delete
    Application.ScreenUpdating = True
    Application.Calculation = SaveCalcState
End Sub

Сноска. Если форматирование было применено ко всему столбцу, оно не удаляется. Сюда входят цвет шрифта, цвет заливки и границы, категория формата (например, "Общие", "Дата", "Текст" и т.д.) И, возможно, другие свойства, но

Условное форматирование удаляется, как и форматирование всей строки.

(Форматирование всего столбца весьма полезно, если вы постоянно импортируете необработанные данные на лист, поскольку оно будет соответствовать первоначально примененным форматам, если будет выполнен простой импорт типа Paste-Values-Only.)

3

Вы можете использовать метод .Clear:

Sheets("Zeros").UsedRange.Clear

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

0

Попробуйте следующее:

Sub clear_sht
  Dim sht As Worksheet
  Set sht = Worksheets(GENERATOR_SHT_NAME)
  col_cnt = sht.UsedRange.Columns.count
  If col_cnt = 0 Then
    col_cnt = 1
  End If

  sht.Range(sht.Cells(1, 1), sht.Cells(sht.UsedRange.Rows.count, col_cnt)).Clear
End Sub

Ещё вопросы

Сообщество Overcoder
Наверх
Меню