Добрый день господа! Есть задачка. Есть Маша, Коля и т.д. Как можно VBA (без фильтра и встройки "удаление дубликатов") найти всех Маш и удалить их кроме оригинала, т.е. самой первой по списку, не затрагивая разных Коль, Толь и т.д. P/S. Найти Машу и удалить не проблема, а вот чтоб удалить всех Маш (кроме оригинала), чёт на форумах такого не встречал.... ссылка http://www.planetaexcel.ru/forum....-filtra
Добрый день господа! Есть задачка. Есть Маша, Коля и т.д. Как можно VBA (без фильтра и встройки "удаление дубликатов") найти всех Маш и удалить их кроме оригинала, т.е. самой первой по списку, не затрагивая разных Коль, Толь и т.д. P/S. Найти Машу и удалить не проблема, а вот чтоб удалить всех Маш (кроме оригинала), чёт на форумах такого не встречал.... ссылка http://www.planetaexcel.ru/forum....-filtraQwertyBoss
Легким движением хвоста это превращается в это [vba]
Код
Sub Мяу() Dim arr1 arr1 = Range("A1").CurrentRegion.Value Dim lr&, col&, i&, j& lr = Cells(Rows.Count, 1).End(xlUp).Row With CreateObject("Scripting.Dictionary") For i = 2 To lr .Item(arr1(i, 1)) = .Item(arr1(i, 1)) + 1 Next Application.ScreenUpdating = False For i = lr To 2 Step -1 If arr1(i, 1) = "Маша" Then If .Item(arr1(i, 1)) > 1 Then Rows(i).Delete .Item(arr1(i, 1)) = .Item(arr1(i, 1)) - 1 End If End If Next End With End Sub
[/vba]
Легким движением хвоста это превращается в это [vba]
Код
Sub Мяу() Dim arr1 arr1 = Range("A1").CurrentRegion.Value Dim lr&, col&, i&, j& lr = Cells(Rows.Count, 1).End(xlUp).Row With CreateObject("Scripting.Dictionary") For i = 2 To lr .Item(arr1(i, 1)) = .Item(arr1(i, 1)) + 1 Next Application.ScreenUpdating = False For i = lr To 2 Step -1 If arr1(i, 1) = "Маша" Then If .Item(arr1(i, 1)) > 1 Then Rows(i).Delete .Item(arr1(i, 1)) = .Item(arr1(i, 1)) - 1 End If End If Next End With End Sub
Sub d() Dim dic As Object, c As Range Set dic = CreateObject("scripting.dictionary") For Each c In Selection If dic.exists(c.Value) Then c.ClearContents Else dic.Add c.Value, c.Value Next End Sub
[/vba] Нужно выделить обрабатываемый диапазон и нажать кнопку. RAN опередил на несколько секунд
Словарь в помощь: [vba]
Код
Sub d() Dim dic As Object, c As Range Set dic = CreateObject("scripting.dictionary") For Each c In Selection If dic.exists(c.Value) Then c.ClearContents Else dic.Add c.Value, c.Value Next End Sub
[/vba] Нужно выделить обрабатываемый диапазон и нажать кнопку. RAN опередил на несколько секунд SLAVICK
Спс. за "мяу". Класс, работает! Ща буду разбирать по полочкам =). SLAVICKу тоже спасибо, у него почти такой же код как у Юрий М. Не знаю что у Вас за гонки, но пулучилось у всех. Только у "RAN в каске" ну... более заточен под необходимые условия. Спс. всем!!!!
Спс. за "мяу". Класс, работает! Ща буду разбирать по полочкам =). SLAVICKу тоже спасибо, у него почти такой же код как у Юрий М. Не знаю что у Вас за гонки, но пулучилось у всех. Только у "RAN в каске" ну... более заточен под необходимые условия. Спс. всем!!!!QwertyBoss
Тут не только Машам, но и SLAVICK'ам мало не покажется.
Вот это я проглядел т.е. нужно удалить только дубликаты "Маш"? ну тогда и словарь не нужен - вот: [vba]
Код
Sub d() Dim c As Range, cF As Range, b As Boolean For Each c In Range("A1").CurrentRegion If c.Value = "Маша" Then If Not b Then b = True Else If cF Is Nothing Then Set cF = c Else Set cF = Union(c, cF) End If Next cF.EntireRow.Delete End Sub
Тут не только Машам, но и SLAVICK'ам мало не покажется.
Вот это я проглядел т.е. нужно удалить только дубликаты "Маш"? ну тогда и словарь не нужен - вот: [vba]
Код
Sub d() Dim c As Range, cF As Range, b As Boolean For Each c In Range("A1").CurrentRegion If c.Value = "Маша" Then If Not b Then b = True Else If cF Is Nothing Then Set cF = c Else Set cF = Union(c, cF) End If Next cF.EntireRow.Delete End Sub
QwertyBoss, добрый вечер,Ваша тема продублирована одновременно на другом форуме еще вариант,кнопки: test и восстановить на листе Лист1,данные изменяются на листе Лист2 для удобства тестирования.
[vba]
Код
Sub test() Dim z(), i&, t z = Sheets("Лист2").Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).Value With CreateObject("scripting.dictionary"): .comparemode = 1 For i = 1 To UBound(z) .Item(z(i, 1)) = 0 Next For i = UBound(z) To 2 Step -1 If z(i, 1) = "Маша" Then Sheets("Лист2").Rows(i + 1 & ":" & i + 1).Delete Next End With End Sub
[/vba]
QwertyBoss, добрый вечер,Ваша тема продублирована одновременно на другом форуме еще вариант,кнопки: test и восстановить на листе Лист1,данные изменяются на листе Лист2 для удобства тестирования.
[vba]
Код
Sub test() Dim z(), i&, t z = Sheets("Лист2").Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).Value With CreateObject("scripting.dictionary"): .comparemode = 1 For i = 1 To UBound(z) .Item(z(i, 1)) = 0 Next For i = UBound(z) To 2 Step -1 If z(i, 1) = "Маша" Then Sheets("Лист2").Rows(i + 1 & ":" & i + 1).Delete Next End With End Sub
sv2014 спс. что откликнулись и не пожалели времени. Вариант более чем удачен. Возьму на вооружение =). Есть ряд задач к которым он идеально подходит. Ищщё раз спасибо...
sv2014 спс. что откликнулись и не пожалели времени. Вариант более чем удачен. Возьму на вооружение =). Есть ряд задач к которым он идеально подходит. Ищщё раз спасибо...QwertyBoss
Уважаемый RAN, добрый вечер,я ориентируюсь на файл-пример создателя темы,поэтому предложил такой код еще на Планете,(здесь просто скопировал свой макрос,с небольшим изменением.С вашим кодом,обязательно ознакомлюсь. Успехов Вам.
Уважаемый RAN, добрый вечер,я ориентируюсь на файл-пример создателя темы,поэтому предложил такой код еще на Планете,(здесь просто скопировал свой макрос,с небольшим изменением.С вашим кодом,обязательно ознакомлюсь. Успехов Вам.sv2014
SLAVICK спс. Стока решений... не ожидал. Впредь буду поаккуратней и не вылаживать темы на параллельных форумах =). Боюсь заглядывать на планету...
SLAVICK спс. Стока решений... не ожидал. Впредь буду поаккуратней и не вылаживать темы на параллельных форумах =). Боюсь заглядывать на планету...QwertyBoss
Сообщение отредактировал QwertyBoss - Четверг, 03.12.2015, 08:34
найти всех Маш и удалить их кроме оригинала, т.е. самой первой по списку
Вторая часть кода удаляет всех Маш до 3 строки включительно, а не до первой Маши в списке. Мой изначальный код (см ссылку) писался для более сложного случая (совпадение по n столбцам). Для этого случая и он переусложнен.
Про файл-пример понятно. Вы в коде заполняете словарь, который никак не используете. Зачем?
найти всех Маш и удалить их кроме оригинала, т.е. самой первой по списку
Вторая часть кода удаляет всех Маш до 3 строки включительно, а не до первой Маши в списке. Мой изначальный код (см ссылку) писался для более сложного случая (совпадение по n столбцам). Для этого случая и он переусложнен.RAN
RAN, благодарю за уточнение,понял Ваш вопрос,исправлю эту неточность,-сразу на нескольких форумах отвечал одновременно на разные вопросы(у меня разные ники на разных форумах) (сейчас, поздно уже,ложусь спать(завтра на работу рано...)
RAN, благодарю за уточнение,понял Ваш вопрос,исправлю эту неточность,-сразу на нескольких форумах отвечал одновременно на разные вопросы(у меня разные ники на разных форумах) (сейчас, поздно уже,ложусь спать(завтра на работу рано...)sv2014
Вы там поменяли цифры. Попробуйте мой код - там практически ничего менять не нужно.: [vba]
Код
Sub d() Dim c As Range, cF As Range, b As Boolean For Each c In Range("A1").CurrentRegion If c.Value Like "Перспективные работы*" Then If Not b Then b = True Else If cF Is Nothing Then Set cF = c Else Set cF = Union(c, cF) End If Next cF.EntireRow.Delete End Sub
[/vba] Сейчас посмотрю что там Вы поменяли в коде RAN - он немного сложнее чем мой Посмотрел - поскольку используется словарь - он удаляет именно 100% совпадение, а поскольку данные отличаются - то дублей нет . Можно конечно менять логику работы - если RAN захочет поменяет. Мой макрос и так работает
Вы там поменяли цифры. Попробуйте мой код - там практически ничего менять не нужно.: [vba]
Код
Sub d() Dim c As Range, cF As Range, b As Boolean For Each c In Range("A1").CurrentRegion If c.Value Like "Перспективные работы*" Then If Not b Then b = True Else If cF Is Nothing Then Set cF = c Else Set cF = Union(c, cF) End If Next cF.EntireRow.Delete End Sub
[/vba] Сейчас посмотрю что там Вы поменяли в коде RAN - он немного сложнее чем мой Посмотрел - поскольку используется словарь - он удаляет именно 100% совпадение, а поскольку данные отличаются - то дублей нет . Можно конечно менять логику работы - если RAN захочет поменяет. Мой макрос и так работает SLAVICK
SLAVICK спс. Работает . [Вы там поменяли цифры.] Цыфры менял по причине затачивания под проект. Но ПОЧЕМУ у Вас сработал, у RAN не получается. Оператор и там и там одинаковый =(
SLAVICK спс. Работает . [Вы там поменяли цифры.] Цыфры менял по причине затачивания под проект. Но ПОЧЕМУ у Вас сработал, у RAN не получается. Оператор и там и там одинаковый =(QwertyBoss
[Сейчас посмотрю что там Вы поменяли в коде RAN - он немного сложнее чем мой Посмотрел - поскольку используется словарь - он удаляет именно 100% совпадение, а поскольку данные отличаются - то дублей нет yes . Можно конечно менять логику работы - если RAN захочет поменяет. Мой макрос и так работает yes]
Забираю!!!! Использую!!! Спс!!!
[Сейчас посмотрю что там Вы поменяли в коде RAN - он немного сложнее чем мой Посмотрел - поскольку используется словарь - он удаляет именно 100% совпадение, а поскольку данные отличаются - то дублей нет yes . Можно конечно менять логику работы - если RAN захочет поменяет. Мой макрос и так работает yes]