powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / удаление строк в большом Ексель файле
25 сообщений из 35, страница 1 из 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
25 сообщений из 35, страница 1 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / удаление строк в большом Ексель файле
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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