powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / удаление строк в большом Ексель файле
35 сообщений из 35, показаны все 2 страниц
удаление строк в большом Ексель файле
    #36382626
stasuha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне необходимо удалить строки со нулевыми значиниями из Листа, но там порядка 200 000 строк.
to_sheet - название рабочего листа

Пробовал через автофильтр:
to_sheet.AutoFilterMode = False

to_sheet.Range("A1:H1").AutoFilter Field:=5, Criteria1:="=0"

'Cells(Range("a1").SpecialCells(xlCellTypeLastCell).Row + 1, 1)

to_sheet.Activate
Range(Cells(2, 1), Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, Cells.SpecialCells (xlCellTypeLastCell).Column)).Delete

----------------------------------------------------------
Далее пробовал через выделение дипазона

Set Col1 = to_sheet.UsedRange.Columns(5)
Col1_values = Evaluate("Transpose(Transpose(" & Col1.Address & "))")
Col1.Copy
Col1.PasteSpecial , xlPasteSpecialOperationDivide
Set DelRng = Col1.SpecialCells(xlCellTypeConstants, xlErrors).EntireRow
Col1 = Col1_values
DelRng.Delete
-----------------------------------------------------------
Как итог - оба работают правильно на меньших объёмах данных и не работает для такого количества строк :(
Кто-нибудь сталкивался с такой проблемой? Может помочь?
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36382927
_Boroda_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stasuha,

Макрос сейчас писать некогда, просто как я обычно это делаю (и руками, и макросом)
Сначала сортирую так, чтобы все нули оказались внизу таблицы (по убыванию),
Затем выделяю эти строки и либо просто стираю делитом, либо (это подольше) удаляю строки. Затем снова сортирую так, как было
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36383053
stasuha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за сообщение.
Согласен, сортировка быстрее работает, чем фильтр, но у меня ещё есть и отрицательные значения.
Да и макрос нужен (а не просто просортировать и руками нажать del), т.к. таких файлов довольно много и их надо открывать, удалять нули и копировать результат в другое место.

Поэтому не совсем понимаю, как можно удалить строки с нулями (если даже они будут внизу)
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36383153
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если коротко -
пробежаться по ячейкам и воспользоваться медотом Union для объединения ячеек удовлетворяющих поиску, потом delCells.EntireRow.delete
Не помню какое ограничение у Union ограничение на количество разрывных диапазонов, но возможно Вам хватит попробуйте
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36383310
Vasilisk_and
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно с помощью макроса
-преобразовать диапазон в массив
-удалить из него нулевые строки
-стереть все на листе и вставить обработанный массив
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36383743
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример, но работает долго, на 60 тыс строк, при удалении через одну строку, у меня работает 5 мин.
Код: 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.
Sub LongDelete()
Dim XXX As Long, YYY As Long, ZZZ As Long, WorkR As Range
  XXX =  60481  'последняя строка с данными
  YYY =  2  'первая строка с данными, строка с заголовками для фильтра на одну выше
  On Error GoTo ErrorHandler
  Do While XXX >= YYY
    Range(Cells(YYY -  1 ,  1 ), Cells(XXX,  1 )).AutoFilter
    Range(Cells(YYY -  1 ,  1 ), Cells(XXX,  1 )).AutoFilter Field:= 1 , Criteria1:= 0 
    ZZZ = XXX
'в этой строке ожидается ошибка при большом количестве отфильтрованных диапазонов строк
    Set WorkR = Range(Cells(YYY,  1 ), Cells(ZZZ,  1 )).SpecialCells(xlCellTypeVisible)
    
    If YYY = ZZZ Then
      If Rows(YYY).Hidden Then Exit Do Else Set WorkR = Cells(YYY,  1 )
    End If
    If ZZZ <=  1  Then Exit Do
    If Not WorkR Is Nothing Then WorkR.EntireRow.Delete
  Loop
  If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
  Exit Sub
ErrorHandler:
  If Err.Number =  1004  Then
    ZZZ = ZZZ /  2 
    Err.Clear
  Else
    On Error GoTo  0 
  End If
  Resume
End Sub 'LongDelete
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36383911
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stasuha,

Наваял такой код

Код: 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.
Sub delete_Null_rows()
 Dim ch As Range
 Dim d As Range
 
 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
 
 Set d = Nothing
 
 For Each ch In Selection
  If ch.Value =  0  Then
   If d Is Nothing Then
     Set d = ch
    Else
     Set d = Union(d, ch)
   End If
  End If
 Next ch
 
 If Not (d Is Nothing) Then
  d.EntireRow.Delete
 End If
 
 Application.Calculation = xlCalculationAutomatic
 Application.ScreenUpdating = True
 
End Sub

Перед применением надо выделить столбец в котором нулевые значения.
Удаляет строки в которых по данному столбцу стоит 0, либо пусто.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36383940
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы избежать ошибку с переполнением Union можно попробовать так:

Код: 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.
33.
34.
35.
Sub delete_Null_rows()
 Dim ch As Range
 Dim d As Range
 
 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
 
 Set d = Nothing
 
 For Each ch In Selection
  If ch.Value =  0  Then
   If d Is Nothing Then
     Set d = ch
    Else
     On Error Resume Next
     Set d = Union(d, ch)
     If Err.Number <>  0  Then
      Err.Clear
      d.EntireRow.Delete
      Set d = ch
      On Error GoTo  0 
     End If
   End If
  End If
 Next ch
 
 If Not (d Is Nothing) Then
  d.EntireRow.Delete
 End If
 
 Application.Calculation = xlCalculationAutomatic
 Application.ScreenUpdating = True
 
End Sub


Но есть опасения что в случае кода
Код: plaintext
d.EntireRow.Delete
следующая команда
Код: plaintext
Set d = ch
Будет указывать на неправильную ячейку, т.к. после удаления строк адреса ячеек изменяться, а переменная ch будет хранить старый адрес.
В этом случае тогда после удаления наверно правильнее снова запустить цикл for each с нуля, надо лишь знать, какой диапазон при этом выделить.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36383959
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нижний текст в предыдущем сообщении читать так:

Но есть опасение, что в случае выполнения кода
Код: plaintext
d.EntireRow.Delete
после возникновения ошибки с Union, следующая команда
Код: plaintext
Set d = ch
Будет указывать на неправильную ячейку, т.к. после удаления строк адреса ячеек изменяться, а переменная ch будет хранить старый адрес.
В этом случае тогда после удаления наверно правильнее снова запустить цикл for each с нуля, надо лишь знать, какой диапазон при этом выделить.
А если лень думать, то можно удалить лишь максимально возможный диапазон до первой ошибки с Union и затем предложить пользователю выделить оставшийся диапазон и запустить макрос повторно.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36384027
stasuha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ваши ответы, но так и есть, все способы с Range сразу вылетают в ошибку....
Поэтому пока так и не работает :(
Странно 2007 Ексель сделали, а всё остальное работает только до 60 тысяч строк. :(
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36384560
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stasuha,

Попробуй такой код:

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Option Explicit

Sub delete_Null_rows()
 Dim ch As Range
 Dim d As Range
 Dim k As Integer
 Dim p As Boolean
 
 p = True
 
 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
 
 
 Do While p
   
   p = False
   
   Set d = Nothing
   
   Intersect(Selection, ActiveSheet.UsedRange).Select
   
   For Each ch In Selection
    If ch.Value =  0  Then
     If d Is Nothing Then
       Set d = ch
       k =  1 
      Else
       Set d = Union(d, ch)
       k = k +  1 
     End If
    End If
    
    If k =  1000  Then
     d.EntireRow.Delete
     k =  0 
     p = True
     Exit For
    End If
   Next ch
   
 Loop
 
 If Not (d Is Nothing) Then
  d.EntireRow.Delete
 End If
  
 Application.Calculation = xlCalculationAutomatic
 Application.ScreenUpdating = True
 
End Sub

Перед применением надо выделить столбец в котором нулевые значения.
Удаляет строки в которых по данному столбцу стоит 0, либо пусто.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36386456
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Djon Playerв случае выполнения кода
Код: plaintext
d.EntireRow.Delete
после возникновения ошибки с Union, следующая команда
Код: plaintext
Set d = ch
Будет указывать на неправильную ячейку, т.к. после удаления строк адреса ячеек изменяться, а переменная ch будет хранить старый адрес. - сталкивался с такой проблемой. Если удаляем строки по-одной, можно обойти так - посчитать число строк диапазона и запустить цикл с последней строки наверх. Тогда удаление строки мешать не будет - изменятся адреса уже обработанных ячеек.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36386563
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121Djon Playerв случае выполнения кода
Код: plaintext
d.EntireRow.Delete
после возникновения ошибки с Union, следующая команда
Код: plaintext
Set d = ch
Будет указывать на неправильную ячейку, т.к. после удаления строк адреса ячеек изменяться, а переменная ch будет хранить старый адрес. - сталкивался с такой проблемой. Если удаляем строки по-одной, можно обойти так - посчитать число строк диапазона и запустить цикл с последней строки наверх. Тогда удаление строки мешать не будет - изменятся адреса уже обработанных ячеек.Согласен, в своих проектах при удалении строк я всегда иду снизу вверх, но в это случае код чуть посложнее и подлиннее, надо работать с нумерацией строк и идти от нижней к верхней. А так-же после удаления некоторого количества строк сразу-же вычислять сколько строк реально удалилось и повторный перебор делать не снова по всем данным, а лишь по необработанным данным.
Чтобы не усложнять код пошёл по простому пути, использовал простой цикл for each.
Интересно, как в таком цикле включить обратный перебор, кто-нибудь знает?
Использованиеь step -1 не канает.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36386573
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как же вам тяжело приходится без СУБД.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36386636
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем нужен обратный перебор? Удалили и забыли - или я не въехал в вопрос...
"Мне необходимо удалить строки со нулевыми значиниями из Листа" - пытаюсь сделать это, смотрим как я понял 5-ю колонку.
У меня 2000, поэтому не проверял на 200000 строк, на 65000 работает небыстро, но работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub DelEmptyRowsOn5Column()
Application.ScreenUpdating =  0 
Set to_sheet = ThisWorkbook.Sheets( 1 ) 'это я тестировал, исправьте
Set Col1 = to_sheet.UsedRange '.Columns(5) ' имхо UsedRange всё равно берётся от всего листа,
' если надо определять именно по 5 колонке и не удалять строки вне проверяемого диапазона,
' код надо усложнить
y = Col1.Rows.Count
For x = y To  1  Step - 1 
If Cells(x,  5 ).Value = "" Or Cells(x,  5 ).Value =  0  Then Rows(x).EntireRow.Delete
If x Mod  100  =  0  Then Application.StatusBar = "Working On Row " & x ' чтоб видеть процесс
Next x
Application.ScreenUpdating =  1 
Application.StatusBar = False
End Sub
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36386711
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121А зачем нужен обратный перебор? Удалили и забыли - или я не въехал в вопрос...
"Мне необходимо удалить строки со нулевыми значиниями из Листа" - пытаюсь сделать это, смотрим как я понял 5-ю колонку.
У меня 2000, поэтому не проверял на 200000 строк, на 65000 работает небыстро, но работает.
Да, при обратном переборе повторный перебор не нужен, достаточно одного цикла, слишком быстро писал просто.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36386729
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djon Player,

К вашему коду я бы ещё добавил код связанный с Application.Calculation, т.к. если там ещё и расчёт какие-то есть, то всё будет тормозить ещё больше.
Так-же добавил бы порционное удаление группы строк, а не по одной строке, мне кажется так будет работать быстрее, хотя конечно это надо проверять на реальных данных, как быстрее.
Можно ещё даже подобрать некое число, чтобы при удалении группы строк в количестве этого числа удаление работало максимально быстро.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36387692
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процедура очистки(удаления) строк в столбце ColNum со значениями DelValue:

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
'===================================================================================
' Sub         : DelRows(TableHeader,ColNum,DelValue)
' TableHeader : Range; table header range
' ColNum      : Long; column number with DelValue
' DelValue    : Variant; value of rows to be deleted
'-------------+---------------------------------------------------------------------
' VBA call    : DelRows ActiveSheet.Range("A1:H1"), 5, 0
'-------------+---------------------------------------------------------------------
' Created     : ZVI:2009:12:26 http://www.sql.ru/forum/actualthread.aspx?tid=722758
'-----------------------------------------------------------------------------------
Sub DelRows(TableHeader As Range, ColNum As Long, DelValue)
  Dim Arr(), r&, rs&, cs&, i&, v, ac
  With TableHeader.CurrentRegion
    rs = .Rows.Count - TableHeader.Row + .Row
    cs = .Columns.Count - TableHeader.Column + .Column
  End With
  With TableHeader.Resize(rs,  1 )
    Arr() = .Offset(, cs).Value
    ' Check DelValue
    For Each v In .Offset(, ColNum -  1 ).Value
      r = r +  1 
      If v <> DelValue Then
        i = i +  1 
        Arr(r,  1 ) =  1 
      End If
    Next
    If i < rs Then
      ' Freeze on
      With Application
        .ScreenUpdating = False
        .EnableEvents = False
        ac = .Calculation: .Calculation = xlCalculationManual
      End With
      ' Delete rows with DelValue in ColNum
      .Offset(, cs) = Arr
      .Resize(, cs +  1 ).Sort .Cells( 1 ).Offset(, cs),  1 , Header:=xlNo
      .Resize(,  1 ).Offset(, cs).ClearContents
      .Resize(rs - i, cs).Offset(i).Clear   ' или .Resize(rs - i).Offset(i).EntireRow.Delete
      ' Freeze off
      With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = ac
      End With
    End If
  End With
End Sub

Тестирование:
Код: plaintext
1.
2.
3.
Sub Test()
  DelRows ActiveSheet.Range("A1:H1"),  5 ,  0 
End Sub
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36389290
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVIПроцедура очистки(удаления) строк в столбце ColNum со значениями DelValue:
[/src]
Круто, попробовал на миллионе строк в Excel 2007, работает, причем очень быстро.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #36390569
stasuha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ваши ответы.
Но последний код действительно работает правильно и быстро!
Респект вам! и большое спасибо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
удаление строк в большом Ексель файле
    #37770644
leha013-01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем!

Процедура Sub DelRows(TableHeader As Range, ColNum As Long, DelValue).... очень быстро удаляет строки по критерию одного из столбцов ( по критерию DelValue из столбца ColNum если точнее).

У меня такая сейчас задача: удалить все строки в 7 столбце, значение которых не равно 2 или 3.
пробовать запускать процедуру N раз как-то глупо, с другой стороны вписать значение <>2 или <>3 тоже не катит, так как DelValue не воспринимает этого.

Может кто подскажет как в таком случае быть? ))

Спасибо.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37770839
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leha013-01,

Код: vbnet
1.
2.
3.
4.
If Cells(x, 7).Value = 2 Or Cells(x, 7).Value = 3 Then 
else
Rows(x).EntireRow.Delete
endif
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37771457
leha013-01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to ПЕНСИОНЕРКА:

Спасибо, конечно, за вариант ))

но таким макаром можно удалять строки практически по любому критерию, но как гласит тема данного вопроса нужно удалить N строк по определенному критерию одного из столбцов да еще и одним махом
и цикл

If Cells(x, 7).Value = 2 Or Cells(x, 7).Value = 3 Then
else
Rows(x).EntireRow.Delete
endif

здесь совершенно не катит )
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37771471
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> leha013-01,
> пробовать запускать процедуру N раз как-то глупо...

Код: vbnet
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.
Option Base 0
'===================================================================================
' Original code : ZVI:2009:12:26 http://www.sql.ru/forum/actualthread.aspx?tid=722758
'-----------------------------------------------------------------------------------
Sub DelRows(TableHeader As Range, ColNum As Long, DelValue)
  Dim Arr(), r&, rs&, cs&, i&, v, ac
  Dim ii&, k&
' ...
    ' Check DelValue
    For Each v In .Offset(, ColNum - 1).Value
      r = r + 1
      If IsArray(DelValue) Then
        k = UBound(DelValue) + 1
        For ii = 0 To k - 1
          If v <> DelValue(ii) Then
            k = k - 1
          Else: Exit For
          End If
        Next ii
      Else
        k = (v = DelValue)
      End If
      If k = 0 Then
        i = i + 1
        Arr(r, 1) = 1
      End If
    Next
' ...


Код: vbnet
1.
Call DelRows(ActiveSheet.Range("A1:H1"), 5, Array(2,3))


ЗЫ: скорость будет уже не та
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37771481
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример данных не хотите показать?
А то может удалять строки совсем и не нужно...

Ну а если что, чуть подкорректировал под задачу (для чисел!):
Код: vbnet
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Option Explicit

'Процедура очистки(удаления) строк в столбце ColNum со значениями DelValue:

'===================================================================================
' Sub         : DelRows(TableHeader,ColNum,DelValue)
' TableHeader : Range; table header range
' ColNum      : Long; column number with DelValue
' DelValue    : Variant; value of rows to be deleted
'-------------+---------------------------------------------------------------------
' VBA call    : DelRows ActiveSheet.Range("A1:H1"), 5, 0
'-------------+---------------------------------------------------------------------
' Created     : ZVI:2009:12:26 http://www.sql.ru/forum/actualthread.aspx?tid=722758
'-----------------------------------------------------------------------------------
Sub DelRows(TableHeader As Range, ColNum As Long, DelValue)
    Dim Arr(), r&, rs&, cs&, i&, v, ac, oDict As Object
    With TableHeader.CurrentRegion
        rs = .Rows.Count - TableHeader.Row + .Row
        cs = .Columns.Count - TableHeader.Column + .Column
    End With

    Set oDict = CreateObject("Scripting.Dictionary")
    For Each v In Split(DelValue)
        oDict.Item(--v) = vbNullString
    Next
    
    With TableHeader.Resize(rs, 1)
        Arr() = .Offset(, cs).Value
        ' Check DelValue

    For Each v In .Offset(, ColNum - 1).Value
        r = r + 1
        If oDict.exists(v) Then
            i = i + 1
            Arr(r, 1) = 1
        End If
    Next
    If i < rs Then
        ' Freeze on
        With Application
            .ScreenUpdating = False
            .EnableEvents = False
            ac = .Calculation: .Calculation = xlCalculationManual
        End With
        ' Delete rows with DelValue in ColNum
        .Offset(, cs) = Arr
        .Resize(, cs + 1).Sort .Cells(1).Offset(, cs), 1, Header:=xlNo
        .Resize(, 1).Offset(, cs).ClearContents
        .Resize(rs - i, cs).Offset(i).Clear   ' или .Resize(rs - i).Offset(i).EntireRow.Delete
        ' Freeze off
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = ac
        End With
    End If
End With
End Sub

'Тестирование:
Sub Test()
    DelRows ActiveSheet.Range("A1:H1"), 7, "2 3"
End Sub



Можно придумать как-то иначе словарь заполнять...
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37775194
leha013-01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо огромное!! все отлично работает ))
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37971868
Sallador
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZVIПроцедура очистки(удаления) строк в столбце ColNum со значениями DelValue:

Код: vbnet
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
'===================================================================================
' Sub         : DelRows(TableHeader,ColNum,DelValue)
' TableHeader : Range; table header range
' ColNum      : Long; column number with DelValue
' DelValue    : Variant; value of rows to be deleted
'-------------+---------------------------------------------------------------------
' VBA call    : DelRows ActiveSheet.Range("A1:H1"), 5, 0
'-------------+---------------------------------------------------------------------
' Created     : ZVI:2009:12:26 http://www.sql.ru/forum/actualthread.aspx?tid=722758
'-----------------------------------------------------------------------------------
Sub DelRows(TableHeader As Range, ColNum As Long, DelValue)
  Dim Arr(), r&, rs&, cs&, i&, v, ac
  With TableHeader.CurrentRegion
    rs = .Rows.Count - TableHeader.Row + .Row
    cs = .Columns.Count - TableHeader.Column + .Column
  End With
  With TableHeader.Resize(rs, 1)
    Arr() = .Offset(, cs).Value
    ' Check DelValue
    For Each v In .Offset(, ColNum - 1).Value
      r = r + 1
      If v <> DelValue Then
        i = i + 1
        Arr(r, 1) = 1
      End If
    Next
    If i < rs Then
      ' Freeze on
      With Application
        .ScreenUpdating = False
        .EnableEvents = False
        ac = .Calculation: .Calculation = xlCalculationManual
      End With
      ' Delete rows with DelValue in ColNum
      .Offset(, cs) = Arr
      .Resize(, cs + 1).Sort .Cells(1).Offset(, cs), 1, Header:=xlNo
      .Resize(, 1).Offset(, cs).ClearContents
      .Resize(rs - i, cs).Offset(i).Clear   ' или .Resize(rs - i).Offset(i).EntireRow.Delete
      ' Freeze off
      With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = ac
      End With
    End If
  End With
End Sub



Тестирование:
Код: vbnet
1.
2.
3.
Sub Test()
  DelRows ActiveSheet.Range("A1:H1"), 5, 0
End Sub




Помогите подредактировать скрипт удаления, мне нужно удалить все строки с инициалами и все строки где отчество заканчивается на "ИЧ" т.е. мужчин. Каким я не въехал где здесь определяется критерий удаления.
Формат записей:
900939 КНЯЗЕВА АННА ЯКОВЛЕВНА
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37972003
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно не корректировать макрос... Можно даже использовать его самую первую версию.

Надо просто делать так: сначала в каком-нибудь одном столбце сформируйте с помощью формул некоторые значения, а затем уже примените DelRows к этому столбцу, указав значение, по которому нужно удалять...

Что же касается конкретной формулы для анализа ваших данных... Скажите, приведенный вами "пример формата" - это четыре столбца (поля) или два, или один? "Инициалы" - это что (одна буква, одна буква с точкой, как прописаны инициалы для неоднословных имён и отчеств)? Почему вы считаете, что только "ИЧ" в отчестве определяет мужчин (нет, конечно, "ич"=>муж, но муж<=>"ич", например, имя-отчество "Ариф Гора-Оглы")?
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37973172
Sallador
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,

Формат такой:


928596 | ШАЙКУЛОВА | АКТОТЫ | АЛИЕВНА | УЛ.ТЛЕНДИЕВА НУРГИСЫ | Д.40 | КВ.1 |

Эта база данных клиентов нужно выделить из неё только женщин, инициалы имееться ввиду например С. или просто одна буква, так же есть необходимость удалить строки где есть например пустая ячейка вместо адресса.

Если бы вы могли уточнить процедуру применения этого макроса
"сформируйте с помощью формул некоторые значения, а затем уже примените DelRows к этому столбцу, указав значение, по которому нужно удалять"
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #37973697
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так вам и надо тогда не "удалять мужчин" а "отобрать женщин"
Отчества у женщин заканчиваются на "НА". Остаются, правда, варианты - скажем "Мярьям Невретдин-кызы". Впрочем, тоже решаемые. Запишите формулу, например, в [J1]:
Код: vbnet
1.
=ЕСЛИ(ЕОШ(ПОИСК(ПРАВСИМВ(СЖПРОБЕЛЫ(D1);2);"НА ЗЫ"));0;1)

растяните на весь список - и удаляйте всех с нулём в столбце [J]
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #38021852
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если процедура разовая, то в Excel можно строки отфильтровать по условию, что значение оканчивается "ич" и удалить такие сроки.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
удаление строк в большом Ексель файле
    #39000037
vad-anatolij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Где я должен прописать DelRows в Екселе, что бы он видел эту функцию?
Через "Разработчик" зашел в "Просмотр кода" и воткнул код, изменив на

Public Function DelRows
...
End Function

Засунул в макрос DelRows и запустил, получил "саб или функция не определены" , выделено именно DelRows.
Ткните пожалуйста в ошибку.
Спасибо.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #39000049
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vad-anatolijТкните пожалуйста в ошибкуЧтобы "ткнуть", надо видеть весь проект. А то непонятно, что и куда Вы "воткнули", "засунули".
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #39000058
vad-anatolij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский,
код не менял ,поэтому предположил, что у меня обычная ошибка новичка (совсем не работаю в Ексель в VBA), где то не там прописал паблик функцию и Ексель просто ее не видит. Подробно:
В раздел "General" прописал
Код: vbnet
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
'===================================================================================
' Sub         : DelRows(TableHeader,ColNum,DelValue)
' TableHeader : Range; table header range
' ColNum      : Long; column number with DelValue
' DelValue    : Variant; value of rows to be deleted
'-------------+---------------------------------------------------------------------
' VBA call    : DelRows ActiveSheet.Range("A1:H1"), 5, 0
'-------------+---------------------------------------------------------------------
' Created     : ZVI:2009:12:26 http://www.sql.ru/forum/actualthread.aspx?tid=722758
'-----------------------------------------------------------------------------------
Public Function DelRows(TableHeader As Range, ColNum As Long, DelValue)
  Dim Arr(), r&, rs&, cs&, i&, v, ac
  With TableHeader.CurrentRegion
    rs = .Rows.Count - TableHeader.Row + .Row
    cs = .Columns.Count - TableHeader.Column + .Column
  End With
  With TableHeader.Resize(rs, 1)
    Arr() = .Offset(, cs).Value
    ' Check DelValue
    For Each v In .Offset(, ColNum - 1).Value
      r = r + 1
      If v <> DelValue Then
        i = i + 1
        Arr(r, 1) = 1
      End If
    Next
    If i < rs Then
      ' Freeze on
      With Application
        .ScreenUpdating = False
        .EnableEvents = False
        ac = .Calculation: .Calculation = xlCalculationManual
      End With
      ' Delete rows with DelValue in ColNum
      .Offset(, cs) = Arr
      .Resize(, cs + 1).Sort .Cells(1).Offset(, cs), 1, Header:=xlNo
      .Resize(, 1).Offset(, cs).ClearContents
      .Resize(rs - i, cs).Offset(i).Clear   ' или .Resize(rs - i).Offset(i).EntireRow.Delete
      ' Freeze off
      With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = ac
      End With
    End If
  End With
End Function



В Макрос, который находится в нужном файле Ексель вставил
Код: vbnet
1.
2.
3.
4.
Sub Макрос2()
'
DelRows ActiveSheet.Range("P:P"), 5, 0
End Sub



При запуске Макроса 2 выдает сообщение
Microsoft Visual Basic
---------------------------
Compile error:

Sub or Function not defined
---------------------------
ОК Справка
---------------------------

Спасибо.
...
Рейтинг: 0 / 0
удаление строк в большом Ексель файле
    #39000270
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vad-anatolijВ раздел "General" прописалВ раздел "General" какого модуля? Это должен быть обычный модуль (Insert - Module) в той же книге, не ЭтаКнига, не Лист1. Проще всего поместить процедуру рядом с Sub Test()
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / удаление строк в большом Ексель файле
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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