powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Удаление лишних строк
25 сообщений из 51, страница 1 из 3
Удаление лишних строк
    #37456621
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго утра! Пытаюсь удалить лишние строки где в трех разных столбцах отсутствуют записи.
Код: plaintext
1.
2.
3.
Dim Rng As Range
Set Rng = Range("A5:A5000").SpecialCells(xlCellTypeBlanks)
Rng.EntireRow.Delete
Но здесь указывается только один столбец, а несколько можно указать?
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456636
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то типа такого (удаляем строки в диапазоне, у которых первая, третья и пятая ячейка - пустые) :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    Dim oRng As Range, nRow As Long
    Set oRng = Range("A5:E20")

    nRow = oRng.Rows.Count
    With oRng
        While nRow >  0 
            If IsEmpty(.Cells(nRow,  1 )) And IsEmpty(.Cells(nRow,  3 )) And IsEmpty(.Cells(nRow,  5 )) Then
                oRng.Rows(nRow).Delete
            Else
                nRow = nRow -  1 
            End If
        Wend
    End With
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456646
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM,

У меня таблица очень большая. Здесь строки удаляются перебором. Очень долго.
А нельзя как-нибудь разом всё удалить?
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456652
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Очень большая" в любом случае не более миллиона. Вы пробовали запускать приведенный код или нет?
Заодно сразу скажу, что неплохо бы для начала попробовать использовать управление свойствами Application.ScreenUpdating и Application.Calculation, если у вас происходит "торможение".

С другой стороны, ваша проблема (именно с точки зрения ускорения) может быть решена радикально другим образом - использованием коннекта ADODB с запросом "UPDATE...SET...". но для этого надо бы ориентироваться на пример ваших реальных данных.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456665
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM,

Конечно, я запустил код. Медленно
Поставил Application.ScreenUpdating = False, быстрее не стало.
Мне нужно обработать порядка 15 000 строк.
Таблица проста (прил.), там должны удалиться 3 и 8 строка. Ключевые столбцы обведены.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456677
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pal_bil, в модуль листа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub www()
    Dim i&
    With Me.UsedRange
        For i =  2  To  8  Step  3 
            .AutoFilter Field:=i, Criteria1:="="
        Next
        .Offset( 1 ).SpecialCells( 12 ).EntireRow.Delete
    End With
    Me.AutoFilterMode =  0 
End Sub
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456679
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kuklp,

Таблица в приложении просто пример, в оригинале она больше и удаляемые строки могут время от времени разниться.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456698
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нихрена не понял...
Вы точно не модифицировали код "под себя"?
У меня на 35000 строк выполняет удаление ~ за 10 -5 сек...

Запустите в примере на Листе2 макрос TEST()
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456714
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pal_bilkuklp,
Таблица в приложении просто пример, в оригинале она больше
И что?
pal_bilи удаляемые строки могут время от времени разниться.Что значит "разниться"? Они и в примере разные.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456719
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM, не совсем так. Попробуйте:
MsgBox Time - Time0
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456727
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kuklp,

И что? проверил - =0,0000115740740740389...
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456748
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM, такая конструкция правильней:
Time0 = Timer

MsgBox Timer - Time0
Попробуйте.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456751
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, да тормознул... Думал (и подразумевал) одно, а прописал другое
Пробовать и не буду - именно это и имелось ввиду.
Ну, это простительно - утро на дворе, а я еще не спал
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456755
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM,

Да, у вас быстро удалились. Но это наверно из за того, что удаляемых строк мало.
А у меня их очень много. Из 15 000 строк нужными оказываются где около 100 строк, остальные удаляются.
Интервалы нужны потому что набор записей может быть всегда разным.
Данные экспортируются вот таким вот образом.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456758
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тем не менее Ваш код работает быстро.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456792
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще такой код, которые работает быстрее
Код: plaintext
1.
2.
3.
4.
5.
LastRow = ActiveSheet.UsedRange.Row -  1  + ActiveSheet.UsedRange.Rows.Count
Application.ScreenUpdating = False
For r = LastRow To  1  Step - 1 
If Application.CountA(Rows(r)) =  0  Then Rows(r).Delete
Next r
но он удаляет только все пустые строки. Можно ли сюда прописать мои условия?
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456795
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM, у Вас ошибка в коде. Пример с исправленым кодом. Уже далеко не так быстро. И свой туда добавил для сравнения.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456818
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pal_bil, можно, но быстрей не будет. Сравнивайте. Быстрей либо через ADO, либо массивом.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37456952
R Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kuklp,

На ADO
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Public Function ADO_R_Dmitry(ByVal strSql$, ByVal FilePath$, ByVal OutputRange As Range, _
ByVal FieldsName As Boolean, ByVal OutputFieldsName As Boolean)

Dim sCon As String, FieldName As String
Dim rs As Object, cn  As Object

Set rs = CreateObject("ADODB.Recordset")
Set cn = CreateObject("ADODB.Connection")
If FieldsName Then FieldName = "Yes" Else FieldName = "No"
Select Case CLng(Split(Application.Version, ".")( 0 ))
    Case Is <  12 
        sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FilePath _
          & ";Extended Properties=""Excel 8.0;HDR=" & FieldName & ";IMEX=1"";"
    Case Is >=  12 
        sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FilePath _
        & ";Extended Properties=""Excel 12.0;HDR=" & FieldName & ";IMEX=1"";"
End Select

cn.Open sCon
If Not cn.State =  1  Then Exit Function
Set rs = cn.Execute(strSql)
If Not FieldsName Then OutputFieldsName = False
 If OutputFieldsName Then
    For i =  0  To rs.Fields.Count -  1 
    OutputRange.Offset( 0 , i) = rs.Fields(i).Name
    Next
    Set OutputRange = OutputRange.Offset( 1 ,  0 )
 End If
OutputRange.CopyFromRecordset rs
rs.Close:  cn.Close
Set cn = Nothing: Set rs = Nothing
End Function


для вашего случая, данные на листе "Лист1", начиная с ячейки А1
данные выводяться на лист 2 (должен быть создан)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub Test()
'пример использования
StrSQL2="SELECT * FROM [Лист1$]" _
& " WHERE F2 <> null  AND F5 <>null  AND F8 <>null "

Call ADO_R_Dmitry(strSql2, ThisWorkbook.FullName, Sheets( 2 ).[a1], False, False)
Sheets( 2 ).Activate
End Sub
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37457068
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kuklp,

Что означает For i = 2 To 8 Step 3?
У меня удаляются вместе с ненужными и нужные строки.
В оригинальном файле мне нужно оставить строки, где есть значения в любом из столбцов A, H и О - 1, 8 и 15 соответственно.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37457096
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё, разобрался. Всем спасибо за ответы. Пригодился вариант, предложенный kuklp. Он проще и главное быстрее.
В этом участке кода
Код: plaintext
1.
For i =  2  To  8  Step  3 
я убрал Step 3, и все вышло так как мне нужно ))
Благодарю всех еще раз!
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37457153
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pal_bil, так удалит только те строки, в которых со 2 по 8 столбец пусто. А я исходил из Вашего примера. Там при Вашем подходе ничего не удалится.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37457161
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще. При усредненном подходе(разные к-ва нужных и ненужных) вариант Димы(R Dmitry) ИМХО должен быть быстрей моего.
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37457183
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kuklp,

Да, вы правы, там ничего не удалилось бы.
Просто в пустых строках у меня должны были стоять некоторые формулы для расчета, но я их вставил макросом после удаления. Это не важно.
А вот вариант R Dmitry может и быстрее, разницу сложно на глаз уловить. За то у вас писанины меньше )
...
Рейтинг: 0 / 0
Удаление лишних строк
    #37457277
pal_bil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kuklp,

Не подскажете как таким же методом удалить все строки, в которых столбец G не содержит значение "ИСТИНА"? То есть "ИСТИНА" оставить, а остальное удалить
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Удаление лишних строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]