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

Вход

Регистрация

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

 

= Мир MS Excel/Поиск дубликатов и удаление лишних данных - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск дубликатов и удаление лишних данных (Макросы/Sub)
Поиск дубликатов и удаление лишних данных
Andrius Дата: Вторник, 14.03.2017, 22:38 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Привет форумчанам и знатокам Экселя!
Требуется скрипт-макрос, для нахождения дублированных строк, делать их уникальными и удалять не попавшие в дубликат.
В моём примере (файле), есть лист куда собирается вся стата. Иногда есть повторения данных.
Требуется по столбцам Данные 1 и Данные 2 , находить эти повторяющиеся строки, делать их уникальными ( то есть в виде одной строки), а остальные не совпавшие данные, удаляются.
В примере получается, что должны остаться 5 строк с фамилиями ( Петров, Иванов,, Зайцев,Морозов и Сидоров).
Оставшиеся уникальные данные ( после нажатия кнопки), остаются в той же таблице и никуда переносить НЕ надо.

P.S. Кнопку сделал для прикрепления Скрипт-Макроса.
P.S.S. Работа с фильтрами не устраивает. Требуется именно макрос.
К сообщению приложен файл: 4807182.xls (30.0 Kb)


Сообщение отредактировал Andrius - Вторник, 14.03.2017, 23:26
 
Ответить
СообщениеПривет форумчанам и знатокам Экселя!
Требуется скрипт-макрос, для нахождения дублированных строк, делать их уникальными и удалять не попавшие в дубликат.
В моём примере (файле), есть лист куда собирается вся стата. Иногда есть повторения данных.
Требуется по столбцам Данные 1 и Данные 2 , находить эти повторяющиеся строки, делать их уникальными ( то есть в виде одной строки), а остальные не совпавшие данные, удаляются.
В примере получается, что должны остаться 5 строк с фамилиями ( Петров, Иванов,, Зайцев,Морозов и Сидоров).
Оставшиеся уникальные данные ( после нажатия кнопки), остаются в той же таблице и никуда переносить НЕ надо.

P.S. Кнопку сделал для прикрепления Скрипт-Макроса.
P.S.S. Работа с фильтрами не устраивает. Требуется именно макрос.

Автор - Andrius
Дата добавления - 14.03.2017 в 22:38
ant6729 Дата: Вторник, 14.03.2017, 23:54 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
Не попавшие в дубликат...

Это нужно вставить в окно, нажав alt + f11 и сохранить

Потом зайти в макросы и нажать.

[vba]
Код


Sub 567()
'

'
    Range("H1").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("H2").Select
    ActiveCell.FormulaR1C1 = "=RC[-5]&RC[-4]"
    Range("H2").Select
    Selection.AutoFill Destination:=Range("H2:H1000")
    Range("H2:H16").Select
    Range("H16").Select
    Selection.AutoFill Destination:=Range("H16:H119"), Type:=xlFillDefault
    Range("H16:H1000").Select
    Columns("H:H").Select
    Selection.FormatConditions.AddUniqueValues
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Selection.FormatConditions(1).DupeUnique = xlDuplicate
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Rows("2:1000").Select
   
    Range("A1:H1").Select
    Range("H1").Activate
    Selection.AutoFilter
    
    Rows("2:1000").Select
  
    ActiveSheet.Range("$A$1:$H$1000").AutoFilter Field:=8, Operator:= _
        xlFilterNoFill
    Selection.Delete Shift:=xlUp
     Selection.Delete Shift:=xlUp
      Selection.Delete Shift:=xlUp
   
    ActiveSheet.Range("$A$1:$H$114").AutoFilter Field:=8
    Columns("H:H").Select
    Selection.Delete Shift:=xlToLeft
    Rows("1:1").Select
    Selection.AutoFilter
  
    End Sub

[/vba]

Очередной монстр... только кнопочку в верхнюю строчку переместите...

Когда я уже на языке писать и соображать начну... не знаю...


Сообщение отредактировал ant6729 - Среда, 15.03.2017, 00:16
 
Ответить
СообщениеНе попавшие в дубликат...

Это нужно вставить в окно, нажав alt + f11 и сохранить

Потом зайти в макросы и нажать.

[vba]
Код


Sub 567()
'

'
    Range("H1").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("H2").Select
    ActiveCell.FormulaR1C1 = "=RC[-5]&RC[-4]"
    Range("H2").Select
    Selection.AutoFill Destination:=Range("H2:H1000")
    Range("H2:H16").Select
    Range("H16").Select
    Selection.AutoFill Destination:=Range("H16:H119"), Type:=xlFillDefault
    Range("H16:H1000").Select
    Columns("H:H").Select
    Selection.FormatConditions.AddUniqueValues
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Selection.FormatConditions(1).DupeUnique = xlDuplicate
    With Selection.FormatConditions(1).Font
        .Color = -16383844
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13551615
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Rows("2:1000").Select
   
    Range("A1:H1").Select
    Range("H1").Activate
    Selection.AutoFilter
    
    Rows("2:1000").Select
  
    ActiveSheet.Range("$A$1:$H$1000").AutoFilter Field:=8, Operator:= _
        xlFilterNoFill
    Selection.Delete Shift:=xlUp
     Selection.Delete Shift:=xlUp
      Selection.Delete Shift:=xlUp
   
    ActiveSheet.Range("$A$1:$H$114").AutoFilter Field:=8
    Columns("H:H").Select
    Selection.Delete Shift:=xlToLeft
    Rows("1:1").Select
    Selection.AutoFilter
  
    End Sub

[/vba]

Очередной монстр... только кнопочку в верхнюю строчку переместите...

Когда я уже на языке писать и соображать начну... не знаю...

Автор - ant6729
Дата добавления - 14.03.2017 в 23:54
Andrius Дата: Среда, 15.03.2017, 00:11 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
ant6729, я имел в виду, что данные которые НЕ имеют повторения, УДАЛЯЮТСЯ из таблицы. Возможно не корректно сформулировал концовку действий в задаче. Признаю.
 
Ответить
Сообщениеant6729, я имел в виду, что данные которые НЕ имеют повторения, УДАЛЯЮТСЯ из таблицы. Возможно не корректно сформулировал концовку действий в задаче. Признаю.

Автор - Andrius
Дата добавления - 15.03.2017 в 00:11
Andrius Дата: Среда, 15.03.2017, 00:44 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
ant6729, спасибо вам большое за скрипт-макрос! Но он решил половину поставленной задачи. А именно, удалил данные НЕ имевшие совпадений.
Теперь после применения вашего Макроса, остались дублированные (парные) данные. Осталось эти дубликат-данные сделать уникальными,то есть превратить в одну строчку. Всего в итоге должно остаться 5 строчек (фамилий).
Но направление решение задачи у вас правильное. И вы гигант ума, что смогли создать такой сложный скрипт.
Надеюсь у вас получится дописать к нему финальные скрипты.
 
Ответить
Сообщение ant6729, спасибо вам большое за скрипт-макрос! Но он решил половину поставленной задачи. А именно, удалил данные НЕ имевшие совпадений.
Теперь после применения вашего Макроса, остались дублированные (парные) данные. Осталось эти дубликат-данные сделать уникальными,то есть превратить в одну строчку. Всего в итоге должно остаться 5 строчек (фамилий).
Но направление решение задачи у вас правильное. И вы гигант ума, что смогли создать такой сложный скрипт.
Надеюсь у вас получится дописать к нему финальные скрипты.

Автор - Andrius
Дата добавления - 15.03.2017 в 00:44
K-SerJC Дата: Среда, 15.03.2017, 10:53 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
если правильно понял, то вот:
[vba]
Код
Sub sort()
Dim wb, sh, lr, f, arr(2) As Collection, k, str, t
wb = ThisWorkbook.Name
sh = ThisWorkbook.ActiveSheet.Name
lr = Workbooks(wb).Sheets(sh).Cells(Rows.Count, 1).End(xlUp).Row
Set arr(0) = New Collection
For f = lr To 2 Step -1
For k = 2 To f
Set arr(1) = New Collection
Set arr(2) = New Collection
arr(1).Add Workbooks(wb).Sheets(sh).Rows(f).Value
arr(2).Add Workbooks(wb).Sheets(sh).Rows(k).Value
If ср(arr(1).Item(1), arr(2).Item(1)) = True Then
fl = 0
For t = 1 To arr(0).Count
If ср(arr(1).Item(1), arr(0).Item(t)) = True Then fl = 1
Next t
If fl = 0 Then arr(0).Add ActiveSheet.Rows(f).Value
End If
Next k
Next f
str = 2 & ":" & lr
ActiveSheet.Rows(str).Clear
For f = 2 To arr(0).Count + 1
Workbooks(wb).Sheets(sh).Rows(f).Value = arr(0).Item(f - 1)
Next f
End Sub
Function ср(ar1, ar2) As Boolean
For t = 1 To 256
If ar1(1, t) <> ar2(1, t) Then Exit Function
Next t
ср = True
End Function
[/vba]
К сообщению приложен файл: Andrius.xls (51.0 Kb)


Благими намерениями выстелена дорога в АД.
 
Ответить
Сообщениеесли правильно понял, то вот:
[vba]
Код
Sub sort()
Dim wb, sh, lr, f, arr(2) As Collection, k, str, t
wb = ThisWorkbook.Name
sh = ThisWorkbook.ActiveSheet.Name
lr = Workbooks(wb).Sheets(sh).Cells(Rows.Count, 1).End(xlUp).Row
Set arr(0) = New Collection
For f = lr To 2 Step -1
For k = 2 To f
Set arr(1) = New Collection
Set arr(2) = New Collection
arr(1).Add Workbooks(wb).Sheets(sh).Rows(f).Value
arr(2).Add Workbooks(wb).Sheets(sh).Rows(k).Value
If ср(arr(1).Item(1), arr(2).Item(1)) = True Then
fl = 0
For t = 1 To arr(0).Count
If ср(arr(1).Item(1), arr(0).Item(t)) = True Then fl = 1
Next t
If fl = 0 Then arr(0).Add ActiveSheet.Rows(f).Value
End If
Next k
Next f
str = 2 & ":" & lr
ActiveSheet.Rows(str).Clear
For f = 2 To arr(0).Count + 1
Workbooks(wb).Sheets(sh).Rows(f).Value = arr(0).Item(f - 1)
Next f
End Sub
Function ср(ar1, ar2) As Boolean
For t = 1 To 256
If ar1(1, t) <> ar2(1, t) Then Exit Function
Next t
ср = True
End Function
[/vba]

Автор - K-SerJC
Дата добавления - 15.03.2017 в 10:53
Perfect2You Дата: Среда, 15.03.2017, 10:56 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Скрипт короче, но должен работать шустро на любом наборе данных (даже очень большом)
[vba]
Код
Sub unic()
Dim strMax As Long, strOk As Long, cOl1 As Long, cOl2 As Long
Dim rN As Range, letT1 As String, letT2 As String
cOl1 = 3
cOl2 = 4
letT1 = Mid(Columns(cOl1).Address, 2, InStr(1, Columns(cOl1).Address, ":") - 2)
letT2 = Mid(Columns(cOl2).Address, 2, InStr(1, Columns(cOl2).Address, ":") - 2)
strMax = Application.Max(Cells(Rows.Count, cOl1).End(xlUp).Row, Cells(Rows.Count, cOl2).End(xlUp).Row)
If strMax < 3 Then Exit Sub
For strOk = 2 To strMax - 1
    If Evaluate("=SUMPRODUCT((" & letT1 & strOk & "=" & letT1 & (strOk + 1) & ":" & letT1 & strMax & ")*(" & letT2 & strOk & "=" & letT2 & (strOk + 1) & ":" & letT2 & strMax & "))") = 0 Then
        If rN Is Nothing Then
            Set rN = Cells(strOk, cOl1)
        Else
            Set rN = Union(rN, Cells(strOk, cOl1))
        End If
    End If
Next strOk
Set rN = Union(rN, Cells(strMax, cOl1))
rN.EntireRow.Delete Shift:=xlUp
End Sub
[/vba]

Дубликаты проверяет по обоим полям одновременно, то есть Петров Улица1 и Петров Улица2 дубликатами считать не будет, хоть Петров и там, и там.
К сообщению приложен файл: _4807182.xls (33.0 Kb)


Сообщение отредактировал Perfect2You - Среда, 15.03.2017, 11:19
 
Ответить
СообщениеСкрипт короче, но должен работать шустро на любом наборе данных (даже очень большом)
[vba]
Код
Sub unic()
Dim strMax As Long, strOk As Long, cOl1 As Long, cOl2 As Long
Dim rN As Range, letT1 As String, letT2 As String
cOl1 = 3
cOl2 = 4
letT1 = Mid(Columns(cOl1).Address, 2, InStr(1, Columns(cOl1).Address, ":") - 2)
letT2 = Mid(Columns(cOl2).Address, 2, InStr(1, Columns(cOl2).Address, ":") - 2)
strMax = Application.Max(Cells(Rows.Count, cOl1).End(xlUp).Row, Cells(Rows.Count, cOl2).End(xlUp).Row)
If strMax < 3 Then Exit Sub
For strOk = 2 To strMax - 1
    If Evaluate("=SUMPRODUCT((" & letT1 & strOk & "=" & letT1 & (strOk + 1) & ":" & letT1 & strMax & ")*(" & letT2 & strOk & "=" & letT2 & (strOk + 1) & ":" & letT2 & strMax & "))") = 0 Then
        If rN Is Nothing Then
            Set rN = Cells(strOk, cOl1)
        Else
            Set rN = Union(rN, Cells(strOk, cOl1))
        End If
    End If
Next strOk
Set rN = Union(rN, Cells(strMax, cOl1))
rN.EntireRow.Delete Shift:=xlUp
End Sub
[/vba]

Дубликаты проверяет по обоим полям одновременно, то есть Петров Улица1 и Петров Улица2 дубликатами считать не будет, хоть Петров и там, и там.

Автор - Perfect2You
Дата добавления - 15.03.2017 в 10:56
Andrius Дата: Среда, 15.03.2017, 13:34 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Благодарю всех откликнувшихся на мою просьбу экспертов.
Немного поясню ситуацию по ответам ( способам решения задачи).
Эксперт ant6729
Задача решена на 50%, т.к. после работы Макроса (скрипта), остались дублирующие данные, в виде парного списка. А требовалось в виде уникальных данных ( в одну строку).
Эксперт K-SerJC
Тоже задача решена на 50 %. Хотя дублирующие данные стали уникальными ( в одну строку), но при этом остались данные, которые НЕ имели повторения в списке оригинала. То есть по сути после применения Макроса, данные очистились от повторяющихся данных ( как парного значения ), сохраняя при это весь список данных.
Эксперт Perfect2You
Решил задачу на 100% и идеально!!! Именно этого и требовалось. При этом таблица сохранила графическое оформление и кнопка осталась на месте ( без динамического движения, как было ранее в одном из скриптов-макроса).
Спасибо вам БОЛЬШОЕ Perfect2You! Очень выручили.
И снова благодарю остальных экспертов, за попытку решения сложной задачки.


Сообщение отредактировал Andrius - Среда, 15.03.2017, 13:38
 
Ответить
СообщениеБлагодарю всех откликнувшихся на мою просьбу экспертов.
Немного поясню ситуацию по ответам ( способам решения задачи).
Эксперт ant6729
Задача решена на 50%, т.к. после работы Макроса (скрипта), остались дублирующие данные, в виде парного списка. А требовалось в виде уникальных данных ( в одну строку).
Эксперт K-SerJC
Тоже задача решена на 50 %. Хотя дублирующие данные стали уникальными ( в одну строку), но при этом остались данные, которые НЕ имели повторения в списке оригинала. То есть по сути после применения Макроса, данные очистились от повторяющихся данных ( как парного значения ), сохраняя при это весь список данных.
Эксперт Perfect2You
Решил задачу на 100% и идеально!!! Именно этого и требовалось. При этом таблица сохранила графическое оформление и кнопка осталась на месте ( без динамического движения, как было ранее в одном из скриптов-макроса).
Спасибо вам БОЛЬШОЕ Perfect2You! Очень выручили.
И снова благодарю остальных экспертов, за попытку решения сложной задачки.

Автор - Andrius
Дата добавления - 15.03.2017 в 13:34
Perfect2You Дата: Среда, 15.03.2017, 14:01 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Предупреждение насчет кнопки.

Кнопка удаляется вместе со строкой, на которую попадает ее верхняя граница и изменяется при удалении любой строки, которую кнопка задевает.
Вам просто повезло, что строки 2-4 из Вашего примера удалять не пришлось. Если бы они удалялись, с кнопкой не было бы гладко.

Поместите кнопку, чтобы она полностью умещалась в первой строке, тогда с ней точно все будет в порядке. Макросом, конечно, тоже отслеживать ее положение можно, но стоит ли?
 
Ответить
СообщениеПредупреждение насчет кнопки.

Кнопка удаляется вместе со строкой, на которую попадает ее верхняя граница и изменяется при удалении любой строки, которую кнопка задевает.
Вам просто повезло, что строки 2-4 из Вашего примера удалять не пришлось. Если бы они удалялись, с кнопкой не было бы гладко.

Поместите кнопку, чтобы она полностью умещалась в первой строке, тогда с ней точно все будет в порядке. Макросом, конечно, тоже отслеживать ее положение можно, но стоит ли?

Автор - Perfect2You
Дата добавления - 15.03.2017 в 14:01
Andrius Дата: Среда, 15.03.2017, 15:13 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 15
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Perfect2You, спасибо вам большое за подсказку по кнопке.
Как то в голову не пришло, что она тоже попадает в зону работы сортировки строк.
Мне проще переместить её в 1 строку. Макрос НЕ требуется.
 
Ответить
Сообщение Perfect2You, спасибо вам большое за подсказку по кнопке.
Как то в голову не пришло, что она тоже попадает в зону работы сортировки строк.
Мне проще переместить её в 1 строку. Макрос НЕ требуется.

Автор - Andrius
Дата добавления - 15.03.2017 в 15:13
Manyasha Дата: Среда, 15.03.2017, 22:23 | Сообщение № 10
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Поместите кнопку, чтобы она полностью умещалась в первой строке, тогда с ней точно все будет в порядке. Макросом, конечно, тоже отслеживать ее положение можно, но стоит ли?

ПКМ по кнопке - формат фигуры - Свойства - Выбрать Не перемещать и не изменять размеры. Тогда кнопка не удалится не передвинется :)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщение
Поместите кнопку, чтобы она полностью умещалась в первой строке, тогда с ней точно все будет в порядке. Макросом, конечно, тоже отслеживать ее положение можно, но стоит ли?

ПКМ по кнопке - формат фигуры - Свойства - Выбрать Не перемещать и не изменять размеры. Тогда кнопка не удалится не передвинется :)

Автор - Manyasha
Дата добавления - 15.03.2017 в 22:23
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск дубликатов и удаление лишних данных (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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