Страницы: 1
RSS
VBA-Как найти дубли в таблице
 
Добрый день!

Есть таблица из 3х столбцов, в первом столбце содержатся хэш-суммы файлов, во втором-путь к папке, где лежит файл, в третьем-имя файла.
Нужно найти дублирующиеся папки (папки с одинаковыми наборами файлов, т.е. хэш-суммы будут одинаковы, а пути-отличаться), причем этот процесс нужно автоматизировать (вариант "ручками" при помощи сводной не прокатил).

Есть вариант с разделением исходной таблицы на отдельные таблицы(по папкам). Но пока не представляю, как потом сравнивать все папки между собой-папок около 50 штук. Либо, возможно, есть вариант без разделения на таблицы?

Заранее благодарю за любую помощь.
Изменено: grace_kelly - 25.09.2018 15:51:32 (добавление файла)
 
мб так?
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
Цитата
Александр написал:
мб так?
Или мб так?
Никто же не знает, в каком виде Вам результат нужен.
В названии темы - VBA.
Вот  простой вариант перебора ячеек, но нужно ждать, пока все это  обработается, на моем стареньком ноутбуке не меньше 30 - 50 сек. требуется для данных в примере.
Наверняка это можно сделать быстрее с применением массивов, но я пока этого не умею    (хотя... все равно исходник наверное поочередно перебирать придется, не знаю пока... словари пока для меня - темный лес)
Проверьте, если операция одноразовая - то может и устроит.
Хотя.... говорят, если строк более 4000 может вообще очень долго думать или вообще зависнуть... Хотя... Может, терпения не хватает... или может, от версии или от железа зависит - не знаю...
 
Цитата
_Igor_61 написал:
словари пока для меня - темный лес
- есть у меня практически готовый пример кода, скорректировал только вывод (чисто демонстрация перебора содержимого, для задачи не нужно):
Код
Option Explicit

Sub Perebor() ' словарь в словаре
    Dim a, i&, t$, Dic As Object, Dic2 As Object
    Dim el, col
    
    a = Range("C2", Cells(Rows.Count, "A").End(xlUp)).Value
    Set Dic = CreateObject("Scripting.Dictionary")
    With Dic
        .CompareMode = 1
        For i = 1 To UBound(a)
            t = a(i, 2)
            If Not .exists(t) Then .Add t, CreateObject("Scripting.Dictionary")
            .Item(t).Item(a(i, 1)) = a(i, 3)
            
        Next
    End With
    
    For Each el In Dic.keys
        Debug.Print "В каталоге " & el
        Set Dic2 = Dic.Item(el)
        For Each col In Dic2.keys
            Debug.Print "С хэшем " & col & " должен быть файл" & Dic2.Item(col)
        Next
        Debug.Print "Переход в каталог " & el
    Next

End Sub

Нужно сюда навесить ещё один словарь, где ключём ставить хэш, а итемом каталог.
Далее проверяете свои файлы, вероятно циклом по каталогам, в нём по файлам - берёте хэш проверяемого первого файла, сверяетесь с словарём хэшей - если есть, то извлекаете (в копию) из словаря словарей словарь конкретного каталога с всеми другими хэшами (ключ для поиска берёте из первого словаря, где ключи хэши). и проверяете чтоб все хэши/файлы из конкретного проверяемого каталога были в этом словаре, можно проверить и чтоб не было лишних там и там, в общем смотря что нужно.
Ну а если сразу хэш не нашли - можно вероятно брать следующий первый файл следующего каталога.
Ну как-то так, не сложно в целом :)
Изменено: Hugo - 25.09.2018 22:31:14
 
Hugo,большое спасибо, что помогаете найти дорожку в темном лесу!

Не смогу быстро во всем разобраться (разберусь обязательно, что не пойму - буду спрашивать), но на первый взгляд сразу вопрос: откуда берутся (т.е. когда и как и каким образом) присваиваются значения вот этим зверькам: el и col? А поскольку это не понял, => непонятно, как Dic2 получился, т.к. он на el ссылается...

Сколько же мне еще нужно узнать из всего того, что пока не знаю...  :)  хватило бы времени...
 
А может, все таки вручную?

ps. на все ушло не более 5 минут, с учетом составления формул (два скрытых столбца и УФ)
Изменено: Михаил С. - 26.09.2018 01:54:11
 
Михаил С., +++!  :)

Очень наглядно - все по строкам. Знать бы еще, что и в каком виде ТС хочет...

Пусть выбирает, варианты есть, форум работает!
 
Цитата
_Igor_61 написал:
откуда берутся (т.е. когда и как и каким образом) присваиваются значения вот этим зверькам: el и col
- в строках 13 и 14
Если нет элемента в верхнем словаре - он заводится, далее в любом случае в словарь этого элемента словаря добавляется значение.
 
Спасибо всем ответившим!

На выходе должны быть папки в таком виде, как в прикрепленном файле, то бишь, совпадающие по содержимому папки как бы в сравнении.

Вариант Hugo кажется наиболее подходящим, поэтому попробую поиграть с ним, т.к. словари уже использую в этой программке.
Но пока еще можно предлагать варианты:)

Вручную, повторюсь-не вариант, т.к. нужно автоматизировать этот процесс для выполнения его периодически пользователями.
 
Hugo,спасибо!
Страницы: 1
Наверх