Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Удаление лишних строк / 25 сообщений из 51, страница 1 из 3
27.09.2011, 06:17
    #37456621
pal_bil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление лишних строк
Всем доброго утра! Пытаюсь удалить лишние строки где в трех разных столбцах отсутствуют записи.
Код: plaintext
1.
2.
3.
Dim Rng As Range
Set Rng = Range("A5:A5000").SpecialCells(xlCellTypeBlanks)
Rng.EntireRow.Delete
Но здесь указывается только один столбец, а несколько можно указать?
...
Рейтинг: 0 / 0
27.09.2011, 07:23
    #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
27.09.2011, 07:47
    #37456646
pal_bil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление лишних строк
AndreTM,

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

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

Конечно, я запустил код. Медленно
Поставил Application.ScreenUpdating = False, быстрее не стало.
Мне нужно обработать порядка 15 000 строк.
Таблица проста (прил.), там должны удалиться 3 и 8 строка. Ключевые столбцы обведены.
...
Рейтинг: 0 / 0
27.09.2011, 08:51
    #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
27.09.2011, 08:54
    #37456679
pal_bil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление лишних строк
kuklp,

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

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

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

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

Да, у вас быстро удалились. Но это наверно из за того, что удаляемых строк мало.
А у меня их очень много. Из 15 000 строк нужными оказываются где около 100 строк, остальные удаляются.
Интервалы нужны потому что набор записей может быть всегда разным.
Данные экспортируются вот таким вот образом.
...
Рейтинг: 0 / 0
27.09.2011, 09:53
    #37456758
kuklp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление лишних строк
Тем не менее Ваш код работает быстро.
...
Рейтинг: 0 / 0
27.09.2011, 10:13
    #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
27.09.2011, 10:15
    #37456795
kuklp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление лишних строк
AndreTM, у Вас ошибка в коде. Пример с исправленым кодом. Уже далеко не так быстро. И свой туда добавил для сравнения.
...
Рейтинг: 0 / 0
27.09.2011, 10:28
    #37456818
kuklp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление лишних строк
pal_bil, можно, но быстрей не будет. Сравнивайте. Быстрей либо через ADO, либо массивом.
...
Рейтинг: 0 / 0
27.09.2011, 11:43
    #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
27.09.2011, 12:35
    #37457068
pal_bil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление лишних строк
kuklp,

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

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

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


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