Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Удаление строк в больших таблицах - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Удаление строк в больших таблицах
Voh Дата: Воскресенье, 24.02.2013, 12:47 | Сообщение № 21
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

В таблице более 2500 строк пока, удаляется в зависимости от условий каждый раз разное количество,
я тестировал на удаление 2490 строк..
 
Ответить
СообщениеВ таблице более 2500 строк пока, удаляется в зависимости от условий каждый раз разное количество,
я тестировал на удаление 2490 строк..

Автор - Voh
Дата добавления - 24.02.2013 в 12:47
Voh Дата: Воскресенье, 24.02.2013, 13:19 | Сообщение № 22
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Цитата (AlexM)
В файле примере не удаляет цветные строки


Все, теперь цвта заливки тоже начал находить!
В коде AlexM просто заменил:
[vba]
Код
Interior.ColorIndex
[/vba]

на:
[vba]
Код
Interior.Color
[/vba]

Остается решить главную задачу:
Цитата (Hugo)
сделать удаление очень быстро
smile sad
 
Ответить
Сообщение
Цитата (AlexM)
В файле примере не удаляет цветные строки


Все, теперь цвта заливки тоже начал находить!
В коде AlexM просто заменил:
[vba]
Код
Interior.ColorIndex
[/vba]

на:
[vba]
Код
Interior.Color
[/vba]

Остается решить главную задачу:
Цитата (Hugo)
сделать удаление очень быстро
smile sad

Автор - Voh
Дата добавления - 24.02.2013 в 13:19
Hugo Дата: Воскресенье, 24.02.2013, 13:23 | Сообщение № 23
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Возможно ускорит отключение пересчёта, если там на листе есть формулы.
Но я бы делал удаление всех строк одним действием - т.е. сперва весь анализ, пометки в массив, его выгружаем на лист, затем удаление сразу всего помеченного.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеВозможно ускорит отключение пересчёта, если там на листе есть формулы.
Но я бы делал удаление всех строк одним действием - т.е. сперва весь анализ, пометки в массив, его выгружаем на лист, затем удаление сразу всего помеченного.

Автор - Hugo
Дата добавления - 24.02.2013 в 13:23
Hugo Дата: Воскресенье, 24.02.2013, 13:45 | Сообщение № 24
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Вот, потестите. На базе кода shanemac51
Чтоб ускорить анализ - цвет проверяю только у тех, у кого не 0 smile
[vba]
Код
Sub Macros4()
''обычно удаление идет с хвоста
      Dim tm!
      tm = Timer
      Application.ScreenUpdating = False
      Dim a(), i As Long, strS As String
      i = Range("F" & Rows.Count).End(xlUp).Row
      a = Range("F1:F" & i).Value
      ReDim b(1 To i, 1 To 1)

      'анализ=======================
      Do While i > 24
          If a(i, 1) = 0 Then
              b(i, 1) = 1
          Else
              If Cells(i, 6).Interior.ColorIndex = 48 Then
                  b(i, 1) = 1
              End If
          End If
          i = i - 1
      Loop

      'удаление====================
      Dim x As Range
      Rows.Hidden = False    'на всякий случай, чтоб никто не спрятался
      [t1].Resize(UBound(b)) = b
      Set x = [T:T].Find(1, , , xlWhole)
      If Not x Is Nothing Then
          [T:T].ColumnDifferences(x).EntireRow.Hidden = True
          ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete
          Rows.Hidden = False
      End If

      Application.ScreenUpdating = True
      Debug.Print "Строки удалены за " & Timer - tm & " сек"
End Sub
[/vba]


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеВот, потестите. На базе кода shanemac51
Чтоб ускорить анализ - цвет проверяю только у тех, у кого не 0 smile
[vba]
Код
Sub Macros4()
''обычно удаление идет с хвоста
      Dim tm!
      tm = Timer
      Application.ScreenUpdating = False
      Dim a(), i As Long, strS As String
      i = Range("F" & Rows.Count).End(xlUp).Row
      a = Range("F1:F" & i).Value
      ReDim b(1 To i, 1 To 1)

      'анализ=======================
      Do While i > 24
          If a(i, 1) = 0 Then
              b(i, 1) = 1
          Else
              If Cells(i, 6).Interior.ColorIndex = 48 Then
                  b(i, 1) = 1
              End If
          End If
          i = i - 1
      Loop

      'удаление====================
      Dim x As Range
      Rows.Hidden = False    'на всякий случай, чтоб никто не спрятался
      [t1].Resize(UBound(b)) = b
      Set x = [T:T].Find(1, , , xlWhole)
      If Not x Is Nothing Then
          [T:T].ColumnDifferences(x).EntireRow.Hidden = True
          ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete
          Rows.Hidden = False
      End If

      Application.ScreenUpdating = True
      Debug.Print "Строки удалены за " & Timer - tm & " сек"
End Sub
[/vba]

Автор - Hugo
Дата добавления - 24.02.2013 в 13:45
Hugo Дата: Воскресенье, 24.02.2013, 14:38 | Сообщение № 25
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Или так - чуть дольше, но зато на один массив меньше (меньше расход памяти):
[vba]
Код
Sub Macros5()
     Dim tm!: tm = Timer
     Dim a(), i As Long, t As Long

     t = Range("F" & Rows.Count).End(xlUp).Row
     a = Range("F1:F" & t).Value

     'анализ=======================
     For i = 24 To t
         If a(i, 1) = 0 Then
             a(i, 1) = "todel"
         Else
             If Cells(i, 6).Interior.ColorIndex = 15 Then a(i, 1) = "todel"
         End If
     Next
      
     'удаление====================
     Dim x As Range: Rows.Hidden = False    'на всякий случай, чтоб никто не спрятался
     Application.ScreenUpdating = False: [t1].Resize(t) = a: Set x = [T:T].Find("todel", , , xlWhole)
     If Not x Is Nothing Then
         [T:T].ColumnDifferences(x).EntireRow.Hidden = True
         ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete
         Rows.Hidden = False
     End If
     [T:T].ClearContents: Application.ScreenUpdating = True
     Debug.Print "Строки удалены за " & Timer - tm & " сек"
End Sub
[/vba]


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеИли так - чуть дольше, но зато на один массив меньше (меньше расход памяти):
[vba]
Код
Sub Macros5()
     Dim tm!: tm = Timer
     Dim a(), i As Long, t As Long

     t = Range("F" & Rows.Count).End(xlUp).Row
     a = Range("F1:F" & t).Value

     'анализ=======================
     For i = 24 To t
         If a(i, 1) = 0 Then
             a(i, 1) = "todel"
         Else
             If Cells(i, 6).Interior.ColorIndex = 15 Then a(i, 1) = "todel"
         End If
     Next
      
     'удаление====================
     Dim x As Range: Rows.Hidden = False    'на всякий случай, чтоб никто не спрятался
     Application.ScreenUpdating = False: [t1].Resize(t) = a: Set x = [T:T].Find("todel", , , xlWhole)
     If Not x Is Nothing Then
         [T:T].ColumnDifferences(x).EntireRow.Hidden = True
         ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete
         Rows.Hidden = False
     End If
     [T:T].ClearContents: Application.ScreenUpdating = True
     Debug.Print "Строки удалены за " & Timer - tm & " сек"
End Sub
[/vba]

Автор - Hugo
Дата добавления - 24.02.2013 в 14:38
Michael_S Дата: Воскресенье, 24.02.2013, 14:54 | Сообщение № 26
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Почему вы все пишите Interior.ColorIndex = 48, если в примере Пост1 Interior.ColorIndex = 15?
 
Ответить
СообщениеПочему вы все пишите Interior.ColorIndex = 48, если в примере Пост1 Interior.ColorIndex = 15?

Автор - Michael_S
Дата добавления - 24.02.2013 в 14:54
Hugo Дата: Воскресенье, 24.02.2013, 15:00 | Сообщение № 27
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Глазастый Михаил smile
А и впрямь... Я внимания не обратил - удаляет эти строки т.к. там пусто, и ладно smile
Да, вместо 48 нужно писать 15!


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеГлазастый Михаил smile
А и впрямь... Я внимания не обратил - удаляет эти строки т.к. там пусто, и ладно smile
Да, вместо 48 нужно писать 15!

Автор - Hugo
Дата добавления - 24.02.2013 в 15:00
Michael_S Дата: Воскресенье, 24.02.2013, 15:14 | Сообщение № 28
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Цитата (Hugo)
Да, вместо 48 нужно писать 15!
Но в этом случае удалит не только светло-серые строки, но и светло-коричневые (59 - аксессуары и 65 - услуги), а это надо? колориндес у них одинаковый, а колЕр - разный. cool
 
Ответить
Сообщение
Цитата (Hugo)
Да, вместо 48 нужно писать 15!
Но в этом случае удалит не только светло-серые строки, но и светло-коричневые (59 - аксессуары и 65 - услуги), а это надо? колориндес у них одинаковый, а колЕр - разный. cool

Автор - Michael_S
Дата добавления - 24.02.2013 в 15:14
AlexM Дата: Воскресенье, 24.02.2013, 15:14 | Сообщение № 29
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4517
Репутация: 1129 ±
Замечаний: 0% ±

Excel 2003
Цитата (Michael_S)
Почему вы все пишите Interior.ColorIndex = 48

Это я виноват
Но я не вижу в первом посте Interior.ColorIndex = 15
в файле строка фильтра
[vba]
Код
Selection.AutoFilter field:=6, Criteria1:=RGB(191, 191, 191), Operator:=xlFilterCellColor
[/vba]
А так как удалять надо было строки с 0 в столбце F и если там цвет серый. У меня этот серый определился с индексом 48.



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.
 
Ответить
Сообщение
Цитата (Michael_S)
Почему вы все пишите Interior.ColorIndex = 48

Это я виноват
Но я не вижу в первом посте Interior.ColorIndex = 15
в файле строка фильтра
[vba]
Код
Selection.AutoFilter field:=6, Criteria1:=RGB(191, 191, 191), Operator:=xlFilterCellColor
[/vba]
А так как удалять надо было строки с 0 в столбце F и если там цвет серый. У меня этот серый определился с индексом 48.

Автор - AlexM
Дата добавления - 24.02.2013 в 15:14
Hugo Дата: Воскресенье, 24.02.2013, 15:38 | Сообщение № 30
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Ну в общем это непринципиально smile


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНу в общем это непринципиально smile

Автор - Hugo
Дата добавления - 24.02.2013 в 15:38
Voh Дата: Воскресенье, 24.02.2013, 16:16 | Сообщение № 31
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Цитата (Hugo)
Ну в общем это непринципиально

Да, я все-равно в код вставлял не Interior.ColorIndex = 15, а Interior.Color = RGB(191, 191, 191),
пока, благодаря Michael_S не обнаружил, что первый вариант (Interior.ColorIndex = 15) работает значительно шустрее!!
Спасибо Michael_S !
А чтобы не удалялись какие-нибудь нужные строки, пришлось в условии все-таки поменять критерий 0 на "0".
Так работает медленнее, примерно секунд 15 вычисляет, но оставляет серые строки, в которых есть какой-то текст, а в столбце "F" пусто, что и надо сделать.
Если оставить критерий 0, то
Цитата (Michael_S)
удалит не только светло-серые строки, но и светло-коричневые


Правда есть мысль отказаться от поиска по цвету, оставить критерий 0, но в столбцах "F", которые не надо удалять спрятать например "-" мелко-мелко..)
Не нравится только отсутствие изящности решения.
Зато макрос работает около 5 сек, то, что надо! Спасибо Hugo за макрос! А также shanemac51 за идею, и конечно же AlexM спасибо большое!
 
Ответить
Сообщение
Цитата (Hugo)
Ну в общем это непринципиально

Да, я все-равно в код вставлял не Interior.ColorIndex = 15, а Interior.Color = RGB(191, 191, 191),
пока, благодаря Michael_S не обнаружил, что первый вариант (Interior.ColorIndex = 15) работает значительно шустрее!!
Спасибо Michael_S !
А чтобы не удалялись какие-нибудь нужные строки, пришлось в условии все-таки поменять критерий 0 на "0".
Так работает медленнее, примерно секунд 15 вычисляет, но оставляет серые строки, в которых есть какой-то текст, а в столбце "F" пусто, что и надо сделать.
Если оставить критерий 0, то
Цитата (Michael_S)
удалит не только светло-серые строки, но и светло-коричневые


Правда есть мысль отказаться от поиска по цвету, оставить критерий 0, но в столбцах "F", которые не надо удалять спрятать например "-" мелко-мелко..)
Не нравится только отсутствие изящности решения.
Зато макрос работает около 5 сек, то, что надо! Спасибо Hugo за макрос! А также shanemac51 за идею, и конечно же AlexM спасибо большое!

Автор - Voh
Дата добавления - 24.02.2013 в 16:16
Hugo Дата: Воскресенье, 24.02.2013, 17:25 | Сообщение № 32
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Упс, я там последний код не так запостил - сейчас подправлю...
Перепутал коды - там если использовать исходный массив, то нельзя ставить единицы!
Метка должна быть такой, какая не может встретиться в столбце.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеУпс, я там последний код не так запостил - сейчас подправлю...
Перепутал коды - там если использовать исходный массив, то нельзя ставить единицы!
Метка должна быть такой, какая не может встретиться в столбце.

Автор - Hugo
Дата добавления - 24.02.2013 в 17:25
Michael_S Дата: Воскресенье, 24.02.2013, 17:37 | Сообщение № 33
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Цитата (Voh)
Правда есть мысль отказаться от поиска по цвету,

А кто и по какому критерию раскрашивает строки?
 
Ответить
Сообщение
Цитата (Voh)
Правда есть мысль отказаться от поиска по цвету,

А кто и по какому критерию раскрашивает строки?

Автор - Michael_S
Дата добавления - 24.02.2013 в 17:37
Voh Дата: Воскресенье, 24.02.2013, 17:48 | Сообщение № 34
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Цитата (Michael_S)
А кто и по какому критерию раскрашивает строки?

Они раскрашены вручную для контрастности, удобства визуального восприятия,
но цвета едины во всех подобных файлах, которых много и раскрашены уже очень давно,
пользователи успели привыкнуть.
 
Ответить
Сообщение
Цитата (Michael_S)
А кто и по какому критерию раскрашивает строки?

Они раскрашены вручную для контрастности, удобства визуального восприятия,
но цвета едины во всех подобных файлах, которых много и раскрашены уже очень давно,
пользователи успели привыкнуть.

Автор - Voh
Дата добавления - 24.02.2013 в 17:48
nilem Дата: Воскресенье, 24.02.2013, 18:11 | Сообщение № 35
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Цитата (Hugo)
[T:T].ColumnDifferences(x).EntireRow.Hidden = True
ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete

просто для интереса, почему нельзя одной строчкой
[vba]
Код
[T:T].ColumnDifferences(x).EntireRow.Delete
[/vba]
или
[vba]
Код
[T:T].SpecialCells(2, 2).EntireRow.Delete
[/vba]
(для 1-го случая, видимо, массив а() немного дополнить придется)


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Воскресенье, 24.02.2013, 18:13
 
Ответить
Сообщение
Цитата (Hugo)
[T:T].ColumnDifferences(x).EntireRow.Hidden = True
ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete

просто для интереса, почему нельзя одной строчкой
[vba]
Код
[T:T].ColumnDifferences(x).EntireRow.Delete
[/vba]
или
[vba]
Код
[T:T].SpecialCells(2, 2).EntireRow.Delete
[/vba]
(для 1-го случая, видимо, массив а() немного дополнить придется)

Автор - nilem
Дата добавления - 24.02.2013 в 18:11
Hugo Дата: Воскресенье, 24.02.2013, 18:17 | Сообщение № 36
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Если поставить метки в те строки, которые нужно оставить - то можно smile
Но вообще конечно и тут возможны варианты - например использовать формулы и удалять их. Или формулы с ошибками - и удалять такие строки. Но это дольше.
Или выгружать массив b() с константами и удалять строки с константами. Будет код на одну строку короче.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеЕсли поставить метки в те строки, которые нужно оставить - то можно smile
Но вообще конечно и тут возможны варианты - например использовать формулы и удалять их. Или формулы с ошибками - и удалять такие строки. Но это дольше.
Или выгружать массив b() с константами и удалять строки с константами. Будет код на одну строку короче.

Автор - Hugo
Дата добавления - 24.02.2013 в 18:17
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!