Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2013, 17:04   #1
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию Проблема с удалением дубликатов

Добрый день, уважаемые форумчане!
За последнюю неделю третий раз сталкиваюсь с такой проблемой. Данные с сайты выгружаются в эксель, затем фильтруются и переносятся в файл. В файле происходит удаление дубликатов по двум столбцам, в которых номера. Удаление дубликатов происходит стандартным способом экселя выделением диапазона и через Данные - Удалить дубликаты. Так вот третий раз за эту неделю этот процесс перестает срабатывать. Вот во вложении эти два столбца с номерами. Для примера строки 255 и 478 содержат одинаковые пары номеров 5013737 и 1686704. Но не воспринимаются как дублирующиеся строки и не удаляются. Разбирал пары по-символьно - одинаковые. Лишнего вроде нет и коды символов совпадают. При переносе, допустим, этих двух пар в другое место на листе путем копипаста и опять же применив стандартную процедуру удаления дубликатов пары воспринимаются как дубликаты и одна из пар удаляется.
Что может быть не так? Важно разобраться, чтоб исключить такую проблему в будущем. Помогите разобраться.
Заранее спасибо!!!
Вложения
Тип файла: rar дубликаты.rar (15.1 Кб, 17 просмотров)
strannick вне форума Ответить с цитированием
Старый 27.09.2013, 17:56   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да там таких вона сколько:

5013737|1686704 2
5013738|1755541 2
5013739|1734858 2
5013741|1733236 2
5013744|1694795 2
5013745|1745706 2
5013746|1718584 2
5013750|1714054 2
5013754|1742480 2
5013756|1739603 2
5013757|1713681 2
5013758|1695552 2
5013762|1681968 2
5013764|1674356 2
5013765|1707332 2
5013767|1689751 2
5013769|1739702 2

Почему не удаляет - не знаю... 2003 у меня тут
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.09.2013, 18:17   #3
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

кажется понял почему... эксель отказывается(негласно) искать по всему диапазону когда в строке содержится символ(ы),например вот 4682838аа. ради интереса удалил все такие строки и все прокатило.
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 27.09.2013 в 18:20.
SaLoKiN вне форума Ответить с цитированием
Старый 27.09.2013, 19:43   #4
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Да там таких вона сколько:

Почему не удаляет - не знаю... 2003 у меня тут
Конечно много. Я одну пару привел для примера. А их там таких целый набор.
Цитата:
кажется понял почему... эксель отказывается(негласно) искать по всему диапазону когда в строке содержится символ(ы),например вот 4682838аа
Вот тут и вопрос. 4682838аа - "аа" в конце это я добавлял для исключения из обработки. Это как раз те пары, которые ранее загрузились в автомате и не удалились как дубликаты. Я их пометил путем добавления "аа" в конце и исключил из обработки. Ранее просто есть без "аа" и они с сегодня загруженными опять не воспринялись как дубликаты. Есть большое подозрение, что сто-то не так с данными при выгрузке с сайта. То ли кодировка гуляет, то ли еще что-то. Вот тут сам не могу понять, хоть тресни. Процедура стандартная, отработала более года без сбоев, а тут такое горе. Либо надо прописывать другую процедуру, либо еще что-то. Но удивительно то, что стандарт не работает.
strannick вне форума Ответить с цитированием
Старый 27.09.2013, 20:39   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Но словарь эти повторы распознаёт. Перепишите процедуру с использованием словаря, не ломайте голову.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.09.2013, 21:20   #6
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Но словарь эти повторы распознаёт. Перепишите процедуру с использованием словаря, не ломайте голову.
В оригинальном файле данные грузятся диапазоном со столбца E по V. Пары номеров, по которым определяются дубликаты, расположены в столбцах F и U. Как можно в таком варианте применить словарь? Чисто практически)))
strannick вне форума Ответить с цитированием
Старый 27.09.2013, 21:28   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да какая макросу разница? Как сделаете, так и будет - ну возьмите в два параллельных массива, чтоб память пожалеть, проверяйте по словарю, номера строк-повторов в коллекцию, затем из коллекции делаете union и удаляете. Или сразу в union, если больше не нужны. Ну или иначе как-нибудь - хоть просто перебором коллекции с конца удалять строки по одной.
Или создать массив, понаставить туда сразу меток, в конце выгрузить на лист, отсортировать диапазон по меткам, всю кучу удалить. Как ZVI делал - супербыстро на любом количестве строк.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.09.2013, 21:48   #8
Czeslaw
Пользователь
 
Регистрация: 08.07.2013
Сообщений: 95
По умолчанию

Удалите все ненужные (лишние)пробелы и всё будет в порядке.
Czeslaw вне форума Ответить с цитированием
Старый 27.09.2013, 22:09   #9
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Существующие данные в словарь? а загруженные сравнивать со словарем по двум столбцам и удалять? Что-то типа:

Код:
iLastRow1 = sh.Cells(Rows.Count, 1).End(xlUp).row 'последняя заполненная строка перед загрузкой данных
a = sh.Range("F5:V" & iLastRow1).Value     'массив существующих данных, которые будем сравнивать с загружаемыми данными
Set oDict1 = CreateObject("scripting.dictionary")
    For x = 1 To UBound(a)    'наполняем словарь
    For xx = 1 To 17 'столбцы с E по V
        oDict1.Item(a(x, xx)) = x
    Next
    Next

iLastRow2 = iLastRow2 + 1 'первая строка загруженных данных
iLastRow3 = sh.Cells(Rows.Count, 1).End(xlUp).row 'последняя заполненная строка загруженных данных
For i =  iLastRow2 To iLastRow3   'цикл от первой до последней строки загруженных данных
u = sh.Cells(i, 6) & sh.Cells(i, 21) 'сцепка ячеек столбцов F и U, в которых пары номеров для сравнения 
If oDict1.Exists(u) Then 'вот тут как сравнить с парой номеров в нужных столбцах из словаря???
'тут удаляем если совпало

End If
Next
strannick вне форума Ответить с цитированием
Старый 27.09.2013, 22:13   #10
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Czeslaw Посмотреть сообщение
Удалите все ненужные (лишние)пробелы и всё будет в порядке.
да вроде нету там лишних пробелов... или я прогавил?
strannick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сбор данных из нескольких листов на один с удалением дубликатов, но суммированием значений strannick Microsoft Office Excel 4 10.04.2012 19:18
Проблема с удалением файла Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 25.06.2011 20:15
проблема с удалением файла katttes Общие вопросы Delphi 3 30.04.2010 13:17
поиск дубликатов файлов(имя, тип, размер). Вывод дубликатов на экран с отображением их пути faraon1792 Помощь студентам 4 19.03.2010 23:46
Проблема с удалением файлов. Dj_smart Общие вопросы Delphi 4 22.03.2008 12:32