Удалить все пустые строки

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

Нужно удалить все пустые строки в листе:
текст
пустая строка
пустая строка
текст
текст
текст
пустая строка

еще нужно удалить те строки в которіх есть определенная подстрока.
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Ну удалить все пустые строки Вам вряд ли удастся, например, в новом рабочем листе (MS Excel 97-2003) наличествует 65536 пустых строк и их удаление не приведёт к их исчезновению :P Что касается пустых строк (именно строк), то для их удаления в используемом диапазоне Вы можете использовать любой из двух нижеопубликованных вариантов :

Код: Выделить всё

Dim iRange As Range, iRangeDelete As Range

For Each iRange In Worksheets(1).UsedRange.Rows
    If iRange.Text = "" Then
       Set iRangeDelete = Union(iRange, _
       IIf(iRangeDelete Is Nothing, iRange, iRangeDelete))
    End If
Next

If Not iRangeDelete Is Nothing Then iRangeDelete.EntireRow.Delete

Код: Выделить всё

Dim iRange As Range, iRangeDelete As Range

For Each iRange In Worksheets(1).UsedRange.Rows
    If Application.CountA(iRange) = 0 Then
       Set iRangeDelete = Union(iRange, _
       IIf(iRangeDelete Is Nothing, iRange, iRangeDelete))
     End If
Next

If Not iRangeDelete Is Nothing Then iRangeDelete.EntireRow.Delete
При необходимости цикл можно всегда организовать начиная с первой строки и добавить всевозможные Application. … = False/True, а для поиска нужного значения в ячейках с последующим удалением найденных строк можно использовать метод .Find об'екта Range
Diment
Сообщения: 138
Зарегистрирован: 04 сен 2006, 11:39
Откуда: Кисловодск

если в таблице только один столбец...
Sub вариант1()
Range("A1").Activate 'верхняя точка "прогоняемого" столбца
For i = 1 To 1000 '1000 - ориентировочное количество строк в твоей таблице
ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
If ActiveCell.Value = "" Or ActiveCell.Value = "..." Then
Selection.EntireRow.Delete
End If
Next
End Sub



если несколько столбцов, но удаляются строки на основании данных только одного из них
Sub вариант2()
Selection.AutoFilter Field:=1, Criteria1:="", Operator:=xlOr _
, Criteria2:="=..." 'фильтрация столбца с заданым порядковаым номером
Range(Rows("2:2"), Rows("2:2").End(xlDown)).Delete Shift:=xlUp
Selection.AutoFilter Field:=1
End Sub

и не забывай перед процедурой отключать автоматический перерасчет и обновление экрана (для быстроты процесса)
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Даже если таблица будет содержать всего один столбец, то первый вариант не будет корректно обрабатывать нужный диапазон, и за примером далеко идти не нужно, достаточно взять образец "таблицы", который предоставил автор вопроса. И если уж говорить о рабочем варианте подобного макроса, то цикл нужно, либо осуществить с обратным отсчётом, т.е. с последней строки по первую, либо изменять счёт(чик) после удаления. Что касается .Activate и .Select, то в таких случаях о них нужно забыть раз и навсегда.
namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

С пустыми уже понятно работает спасибо pashulka,
а вот с тем чтобы удалять строку в которой находится подстрока пока ничего не понял
Diment
Сообщения: 138
Зарегистрирован: 04 сен 2006, 11:39
Откуда: Кисловодск

Pashulka, можно короткий пример, как избежать .select и .activate
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Namomelkor, Посмотрите небольшой пример, возможно он окажется Вам полезен ...

Diment, Ну если короткий, то конечно же можно.

Код: Выделить всё

With ThisWorkbook.Worksheets(1)
     For iRow& = 100 To 1 Step -1
         If IsEmpty(.Cells(iRow&, "A").Value) = True Then .Rows(iRow&).Delete
         'ячейка содержащая пробел(ы) не является пустой.
         'но если ячейку с пробелами нужно идентифицировать как пустую ячейку, то
         'If Trim(CStr(.Cells(iRow&, 1))) = "" Then .Rows(iRow&).Delete
     Next
End With
Diment
Сообщения: 138
Зарегистрирован: 04 сен 2006, 11:39
Откуда: Кисловодск

Pashulka, спасибо постараюсь ипользовать такой вариант в своей работе
vv66
Сообщения: 3
Зарегистрирован: 06 сен 2009, 10:37

pashulka писал(а):Namomelkor, Посмотрите небольшой пример, возможно он окажется Вам полезен ...

Diment, Ну если короткий, то конечно же можно.

Код: Выделить всё

With ThisWorkbook.Worksheets(1)
     For iRow& = 100 To 1 Step -1
         If IsEmpty(.Cells(iRow&, "A").Value) = True Then .Rows(iRow&).Delete
         'ячейка содержащая пробел(ы) не является пустой.
         'но если ячейку с пробелами нужно идентифицировать как пустую ячейку, то
         'If Trim(CStr(.Cells(iRow&, 1))) = "" Then .Rows(iRow&).Delete
     Next
End With
Прошу прощения, уважаемый, а как быть в случае, когда в ячейке записана строка с нулевой длинной? Я столкнулся с такой проблемой: когда в ячейке была формула =ЕСЛИ(.........) и после действий копировать/вставить значения там вроде бы было пусто, но макрос по удалению пустых строк, как говорится, проходил мимо. Как быть?.. :confused:
Ответить