Страницы: 1 2 След.
RSS
Поиск повторяющихся значений и перенос их на другой лист (VBA)
 
Добрый день, уважаемые форумчане! В поиске есть аналогичные темы, но подходящего мне я не нашел. Суть проблемы: есть табличка ~200 тыс. строк на 60 столбцов. В столбце G - некий идентификатор id, он может быть уникальным, а может повторяться. Буду благодарен за помощь с помощью VBA найти и вырезать из данной таблицы строки с повторяющимися id и перенести их на другой лист.
Excel непознаваем как атом.
 
Возможно я не правильно понял задачу.... Но самый простой вариант
Выделяем столбец G, на вкладке Главная - выбираем условное форматирование ---> Правила выделения ячеек ---> Повторяющиеся значения (что бы все повторяющиеся ID подсвечивались)
Далее устанавливаем в столбце G фильтр ---> Фильтр по цвету ---> выбираем цвет повторения (красный по умолчанию).
Автоматом получили все повторяющиеся ID отфильтрованные, теперь мы просто их копируем и вставляем на другой лист.
Прошу простить, если не правильно понял задачу=)
C2-C4
 
Если нужен именно макрос, то делаем все тоже самое через макрорекодер (за исключением выделения ячеек отфильтрованных, для копирования).
Про копирование кратко написано в этой теме https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=47173
C2-C4
 
mtts54, здравствуйте!
Не совсем понятно, как переносить… Просто все дубли, как описал Михаил Комиссаров? Уточните в файле примере конечный результат…
Изменено: Jack Famous - 15.08.2018 11:14:43
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
С помощью доп.столбца. Файл положить в папку С:\1\, на таблице ПКМ-обновить.
Неизлечимых болезней нет, есть неизлечимые люди.
 
Михаил Комиссаров, автофильтр "видит" только 10 тыс. строк, поэтому этот прием не годится. Jack Famous, конечный результат в файле-примере таков: на Листе1 строк с подсвеченными id не должно быть - они должны появиться на другом, вставленном листе. В реальном файле из-за большого количества строк УФ неприменимо.
Excel непознаваем как атом.
 
TheBestOfTheBest, не совсем то, что необходимо: в Вашем решении одна из повторяющихся строк остается на исходном листе. Мне же нужно ВСЕ строки с повторяющимися id вырезать с исходного листа и вставить на другой лист. Честно говоря, я не понял, каким приемом Вы решили задачу. Спасибо за ответ.
Excel непознаваем как атом.
 
mtts54, пробуйте
Код на массивах
UPD (15:05): 14я строка кода Set rng = Cells(1, col).Resize(r+ 1, 1) исправлена на Set rng = Cells(2, col).Resize(r, 1). Файл заменён.
Изменено: Jack Famous - 15.08.2018 15:07:53
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
выполните этот макрос
Код
Sub RemoveDouble2NewSheet()
  Dim rg As Range: Set rg = Range(Cells(2, 7), Cells(Rows.Count, 7).End(xlUp))
  rg.Offset(0, 9).FormulaR1C1 = "=if(countif(r2c7:r" & rg.Rows.Count + 1 & "c7, rc7)>1,2,"""")"
  rg.Offset(0, 9).Value = rg.Offset(0, 9).Value
  Set rg = rg.Offset(0, 9).SpecialCells(xlCellTypeConstants, 1).EntireRow: Columns(16).Clear
  rg.Copy Worksheets.Add.Cells(1, 1):  rg.Delete: Columns(16).Clear
End Sub
при активном листе с данными
Изменено: Ігор Гончаренко - 15.08.2018 14:34:29
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
mtts54 написал:
Честно говоря, я не понял, каким приемом Вы решили задачу. Спасибо за ответ.
Внешний запрос (Данные-Получение внешних данных...). Измените формулу в столбце Ключ =СЧЁТЕСЛИ($G$2:$G$348;G2), обновите таблицы как указано выше.
Изменено: TheBestOfTheBest - 15.08.2018 14:40:31
Неизлечимых болезней нет, есть неизлечимые люди.
 
вариант макроса(не нашел как надо в исходном файл -примере),кнопки unic и очистка,лист1 добавлен вручную
 
Код
Sub unic()
     Dim i&, m&, j&, z, z1: z = Range("A2:O" & Range("A" & Rows.Count).End(xlUp).Row).Value
     ReDim z1(1 To UBound(z), 1 To UBound(z, 2))
 With CreateObject("scripting.dictionary"): .CompareMode = 1
 For i = 1 To UBound(z): .Item(z(i, 7)) = .Item(z(i, 7)) + 1: Next
 For i = 1 To UBound(z)
 If .Item(z(i, 7)) > 1 Then
   m = m + 1: For j = 1 To UBound(z, 2): z1(m, j) = z(i, j): Next
 End If
 Next
 Sheets("Лист1").Range("A1").Resize(m, UBound(z1, 2)).Value = z1
End With
End Sub
Изменено: кузя1972 - 15.08.2018 16:37:30
 
Коллеги, спасибо за ответы. Сегодня тестировать некогда (комп занят расчетами), отпишусь завтра.
Excel непознаваем как атом.
 
mtts54, мы ждём (ну я точно жду фидбэк)  :D
Изменено: Jack Famous - 16.08.2018 10:15:51
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Вариант на массивах и словарях
Скрытый текст
"Все гениальное просто, а все простое гениально!!!"
 
Добрый день! Протестировал макрос от Ігор Гончаренко на реальном файле размером 31 колонка на 153 тыс.строк. В макросе в выражениях Offset(0, 9) заменил 9 на 25 и в Columns(16)  заменил 16 на 32. Макрос работал ок. 10 минут, нашел все 7696 повторов. Хотелось бы побыстрее, но... размер имеет значение. Спасибо! Остальные решения протестирую завтра.
Excel непознаваем как атом.
 
Попробовал на том же реальном файле макрос от Jack Famous. К сожалению, макрос где-то зациклился и после 20 минут ожидания я был вынужден остановить его выполнение :(  
Excel непознаваем как атом.
 
mtts54, немного изменил принцип удаления строк из исходника — пробуйте
КОД
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
На том же реальном файле макрос Nordheim за 2 секунды нашел все повторы, вставил лист и скопировал повторы туда (правда, пару раз VBA ругнулся: не была объявлена переменная sht1 - это я поправил).  Но с исходного листа макрос повторы не удалил  :( . Тут я ничего поделать не смог  :cry:  . Очень надеюсь, что уважаемый  Nordheim  прочтет этот пост и подправит код :oops:  
Excel непознаваем как атом.
 
mtts54, вы бы выложили ссылку на файл реального объёма, но без конфиденциальных данных — тестить проще было бы
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
В данном коде есть нюанс, таблица должна начинаться со второй строки, шапка таблицы на первой

Код
Option Explicit

 
Sub test()
'   ----------------------------------------------
    Dim dic As Object, ikey, rng As Range
    Dim i&, arr(), txt$, j%, x&, sht As Worksheet
'   ----------------------------------------------
    Application.DisplayAlerts = False
    Set dic = CreateObject("Scripting.Dictionary")
    On Error Resume Next
    Set sht = ThisWorkbook.Worksheets("Дубли")
    If Not sht Is Nothing Then sht.Delete
    On Error GoTo 0
    arr = sht1.UsedRange.Value
    For i = 2 To UBound(arr)
        txt = arr(i, 7)
        dic.Item(txt) = dic.Item(txt) + 1
    Next i
    For Each ikey In dic.Keys
        If dic.Item(ikey) = 1 Then dic.Remove (ikey)
    Next ikey
    x = 1
    For i = 1 To UBound(arr)
        txt = arr(i, 7)
        If dic.Exists(txt) Then
            If rng Is Nothing Then Set rng = sht1.Rows(i) Else Set rng = Union(rng, sht1.Rows(i))
            x = x + 1
            For j = 1 To UBound(arr, 2)
                arr(x, j) = arr(i, j)
            Next j
        End If
    Next i
    Set sht = ThisWorkbook.Worksheets.Add(after:=sht1)
    With sht
        .[a1].Resize(x, UBound(arr, 2)) = arr
        .Name = "Дубли"
        .Columns.AutoFit
    End With
    If Not rng Is Nothing Then rng.Delete
    Application.DisplayAlerts = True
End Sub
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim,  
Определите sht1    
Код
  Set sht1 = ThisWorkbook.Worksheets("Пример на форум")
при формировании листа Дубли я бы добавил первой строку
Код
.Range("K2:K" & x).NumberFormat = "@"
Изменено: Kuzmich - 17.08.2018 12:48:30
 
Jack Famous ссылка на файл:   http://transfiles.ru/1z0ih
Excel непознаваем как атом.
 
Я вижу,что нужен макрос. Но предложу другое решение. Надстройка PowerQuery. Выделить таблицу Ctrl+T, с заголовками.PowerQuery-->Из таблицы,диапазона.Главная-->Сохранять строки-->Сохранять дубликаты.Выгрузить.Готово)
 
Цитата
Kuzmich написал:
Определите sht1
sht1 в файле это название листа в VBAProject, поэтому лист не объявлен, на кириллице неудобно было писать, поэтому переименовал по ходу написания кода
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Kuzmich написал:
при формировании листа Дубли я бы добавил первой строку
С какой целью?
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim,  макрос (с учетом от Kuzmich) отработал немного дольше (это абсолютно не критично), повторы с исходного листа удалил. Спасибо!
kryptonets, нужен именно макрос, т.к. таблица обрабатывается макросом (моим) и прерывать его для ручной работы неудобно. Тем не менее попробую Вашу идею - лишних знаний ведь не бывает, когда-нибудь пригодится. Спасибо.
Excel непознаваем как атом.
 
Nordheim, написал
Цитата
С какой целью?
Просто на листе Дубли в столбце К появляются ячейки с янв.92 вместо 1-92
Изменено: Kuzmich - 17.08.2018 13:17:18
 
Цитата
Kuzmich написал:
Просто на листе Дули в столбце К появляются ячейки с янв.92 вместо 1-92
А строка зачем?
"Все гениальное просто, а все простое гениально!!!"
 
Я имел в виду этот кусок макроса
Код
    With sht
        .Range("K2:K" & x).NumberFormat = "@"
        .[a1].Resize(x, UBound(arr, 2)) = arr
        .Name = "Дубли"
        .Columns.AutoFit
    End With
Чтобы не было преобразования в дату
 
Наверно так более правильно.
Код
Sub test()
'   ----------------------------------------------
    Dim dic As Object, ikey, rng As Range, sht1 As Worksheet
    Dim i&, arr(), txt$, j%, x&, sht As Worksheet
'   ----------------------------------------------
    Application.DisplayAlerts = False
    Set dic = CreateObject("Scripting.Dictionary")
    On Error Resume Next
    Set sht = ThisWorkbook.Worksheets("Дубли")
    If Not sht Is Nothing Then sht.Delete
    On Error GoTo 0
    Set sht1 = Worksheets("имя листа")
    arr = sht1.UsedRange.Value
    For i = 2 To UBound(arr)
        txt = arr(i, 7)
        dic.Item(txt) = dic.Item(txt) + 1
    Next i
    For Each ikey In dic.Keys
        If dic.Item(ikey) = 1 Then dic.Remove (ikey)
    Next ikey
    x = 1
    For i = 1 To UBound(arr)
        txt = arr(i, 7)
        If dic.Exists(txt) Then
            If rng Is Nothing Then Set rng = sht1.Rows(i) Else Set rng = Union(rng, sht1.Rows(i))
            x = x + 1
            For j = 1 To UBound(arr, 2)
                arr(x, j) = arr(i, j)
            Next j
        End If
    Next i
    Set sht = ThisWorkbook.Worksheets.Add(after:=sht1)
    With sht
       .Range("K2:K" & x).NumberFormat = "@"
       .[a1].Resize(x, UBound(arr, 2)).Value = arr
        End With
        .Name = "Дубли"
        .Columns.AutoFit
    End With
    If Not rng Is Nothing Then rng.Delete
    Application.DisplayAlerts = True
End Sub
Изменено: Nordheim - 17.08.2018 13:25:52
"Все гениальное просто, а все простое гениально!!!"
Страницы: 1 2 След.
Наверх