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

Вход

Регистрация

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

 

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

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удаление дубликатов в базе данных (Макросы/Sub)
Удаление дубликатов в базе данных
Serge1400 Дата: Пятница, 17.03.2017, 00:46 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Всем доброй ночи!
И снова требуется помощь специалистов.
Имеется постоянно пополняемая база данных по товарам, в которой вручную приходится удалять дубликаты. Дубликатов бывает много и тратится слишком много времени на их поиск и удаление через сортировку. Как понимаю, для автоматизации процесса нужен макрос, написать который я явно не в состоянии.
Суть задачи в поиске и удалении всех строк в таблице, которые содержат дубликаты кодов (колонка А в примере). Соответственно в базе должен оставаться один уникальный код (первый по счету) и все остальные данные находящиеся в одной строке с этим кодом.
Буквально вчера была создана похожая тема, но все таки там задача немного другая http://www.excelworld.ru/forum/10-32783-1
Думаю, что после редактирования одного из предложенных макросов из этой темы, можно решить и мою задачу. Но я сам это сделать не в состоянии.
К сообщению приложен файл: 3314701.xlsm (11.3 Kb)


Сообщение отредактировал Serge1400 - Пятница, 17.03.2017, 09:06
 
Ответить
СообщениеВсем доброй ночи!
И снова требуется помощь специалистов.
Имеется постоянно пополняемая база данных по товарам, в которой вручную приходится удалять дубликаты. Дубликатов бывает много и тратится слишком много времени на их поиск и удаление через сортировку. Как понимаю, для автоматизации процесса нужен макрос, написать который я явно не в состоянии.
Суть задачи в поиске и удалении всех строк в таблице, которые содержат дубликаты кодов (колонка А в примере). Соответственно в базе должен оставаться один уникальный код (первый по счету) и все остальные данные находящиеся в одной строке с этим кодом.
Буквально вчера была создана похожая тема, но все таки там задача немного другая http://www.excelworld.ru/forum/10-32783-1
Думаю, что после редактирования одного из предложенных макросов из этой темы, можно решить и мою задачу. Но я сам это сделать не в состоянии.

Автор - Serge1400
Дата добавления - 17.03.2017 в 00:46
doober Дата: Пятница, 17.03.2017, 03:37 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Проверте, вдруг подойдет.
[vba]
Код
Sub Killer()
    Dim Sh As Worksheet, key As String, S As String
    Set C_is = CreateObject("scripting.dictionary")
    Set Sh = ActiveSheet
    LastRow = Sh.Cells(Sh.Rows.Count, 1).End(xlUp).Row
    dx = Sh.Range("A1:A" & LastRow)
    For n = 2 To UBound(dx)
        key = dx(n, 1)
        If C_is.Exists(key) Then
            S = S & "," & n
        Else
            C_is.Item(key) = n
        End If
    Next
    Z = Split(S, ",")
    Application.ScreenUpdating = False
    For n = UBound(Z) To 1 Step -1
    Sh.Rows(Val(Z(n))).Delete
    Next
    Application.ScreenUpdating = True
End Sub
[/vba]


 
Ответить
СообщениеПроверте, вдруг подойдет.
[vba]
Код
Sub Killer()
    Dim Sh As Worksheet, key As String, S As String
    Set C_is = CreateObject("scripting.dictionary")
    Set Sh = ActiveSheet
    LastRow = Sh.Cells(Sh.Rows.Count, 1).End(xlUp).Row
    dx = Sh.Range("A1:A" & LastRow)
    For n = 2 To UBound(dx)
        key = dx(n, 1)
        If C_is.Exists(key) Then
            S = S & "," & n
        Else
            C_is.Item(key) = n
        End If
    Next
    Z = Split(S, ",")
    Application.ScreenUpdating = False
    For n = UBound(Z) To 1 Step -1
    Sh.Rows(Val(Z(n))).Delete
    Next
    Application.ScreenUpdating = True
End Sub
[/vba]

Автор - doober
Дата добавления - 17.03.2017 в 03:37
Perfect2You Дата: Пятница, 17.03.2017, 10:51 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
А у Вас в строках-дубликатах количества разные! После удаления в единственной оставшейся должна быть сумма всех или первое встретившееся значение?
 
Ответить
СообщениеА у Вас в строках-дубликатах количества разные! После удаления в единственной оставшейся должна быть сумма всех или первое встретившееся значение?

Автор - Perfect2You
Дата добавления - 17.03.2017 в 10:51
китин Дата: Пятница, 17.03.2017, 10:55 | Сообщение № 4
Группа: Модераторы
Ранг: Экселист
Сообщений: 7014
Репутация: 1073 ±
Замечаний: 0% ±

Excel 2007;2010;2016
интересно у вас под кодом 78904 находятся два разных изделия. это ошибка или где?


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852
 
Ответить
Сообщениеинтересно у вас под кодом 78904 находятся два разных изделия. это ошибка или где?

Автор - китин
Дата добавления - 17.03.2017 в 10:55
Serge1400 Дата: Пятница, 17.03.2017, 21:05 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
А у Вас в строках-дубликатах количества разные! После удаления в единственной оставшейся должна быть сумма всех или первое встретившееся значение?

В живых остается первый попавшийся по счету дубликат, со всеми прицепленными к нему данными. Все остальное удаляется. Суммировать ничего не нужно.
 
Ответить
Сообщение
А у Вас в строках-дубликатах количества разные! После удаления в единственной оставшейся должна быть сумма всех или первое встретившееся значение?

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

Автор - Serge1400
Дата добавления - 17.03.2017 в 21:05
Serge1400 Дата: Пятница, 17.03.2017, 21:12 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
интересно у вас под кодом 78904 находятся два разных изделия. это ошибка или где?

Да, это именно где, а не ошибка.
Просто не совсем удачный пример сделал. В оригинале нужно будет убивать дубли в базе таможенных пошлин, которые жестко пришиты только к коду (ТН ВЭД) и ни от чего другого не зависят. То есть одинаковые коды имеют одинаковые значения пошлины. Мне просто нужно было показать, что нужна сортировка только по одному столбцу -код.
 
Ответить
Сообщение
интересно у вас под кодом 78904 находятся два разных изделия. это ошибка или где?

Да, это именно где, а не ошибка.
Просто не совсем удачный пример сделал. В оригинале нужно будет убивать дубли в базе таможенных пошлин, которые жестко пришиты только к коду (ТН ВЭД) и ни от чего другого не зависят. То есть одинаковые коды имеют одинаковые значения пошлины. Мне просто нужно было показать, что нужна сортировка только по одному столбцу -код.

Автор - Serge1400
Дата добавления - 17.03.2017 в 21:12
Serge1400 Дата: Пятница, 17.03.2017, 21:16 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Проверте, вдруг подойдет.

Щааа проверим на предмет вдругподхождения. deal
По результатам отпишусь.
P.S. Cпасибо!

Проверил, вроде все убивает как задумано. И главное, что мне понятно как, при необходимости, в этом макросе колонку где надо шуровать переназначить


Сообщение отредактировал Serge1400 - Пятница, 17.03.2017, 22:32
 
Ответить
Сообщение
Проверте, вдруг подойдет.

Щааа проверим на предмет вдругподхождения. deal
По результатам отпишусь.
P.S. Cпасибо!

Проверил, вроде все убивает как задумано. И главное, что мне понятно как, при необходимости, в этом макросе колонку где надо шуровать переназначить

Автор - Serge1400
Дата добавления - 17.03.2017 в 21:16
Perfect2You Дата: Пятница, 17.03.2017, 22:32 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Ну, если тот вдруг не подойдет, этот подойдет точно.
[vba]
Код
Sub unA()
Dim strBeg As Long, strMax As Long, strOk As Long, cOl1 As Long, cOl2 As Long, cOl3 As Long, cOl4 As Long
Dim rN As Range, letT1 As String, letT2 As String, aRr As Variant
strBeg = 3
cOl1 = 1
letT1 = Mid(Columns(cOl1).Address, 2, InStr(1, Columns(cOl1).Address, ":") - 2)
strMax = Cells(Rows.Count, cOl1).End(xlUp).Row
If strMax < (strBeg + 1) Then Exit Sub
For strOk = strBeg + 1 To strMax
        If Evaluate("=SUMPRODUCT(--(" & letT1 & strOk & "=" & letT1 & strBeg & ":" & letT1 & (strOk - 1) & "))") 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
If Not (rN Is Nothing) Then rN.EntireRow.Delete Shift:=xlUp
End Sub
[/vba]
К кнопке подвязал.
К сообщению приложен файл: 5032627.xlsm (18.5 Kb)


Сообщение отредактировал Perfect2You - Пятница, 17.03.2017, 22:32
 
Ответить
СообщениеНу, если тот вдруг не подойдет, этот подойдет точно.
[vba]
Код
Sub unA()
Dim strBeg As Long, strMax As Long, strOk As Long, cOl1 As Long, cOl2 As Long, cOl3 As Long, cOl4 As Long
Dim rN As Range, letT1 As String, letT2 As String, aRr As Variant
strBeg = 3
cOl1 = 1
letT1 = Mid(Columns(cOl1).Address, 2, InStr(1, Columns(cOl1).Address, ":") - 2)
strMax = Cells(Rows.Count, cOl1).End(xlUp).Row
If strMax < (strBeg + 1) Then Exit Sub
For strOk = strBeg + 1 To strMax
        If Evaluate("=SUMPRODUCT(--(" & letT1 & strOk & "=" & letT1 & strBeg & ":" & letT1 & (strOk - 1) & "))") 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
If Not (rN Is Nothing) Then rN.EntireRow.Delete Shift:=xlUp
End Sub
[/vba]
К кнопке подвязал.

Автор - Perfect2You
Дата добавления - 17.03.2017 в 22:32
Serge1400 Дата: Пятница, 17.03.2017, 22:39 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Ну, если тот вдруг не подойдет, этот подойдет точно.

Ага, это тот который из недавней похожей темы, но модернизированный. Спасибо! Ща и его тож потискаем в рабочей среде.
Кстати, а как в этом макросе переназначить "убойную" колонку скажем с А на В или С?
Потискал на объемном файле - действительно шустрый!


Сообщение отредактировал Serge1400 - Пятница, 17.03.2017, 22:53
 
Ответить
Сообщение
Ну, если тот вдруг не подойдет, этот подойдет точно.

Ага, это тот который из недавней похожей темы, но модернизированный. Спасибо! Ща и его тож потискаем в рабочей среде.
Кстати, а как в этом макросе переназначить "убойную" колонку скажем с А на В или С?
Потискал на объемном файле - действительно шустрый!

Автор - Serge1400
Дата добавления - 17.03.2017 в 22:39
Perfect2You Дата: Суббота, 18.03.2017, 00:14 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Кстати, а как в этом макросе переназначить "убойную" колонку скажем с А на В или С?

Элементарно.
[vba]
Код
cOl1 = 1
[/vba]
Это задан первый столбец. Поменяете значение переменной или InputBox'ом запрашивайте - будет проверка и удаление дубликатов другого столбца.


Сообщение отредактировал Perfect2You - Суббота, 18.03.2017, 00:14
 
Ответить
Сообщение
Кстати, а как в этом макросе переназначить "убойную" колонку скажем с А на В или С?

Элементарно.
[vba]
Код
cOl1 = 1
[/vba]
Это задан первый столбец. Поменяете значение переменной или InputBox'ом запрашивайте - будет проверка и удаление дубликатов другого столбца.

Автор - Perfect2You
Дата добавления - 18.03.2017 в 00:14
Serge1400 Дата: Воскресенье, 19.03.2017, 11:59 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 101
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Это задан первый столбец. Поменяете значение переменной или InputBox'ом запрашивайте - будет проверка и удаление дубликатов другого столбца.

Спасибо за пояснение !
Ну и всем остальным тоже спасибо еще раз за помощь!


Сообщение отредактировал Serge1400 - Воскресенье, 19.03.2017, 11:59
 
Ответить
Сообщение
Это задан первый столбец. Поменяете значение переменной или InputBox'ом запрашивайте - будет проверка и удаление дубликатов другого столбца.

Спасибо за пояснение !
Ну и всем остальным тоже спасибо еще раз за помощь!

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

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