Excel удалить дубликаты макрос

Удаление повторяющихся значений (дубликатов) в диапазоне ячеек с помощью кода VBA Excel. Метод Range.RemoveDuplicates — синтаксис, параметры, примеры.

Метод Range.RemoveDuplicates

Метод Range.RemoveDuplicates предназначен в VBA Excel для удаления повторяющихся значений по столбцам в заданном диапазоне ячеек рабочего листа. Строки с обнаруженными дубликатами удаляются целиком.

Синтаксис метода Range.RemoveDuplicates

expression. RemoveDuplicates (Columns , Header),

где expression — переменная или выражение, возвращающее объект Range.

Параметры метода Range.RemoveDuplicates

Наименование Описание
Columns Массив индексов столбцов, содержащих ячейки с повторяющимися значениями. Обязательный параметр. Тип данных – Variant.
Header Указывает, содержит ли первая строка диапазона заголовок, который не участвует в поиске дубликатов:

  • xlNo — первая строка списка не содержит заголовок (значение по умолчанию);
  • xlYes — первая строка диапазона содержит заголовок;
  • xlGuess — VBA Excel решает сам, есть ли у списка заголовок.

Необязательный параметр. Тип данных – XlYesNoGuess.

Метод работает как с круглыми скобками, в которые заключены параметры, так и без них. Если требуется указать несколько столбцов в параметре Columns, следует использовать функцию Array, например, Array(2, 3).

Примеры удаления дубликатов

Исходная таблица для всех примеров

Исходная таблица для удаления дубликатов

По третьей колонке легко определить, какие строки были удалены.

Пример 1
Удаление повторяющихся значений по первому столбцу:

Range("A1:C10").RemoveDuplicates 1

или

Range(Cells(1, 1), Cells(10, 3)).RemoveDuplicates (1)

Второй вариант позволяет использовать вместо индексов строк и столбцов переменные. Наличие или отсутствие скобок, в которые заключен параметр Columns, на работу метода не влияет.

Результат:

Пример 2
Удаление дубликатов по первому столбцу с указанием, что первая строка содержит заголовок:

Range("A1:C10").RemoveDuplicates 1, xlYes

Результат:

Здесь мы видим, что первая строка не учитывалась при поиске повторяющихся значений.

Пример 3
Удаление дубликатов по первому и второму столбцам:

Range("A1:C10").RemoveDuplicates Array(1, 2)

Результат:

Обратите внимание, что при удалении повторяющихся значений по нескольким столбцам, будут удалены дубли только тех строк, в которых во всех указанных столбцах содержатся одинаковые значения. В третьем примере удалены «лишние» строки с дублями значений по двум первым столбцам: Корова+Лягушка, Свинья+Бурундук и Овца+Собака.


Смотрите, как отобрать уникальные значения из списка в VBA Excel с помощью объекта Collection и объекта Dictionary.

 

Добрый день! Подскажите код для удаления дубликатов строк по условию одинакового значение во всех 12 столбцах.
На данный момент применяю код

Private Sub CommandButton1_Click()

With Sheets(«Материалы»)
       Set tng = Range(«A1», Range(«l1»).End(xlDown))
       tng.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), Header:=xlYes
   End With

End Sub

но он работает только если кнопка расположена на листе «Детали», а мне нужно чтобы код работал при нажатии кнопки на форме которая запускается с другого листа.
Заранее спасибо

 

MikeVol

Пользователь

Сообщений: 229
Регистрация: 20.10.2020

Ученик

Лидия Кунакова, Доброго времени суток. Так вставьте в вашей форме кнопку далее скопируйте ваш код в форму. И самое главное когда будете кнопку вставлять на форме обратите внимание как она будет называться. И переименуйте Private Sub CommandButton1_Click() именем вашей вновь вставленной кнопки. К примеру Private Sub CommandButton8_Click(). И будет вам счастье.

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#3

04.12.2022 17:46:45

это

Код
Set tng = .Range("A1", .Range("l1").End(xlDown))

будет работать на листе Материалы, но что вам нужно не знаю (не смог прочитать в обьяснениях задачи)

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

MikeVol

Пользователь

Сообщений: 229
Регистрация: 20.10.2020

Ученик

#4

04.12.2022 17:49:36

Ігор Гончаренко, тс скорее всего это надо

Цитата
Лидия Кунакова написал:
а мне нужно чтобы код работал при нажатии кнопки на форме

. Наверное есть некая форма уже. Выше я уже подсказал.

 

Ham13

Пользователь

Сообщений: 88
Регистрация: 02.08.2016

MikeVol, Ее код будет срабатывать на активном листе

Iгор все верно написал, чтобы срабатывало на листе Материалы (With Sheets(«Материалы»))
Нужно добавить точку
При чем тут лист Детали сложно понять, любой активный лист должен срабатывать.
Но без файла тяжело понять, может автор вообще другой смысл закладывал

 

New

Пользователь

Сообщений: 4581
Регистрация: 06.01.2013

#6

04.12.2022 18:25:10

Цитата
Лидия Кунакова написал:
Подскажите код для удаления дубликатов строк по условию одинакового значение во всех 12 столбцах.

Для получения быстрой и качественной помощи на форуме нужно всегда подготавливать небольшой файл-пример, где показать данные какие есть и можно рядом или на соседнем листе — как хочу получить. Иначе либо не получите помощь совсем, либо разговоров на месяц, либо предложенные варианты помощи вам не подойдут и т.д. и т.д. и т.д.

 

MikeVol

Пользователь

Сообщений: 229
Регистрация: 20.10.2020

Ученик

#7

05.12.2022 17:34:17

Ham13,

Цитата
Лидия Кунакова написал:
но он работает только если кнопка расположена на листе «Детали»

вам что нибудь это говорит? И да, он

Цитата
Ham13 написал:
код будет срабатывать на активном листе

так как

Цитата
Лидия Кунакова написал:
он работает только если кнопка расположена на листе «Детали»

Соответственно код запускается с активного листа потому что кнопка CommandButton1 находится на листе Детали, а сами действия происходит с листом Материалы
Но каким-то образом

Цитата
Лидия Кунакова написал:
На данный момент применяю код

даже без точки. Да тут спорный вопрос возникает без

Цитата
New написал:
небольшой файл-пример

, согласен.

 

Дмитрий(The_Prist) Щербаков

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#8

05.12.2022 17:46:17

Цитата
MikeVol написал:
Но каким-то образом даже без точки

тут как раз все предельно ясно. Именно потому что без точки, все срабатывает на том листе, в котором код. Это действие по умолчанию для всех модулей классов — если для объекта не указан явно родитель, то в качестве родителя используется сам модуль класса. В нашем случае это сам лист. Вот и получается:
Set tng = Лист_в_котором_код.Range(«A1», Лист_в_котором_код.Range(«l1»).End(xlDown))
Если интересно, здесь расписывал все подробно и последовательно:

Как обратиться к диапазону из VBA

там много букав, но возможно, пригодится для общего понимания.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Дмитрий(The_Prist) Щербаков

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#9

05.12.2022 17:50:19

Цитата
Лидия Кунакова написал:
нужно чтобы код работал при нажатии кнопки на форме которая запускается с другого листа

так и запишите свой код в виде функции с передачей нужного листа:

Код
Function RemDupes(ws as worksheet)
       Set tng = ws.Range("A1", ws.Range("l1").End(xlDown))
       tng.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), Header:=xlYes
End Function

А по кнопке с любого листа запускайте:

Код
Private Sub CommandButton1_Click()
'передаем в функцию лист с именем "Материалы". Именно в нем будут удалены дубликаты
Call RemDupes(Sheets("Материалы"))
End Sub

Или если надо удалять дубли на листе «Детали»:

Код
Private Sub CommandButton1_Click()
'передаем в функцию лист с именем "Детали". Именно в нем будут удалены дубликаты
Call RemDupes(Sheets("Детали"))
End Sub

Изменено: Дмитрий(The_Prist) Щербаков05.12.2022 17:51:11

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Всем большое спасибо! Помогло. Когда вносила корректировки в код забыла про Range(«l1») . Дмитрий, вам также спасибо за ссылку на статью, я обязательно ознакомлюсь.

 

MikeVol

Пользователь

Сообщений: 229
Регистрация: 20.10.2020

Ученик

#11

10.12.2022 21:11:02

Лидия Кунакова, Вот это вы Оперативно отвечаете на свои темы… Не прошло и пол года…

Студворк — интернет-сервис помощи студентам

Добрый день, вчера весь день искал себе подходящий способ решения своей задачи, но так и не нашел подходящий.
Прошу Вас помочь мне.

В приложенном Excel файле 2 таблицы:

Левая — исходные данные
Правая — какой должен получиться результат

Задача — сразу в нескольких колонках, удалить все дубликаты находящиеся только в одном столбце.

То есть если в одном столбце дважды (или несколько раз) попадается цифра «4» — то именно в этом столбце должна остаться только одна цифра «4».

Например: У нас в одном столбце восемь цифр: 1 2 3 4 1 2 3 4
Мы видим, что здесь последние четыре цифры 1 2 3 4 — дублируются, то есть на выходе должны остаться только первые четыре цифры 1 2 3 4

Я нашел пару макросов, как удалить дубликаты во всех столбцах, а не только в одном — и это не подходит.

Например: У нас есть два столбца:

1….5
2….6
3….5
4….6
1….1
2….2
3….3
4….4

То есть, на выходе должно получиться:

1…..5
2…..6
3…..1
4…..2
…….3
…….4

То есть, в первом столбце были удалены дублирующиеся последние четыре цифры (1 2 3 4), а во втором столбце дублирующиеся вторая и третья цифры (5 6).

Вот тут важно то, что во втором столбце последние цифры 1 2 3 4 — не дубликаты потому, что во втором столбце нет повторяющихся цифр 1 2 3 4.
Во втором столбце дублируются лишь 5 и 6.

А мои макросы оказывается удаляют дубликаты не в отдельном одном столбце из всей массы столбцов, а во всех столбцах сразу — виртуально объединив их в один.

Где в результате из нашего примера получается следующее:

1….5
2….6
3
4

Хотя, мне не нужно было, чтобы макрос удалял во втором столбце последние четыре цифры 1 2 3 4.

I have a worksheet with two columns: Date and Name. I want to delete all rows that are exact duplicates, leaving only unique values.

Here is my code (which doesn’t work):

Sub DeleteRows()

Dim rng As Range
Dim counter As Long, numRows As Long

With ActiveSheet
    Set rng = ActiveSheet.Range("A1:B" & LastRowB)
End With
numRows = rng.Rows.Count

For counter = numRows To 1 Step -1
    If rng.Cells(counter) Like rng.Cells(counter) - 1 Then
        rng.Cells(counter).EntireRow.Delete
    End If
Next

End Sub

It’s «Like rng.Cells(counter)-1» that seems to be the cause- I get «Type Mismatch».

Community's user avatar

asked Jun 7, 2013 at 16:25

4

There’s a RemoveDuplicates method that you could use:

Sub DeleteRows()

    With ActiveSheet
        Set Rng = Range("A1", Range("B1").End(xlDown))
        Rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
    End With

End Sub

answered Jun 7, 2013 at 16:40

fbonetti's user avatar

fbonettifbonetti

6,5823 gold badges33 silver badges32 bronze badges

5

The duplicate values in any column can be deleted with a simple for loop.

Sub remove()
Dim a As Long
For a = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If WorksheetFunction.CountIf(Range("A1:A" & a), Cells(a, 1)) > 1 Then Rows(a).Delete
Next
End Sub

Martijn Pieters's user avatar

answered Nov 23, 2016 at 17:04

kadrleyn's user avatar

kadrleynkadrleyn

3341 silver badge5 bronze badges

Excel VBA code to remove duplicates from a given range of cells. In the below data set we have given a list of 15 numbers in “Column A” range A1:A15.  Need to remove duplicates and place unique numbers in column B.

Sample Data: Cells A1:A15

Sample Data

Final Output:

VBA Code to remove duplicates and place into next column (B)

Declare Variables:

Variables Data Type Comments
nonDuplicate Boolean It is a Boolean value (True/False).
uNo Integer Count no of Unique items in column B
colA Integer Iteration column A cells
colB Integer Iteration column B cells
'Variable Declarations
Dim nonDuplicate As Boolean, uNo As Integer, colA As Integer, colB As Integer

Always first value will be unique, So A1 place to cell B1

'Place first value to B1
Cells(1, 2).Value = Cells(1, 1).Value

Initialize variables:

'Initialize uNo = 1 since first number is already placed in column B; Assign True to the variable nonDuplicate

uNo = 1

nonDuplicate= True

Since the first number is already placed in cell B1, Loop starts from A2 to A15.  Take each number from Column A and check with Column B (unique range)

'Use for loop to check each number from A2 to A15 
For colA = 2 To 15
    For colB = 1 To uNo

if the number is already placed in column B.  Assign False to the “nonDuplicate” variable.

        If Cells(colA, 1).Value = Cells(colB, 2).Value Then
            nonDuplicate= False
        End If

“nonDuplicate” is True then place to column B and increase uNo by 1

    'if nonDuplicate is true, place cell value in column B and increase uNo = uNo + 1
    If nonDuplicate = True Then
        Cells(uNo + 1, 2).Value = Cells(colA, 1).Value
        uNo = uNo + 1
    End If

Reset “nonDuplicate” variable 

'reset nonDuplicate to True
nonDuplicate = True

Close for loop

Next colA

Implementation:

Follow the below steps to remove duplicates using Excel VBA:

Step 1: Add a shape (VBA Remove Duplicates) to your worksheet  

Step 2: Right-click on “VBA Remove Duplicates” and “Assign Macro..”

Step 3: Select “removeDuplicates”, you can see a list of macros available in your workbook

Step 4: Save your excel file as “Excel Macro-Enabled Workbook” *.xlsm

Step 5: Click “VBA Remove Duplicates” to execute VBA code and see the output

Понравилась статья? Поделить с друзьями:
  • Excel увеличить значение ячейки на проценты
  • Excel удалить дубликаты в разных столбцах
  • Excel увеличить высоту строки по содержимому
  • Excel удалить дубликаты в диапазоне
  • Excel увеличение ячеек по содержимому