Привет форумчанам и знатокам Экселя! Требуется скрипт-макрос, для нахождения дублированных строк, делать их уникальными и удалять не попавшие в дубликат. В моём примере (файле), есть лист куда собирается вся стата. Иногда есть повторения данных. Требуется по столбцам Данные 1 и Данные 2 , находить эти повторяющиеся строки, делать их уникальными ( то есть в виде одной строки), а остальные не совпавшие данные, удаляются. В примере получается, что должны остаться 5 строк с фамилиями ( Петров, Иванов,, Зайцев,Морозов и Сидоров). Оставшиеся уникальные данные ( после нажатия кнопки), остаются в той же таблице и никуда переносить НЕ надо.
P.S. Кнопку сделал для прикрепления Скрипт-Макроса. P.S.S. Работа с фильтрами не устраивает. Требуется именно макрос.
Привет форумчанам и знатокам Экселя! Требуется скрипт-макрос, для нахождения дублированных строк, делать их уникальными и удалять не попавшие в дубликат. В моём примере (файле), есть лист куда собирается вся стата. Иногда есть повторения данных. Требуется по столбцам Данные 1 и Данные 2 , находить эти повторяющиеся строки, делать их уникальными ( то есть в виде одной строки), а остальные не совпавшие данные, удаляются. В примере получается, что должны остаться 5 строк с фамилиями ( Петров, Иванов,, Зайцев,Морозов и Сидоров). Оставшиеся уникальные данные ( после нажатия кнопки), остаются в той же таблице и никуда переносить НЕ надо.
P.S. Кнопку сделал для прикрепления Скрипт-Макроса. P.S.S. Работа с фильтрами не устраивает. Требуется именно макрос.Andrius
ant6729, я имел в виду, что данные которые НЕ имеют повторения, УДАЛЯЮТСЯ из таблицы. Возможно не корректно сформулировал концовку действий в задаче. Признаю.
ant6729, я имел в виду, что данные которые НЕ имеют повторения, УДАЛЯЮТСЯ из таблицы. Возможно не корректно сформулировал концовку действий в задаче. Признаю.Andrius
ant6729, спасибо вам большое за скрипт-макрос! Но он решил половину поставленной задачи. А именно, удалил данные НЕ имевшие совпадений. Теперь после применения вашего Макроса, остались дублированные (парные) данные. Осталось эти дубликат-данные сделать уникальными,то есть превратить в одну строчку. Всего в итоге должно остаться 5 строчек (фамилий). Но направление решение задачи у вас правильное. И вы гигант ума, что смогли создать такой сложный скрипт. Надеюсь у вас получится дописать к нему финальные скрипты.
ant6729, спасибо вам большое за скрипт-макрос! Но он решил половину поставленной задачи. А именно, удалил данные НЕ имевшие совпадений. Теперь после применения вашего Макроса, остались дублированные (парные) данные. Осталось эти дубликат-данные сделать уникальными,то есть превратить в одну строчку. Всего в итоге должно остаться 5 строчек (фамилий). Но направление решение задачи у вас правильное. И вы гигант ума, что смогли создать такой сложный скрипт. Надеюсь у вас получится дописать к нему финальные скрипты.Andrius
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]
если правильно понял, то вот: [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]
Код
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 дубликатами считать не будет, хоть Петров и там, и там.
Скрипт короче, но должен работать шустро на любом наборе данных (даже очень большом) [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
Благодарю всех откликнувшихся на мою просьбу экспертов. Немного поясню ситуацию по ответам ( способам решения задачи). Эксперт ant6729 Задача решена на 50%, т.к. после работы Макроса (скрипта), остались дублирующие данные, в виде парного списка. А требовалось в виде уникальных данных ( в одну строку). Эксперт K-SerJC Тоже задача решена на 50 %. Хотя дублирующие данные стали уникальными ( в одну строку), но при этом остались данные, которые НЕ имели повторения в списке оригинала. То есть по сути после применения Макроса, данные очистились от повторяющихся данных ( как парного значения ), сохраняя при это весь список данных. Эксперт Perfect2You Решил задачу на 100% и идеально!!! Именно этого и требовалось. При этом таблица сохранила графическое оформление и кнопка осталась на месте ( без динамического движения, как было ранее в одном из скриптов-макроса). Спасибо вам БОЛЬШОЕ Perfect2You! Очень выручили. И снова благодарю остальных экспертов, за попытку решения сложной задачки.
Благодарю всех откликнувшихся на мою просьбу экспертов. Немного поясню ситуацию по ответам ( способам решения задачи). Эксперт ant6729 Задача решена на 50%, т.к. после работы Макроса (скрипта), остались дублирующие данные, в виде парного списка. А требовалось в виде уникальных данных ( в одну строку). Эксперт K-SerJC Тоже задача решена на 50 %. Хотя дублирующие данные стали уникальными ( в одну строку), но при этом остались данные, которые НЕ имели повторения в списке оригинала. То есть по сути после применения Макроса, данные очистились от повторяющихся данных ( как парного значения ), сохраняя при это весь список данных. Эксперт Perfect2You Решил задачу на 100% и идеально!!! Именно этого и требовалось. При этом таблица сохранила графическое оформление и кнопка осталась на месте ( без динамического движения, как было ранее в одном из скриптов-макроса). Спасибо вам БОЛЬШОЕ Perfect2You! Очень выручили. И снова благодарю остальных экспертов, за попытку решения сложной задачки.Andrius
Сообщение отредактировал Andrius - Среда, 15.03.2017, 13:38
Кнопка удаляется вместе со строкой, на которую попадает ее верхняя граница и изменяется при удалении любой строки, которую кнопка задевает. Вам просто повезло, что строки 2-4 из Вашего примера удалять не пришлось. Если бы они удалялись, с кнопкой не было бы гладко.
Поместите кнопку, чтобы она полностью умещалась в первой строке, тогда с ней точно все будет в порядке. Макросом, конечно, тоже отслеживать ее положение можно, но стоит ли?
Предупреждение насчет кнопки.
Кнопка удаляется вместе со строкой, на которую попадает ее верхняя граница и изменяется при удалении любой строки, которую кнопка задевает. Вам просто повезло, что строки 2-4 из Вашего примера удалять не пришлось. Если бы они удалялись, с кнопкой не было бы гладко.
Поместите кнопку, чтобы она полностью умещалась в первой строке, тогда с ней точно все будет в порядке. Макросом, конечно, тоже отслеживать ее положение можно, но стоит ли?Perfect2You
Perfect2You, спасибо вам большое за подсказку по кнопке. Как то в голову не пришло, что она тоже попадает в зону работы сортировки строк. Мне проще переместить её в 1 строку. Макрос НЕ требуется.
Perfect2You, спасибо вам большое за подсказку по кнопке. Как то в голову не пришло, что она тоже попадает в зону работы сортировки строк. Мне проще переместить её в 1 строку. Макрос НЕ требуется.Andrius
Поместите кнопку, чтобы она полностью умещалась в первой строке, тогда с ней точно все будет в порядке. Макросом, конечно, тоже отслеживать ее положение можно, но стоит ли?
ПКМ по кнопке - формат фигуры - Свойства - Выбрать Не перемещать и не изменять размеры. Тогда кнопка не удалится не передвинется
Поместите кнопку, чтобы она полностью умещалась в первой строке, тогда с ней точно все будет в порядке. Макросом, конечно, тоже отслеживать ее положение можно, но стоит ли?
ПКМ по кнопке - формат фигуры - Свойства - Выбрать Не перемещать и не изменять размеры. Тогда кнопка не удалится не передвинется Manyasha