Страницы: 1
RSS
Дополнить макрос поиска в дубликатов с исключениями
 
Есть готовый макрос.
Но он работает не так как нужно. Что нужно добавить, чтобы в 3 колонку не копировались дубликаты.
В 1 колонке полный список, во 2ой исключения, в 3 колонку перенести полный список без дубликатов и без исключений.
Изменено: Marat Ta - 25.02.2021 12:28:52
 
Цитата
Marat Ta: Что нужно
написать новый - сейчас сделаю
На будущее: прикрепляйте код макроса под спойлер - так намного быстрее можно понять, стоит ли браться…

P.S.: Приветствие тоже лучше не игнорировать, но это уже по желанию  :)

UPD: код макроса и скрин
Изменено: Jack Famous - 25.02.2021 11:34:34
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Спасибо. Все работает как нужно.
Прошу извинить, что сразу не уточнил конкретику: нужно внести требуемые изменения в макрос файла-примера (задание по контрольной).
Изменено: Marat Ta - 25.02.2021 12:31:44
 
Цитата
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 - 25.02.2021 13:09:42
 
RAN, Спасибо. Изучаю код и смотрю что нужно подправить в файле примера. Нужно сдать именно файл пример с исправлениями.
Тема словарь и коллекция мною еще хорошо не изучена.
Изменено: Marat Ta - 25.02.2021 12:42:10
 
Цитата
Marat Ta: Тема словарь и коллекция мною еще хорошо не изучена
коллекций там нет (честно говоря, я вообще без них прекрасно обхожусь), а по словарям - вот хороший гайд
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Marat Ta написал:
что нужно подправить в файле примера
Алгоритм.
 
Как я понял - есть проверка дубликатов для исключений при перегрузке в словарь, но нет для основного списка?
Нужно добавить точно такие же строки кода для диапазона колонки 1.

Понял где ловушка в задаче, там просто перекопируется колонка 1 в 3 с проверкой через словарь (с 2 колонки)
А 2ой словарь для 1 колонки даже не используется.  
 
Добавил комментарии к коду
 
Может так требуется исправить ...
 
Александр Макаров, Спасибо. То, что нужно.
И всего то 3 новые строчки кода. Супер.

2 других варианта еще лучше, но нужен был с макросом из файла примера и с раскраской желтым фоном.
Изменено: Marat Ta - 25.02.2021 14:30:48
 
RAN,  а как убрать ошибку выполнения в вашем коде, если в списке исключения менее 2 фамилий. Похожая проблема и в моем файле примере.
Изменено: Marat Ta - 25.02.2021 16:38:46
 
Marat Ta,
Код
Dim x
ar = … .Value
If Not IsArray(ar) Then ar = Array(ar)

        For Each x In ar
            oDic(x) = oDic(x) + 1
        Next x
если бы изучили мой код, то этого вопроса бы не было
Изменено: Jack Famous - 25.02.2021 17:10:23
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
собрал в кучу

Код
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
Изменено: New - 25.02.2021 17:54:05
 
Спасибо всем за помощь и ответы. Вопрос закрыт.
Изменено: Marat Ta - 25.02.2021 17:58:19
Страницы: 1
Наверх