У меня такой вопрос: Есть лист в книге, в котором больше 8 тыс. строк. Данные в ячейки заносятся формулами. Там, где результат формулы равен "пустоте", то и в ячейке остается "пустота". Мне надо из этих ячеек, в которых "пустота" удалить эти формулы быстро. У меня есть макрос но это банальный цикл, построчно перебирающий. Он очень долго работает.
Заранее спасибо.
Добрый день! Все с прошедшими праздниками!
У меня такой вопрос: Есть лист в книге, в котором больше 8 тыс. строк. Данные в ячейки заносятся формулами. Там, где результат формулы равен "пустоте", то и в ячейке остается "пустота". Мне надо из этих ячеек, в которых "пустота" удалить эти формулы быстро. У меня есть макрос но это банальный цикл, построчно перебирающий. Он очень долго работает.
А Вы не по всем ячейкам цикл делайте, а только по тем, которые содержат формулы: ActiveSheet.SpecialCells(xlCellTypeFormulas) и перед заменой отключайте обработку событий и пересчёт листа.
А Вы не по всем ячейкам цикл делайте, а только по тем, которые содержат формулы: ActiveSheet.SpecialCells(xlCellTypeFormulas) и перед заменой отключайте обработку событий и пересчёт листа.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 09.01.2013, 14:20
Если Вам разрешено изменение формул и можно вместо пустоты вернуть ошибку, скажем, функцией НД(), то потом можно выделить ошибки через специальное выделение формул с ошибками (Ctrl+G, Выделить). Макросом это делается через Range.SpecialCells. Далее удаляете (очищаете) нужные выделенные ячейки одной командой (без цикла):
Sub Macro1() With Range("A1:A20") .FormulaR1C1 = "=IF(RAND()>0.5,""Не удаляем"",NA())" .SpecialCells(xlCellTypeFormulas, 16).ClearContents End With End Sub
[/vba]
Если Вам разрешено изменение формул и можно вместо пустоты вернуть ошибку, скажем, функцией НД(), то потом можно выделить ошибки через специальное выделение формул с ошибками (Ctrl+G, Выделить). Макросом это делается через Range.SpecialCells. Далее удаляете (очищаете) нужные выделенные ячейки одной командой (без цикла):
Sub Macro1() With Range("A1:A20") .FormulaR1C1 = "=IF(RAND()>0.5,""Не удаляем"",NA())" .SpecialCells(xlCellTypeFormulas, 16).ClearContents End With End Sub
Dim cell As Range, Rubbish As Range For Each cell In Range() ' Range() - сам поставишь, что нужно If cell.Value = "" Then If Rubbish Is Nothing Then Set Rubbish = cell Else Set Rubbish = Union(Rubbish, cell) End If End If Next cell
If Not Rubbish Is Nothing Then ' Rubbish.Select Rubbish.ClearContents Set Rubbish = Nothing End If
[/vba]
это работает быстрее, чем в цикле "рубать" каждую ячейку
посты 2, 3 - однозначно, да.
могу предложить такой вариант: [vba]
Код
Dim cell As Range, Rubbish As Range For Each cell In Range() ' Range() - сам поставишь, что нужно If cell.Value = "" Then If Rubbish Is Nothing Then Set Rubbish = cell Else Set Rubbish = Union(Rubbish, cell) End If End If Next cell
If Not Rubbish Is Nothing Then ' Rubbish.Select Rubbish.ClearContents Set Rubbish = Nothing End If
[/vba]
это работает быстрее, чем в цикле "рубать" каждую ячейку
Sub FindAndClearEmptyInFormulas() Dim rCell As Range With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With For Each rCell In ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas) If rCell.Value = "" Then rCell.ClearContents Next rCell With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlAutomatic: End With End Sub
[/vba] Отключение обработки событий, обновления экрана и пересчёта ячеек на время работы макроса обычно даёт значительное ускорение его работы
[vba]
Код
Sub FindAndClearEmptyInFormulas() Dim rCell As Range With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With For Each rCell In ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas) If rCell.Value = "" Then rCell.ClearContents Next rCell With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlAutomatic: End With End Sub
[/vba] Отключение обработки событий, обновления экрана и пересчёта ячеек на время работы макроса обычно даёт значительное ускорение его работыAlex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Понедельник, 14.01.2013, 12:47