Есть готовый макрос. Но он работает не так как нужно. Что нужно добавить, чтобы в 3 колонку не копировались дубликаты. В 1 колонке полный список, во 2ой исключения, в 3 колонку перенести полный список без дубликатов и без исключений.
написать новый - сейчас сделаю На будущее: прикрепляйте код макроса под спойлер - так намного быстрее можно понять, стоит ли браться…
P.S.: Приветствие тоже лучше не игнорировать, но это уже по желанию
UPD: код макроса и скрин
Код
Option Explicit
'====================================================================================================
Sub GetUniq()
Dim dDel As New Dictionary, dic As New Dictionary
Dim rng As Range
Dim x, arr, arrOut(), r&
Set rng = Range("B2:B3")
arr = rng.Value
If Not IsArray(arr) Then arr = Array(arr)
For Each x In arr
dDel(x) = 0
Next x
Set rng = Range("A2:A7")
ReDim arrOut(1 To rng.Count, 1 To 1)
arr = rng.Value
If Not IsArray(arr) Then arr = Array(arr)
For Each x In arr
If Not dDel.Exists(x) Then
If Not dic.Exists(x) Then
r = r + 1
dic.Add x, 0
arrOut(r, 1) = x
End If
End If
Next x
If r = 0 Then Exit Sub
Range("C2").Resize(r, 1).Value = arrOut
End Sub
'====================================================================================================
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, Спасибо. Все работает как нужно. Прошу извинить, что сразу не уточнил конкретику: нужно внести требуемые изменения в макрос файла-примера (задание по контрольной).
Marat Ta: нужно внести требуемые изменения в макрос файла-примера
я пас
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Sub qq()
Dim oDic As Object, ar, i&
Set oDic = CreateObject("Scripting.Dictionary")
With ActiveSheet
ar = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)).Value
' удаляем дубликаты из массива
For i = 1 To UBound(ar)
oDic.Item(ar(i, 1)) = oDic.Item(ar(i, 1)) + 1
Next
ar = .Range(.Cells(2, 2), .Cells(Rows.Count, 2).End(xlUp)).Value
' удаляем исключения из словаря
For i = 1 To UBound(ar)
If oDic.Exists(ar(i, 1)) Then oDic.Remove (ar(i, 1))
Next
ar = oDic.keys
.Cells(2, 3).Resize(oDic.Count) = Application.Transpose(ar)
End With
End Sub
PS ## 3 и 4 вероятно, застряли в пробке, и появились только после моего ответа
PPS
Цитата
' Загрузка в одномерный массив данных со списка "Что удалить" arr = .Range(.Cells(2, 2), .Cells(Rows.Count, 2).End(xlUp)).Value
RAN, Спасибо. Изучаю код и смотрю что нужно подправить в файле примера. Нужно сдать именно файл пример с исправлениями. Тема словарь и коллекция мною еще хорошо не изучена.
Marat Ta: Тема словарь и коллекция мною еще хорошо не изучена
коллекций там нет (честно говоря, я вообще без них прекрасно обхожусь), а по словарям - вот хороший гайд
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Как я понял - есть проверка дубликатов для исключений при перегрузке в словарь, но нет для основного списка? Нужно добавить точно такие же строки кода для диапазона колонки 1.
Понял где ловушка в задаче, там просто перекопируется колонка 1 в 3 с проверкой через словарь (с 2 колонки) А 2ой словарь для 1 колонки даже не используется.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Sub qq()
Dim oDic As Object, ar, x, i As Long, LastRow As Long
'создаём объем Словарь для его последующего использования в формировании уникальных значений
Set oDic = CreateObject("Scripting.Dictionary")
With ActiveSheet
'данные из столбца А
ar = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)).Value
' удаляем дубликаты из массива
For i = 1 To UBound(ar)
oDic.Item(ar(i, 1)) = oDic.Item(ar(i, 1)) + 1
Next
'данные из столбца В
LastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
ar = .Range(.Cells(2, 2), .Cells(2, 2)).Value
'если в столбце В ничего, кроме заголовка нет, то нечего исключать из массива
If LastRow > 1 Then
'удаляем исключения из словаря
'если в списке 1 позиция, то переводим ar в массив
If Not IsArray(ar) Then
ar = Array(ar, 1)
For Each x In ar
If oDic.Exists(x) Then oDic.Remove (x)
Next x
Else
'удаляем исключения из словаря
For i = LBound(ar, 1) To UBound(ar, 1)
If oDic.Exists(ar(i, 1)) Then oDic.Remove (ar(i, 1))
Next
End If
End If
'перекладываем уникальные ключи из объекта Словарь в массив
ar = oDic.keys
'очистка столбца С
LastRow = .Cells(.Rows.Count, 3).End(xlUp).Row
If LastRow > 1 Then .Range("C2:C" & LastRow).ClearContents
.Cells(2, 3).Resize(oDic.Count) = Application.Transpose(ar)
End With
End Sub