Страницы: 1 2 След.
RSS
Поиск дубликатов по части текста
 
Мне очень понравилась статья в Приемах с условным форматированием. Т.е. при найденном повторном значении ячейки выделяются в определенный цвет.    
А что делать, если допустим есть База данных клиентов и один из клиентов оставляет 2 мобильных телефона или мобильный и городской и я вбиваю их через запятую в ячейку. Затем через месяц вношу того же самого клиента, но он, допустим оставил уже только мобильный телефон. И на этот раз программа уже не выделит ячейки с одинаковыми телефонами. Как быть, если мне нужен поиск дубликатов по части текста. Допустим:  
1 ячейка _____89262338888  
2 ячейка _____7828898, 89262338888  
Мне необходимо, что программа отловила и посчитала такие записи как дубликаты.    
Возможно ли это сделать?
 
{quote}{login=MilanAC}{date=19.01.2012 10:58}{thema=Поиск дубликатов по части текста}{post}...один из клиентов оставляет 2 мобильных телефона или мобильный и городской и я вбиваю их через запятую в ячейку. Затем через месяц вношу того же самого клиента...{/post}{/quote}  
Картина маслом :)  
Клиент ушел и забыл 2 телефона. Менеджер, дабы не потерять их, находит в камере хранения пустую ячейку и чем-то тяжелым вбивает телефоны в ячейку (видимо, ячейка маленькая). Чтобы не повредить технику, прокладкой служит какая-то запятая. И только через месяц вносит в офис клиента, который перед дверью впал в кому при виде такого издевательства над своей аппаратурой.  
 
Спасибо, повеселились :)  
 
По делу - нужен файл.
 
У клиентов наверное и ФИО есть. По ним и ищите.
Я сам - дурнее всякого примера! ...
 
{quote}{login=vikttur}{date=19.01.2012 11:07}{thema=Re: Поиск дубликатов по части текста}{post}{quote}{login=MilanAC}{date=19.01.2012 10:58}{thema=Поиск дубликатов по части текста}{post}...один из клиентов оставляет 2 мобильных телефона или мобильный и городской и я вбиваю их через запятую в ячейку. Затем через месяц вношу того же самого клиента...{/post}{/quote}  
Клиент ушел и забыл 2 телефона. Менеджер, дабы не потерять их, находит в камере хранения пустую ячейку и чем-то тяжелым вбивает телефоны в ячейку (видимо, ячейка маленькая). Чтобы не повредить технику, прокладкой служит какая-то запятая. И только через месяц вносит в офис клиента, который перед дверью впал в кому при виде такого издевательства над своей аппаратурой.  
Спасибо, повеселились :)  
По делу - нужен файл.{/post}{/quote}  
 
Так, добавка к истории. А что если если клиент звонил и оставлял домашний номер и мобильный, просто узнавая цены. Затем через месяц его осенило, ему нужна наша услуга, но телефон он потерял (дураком оказался, пошел в клуб, всю ночь протанцевал, телефон украли или потерял:))?; а что если так получилось (совпадение или случайность), но почему-то после 1 обращения в компанию он решил номер поменять?  
 
KukLP представьте Себе, база из 10000 и в ней однофамильцы и одноименцы.  
 
Файл прикрепил, красным цветом выделил, что хотелось бы отлавливать
 
сорри
 
Хорошая база. Звоните по телефону Васе Пупкину Ивановичу, а связываетесь с Васей Пупкиным Ивановичем, который "однофамилец и одноименец", но никак не тот, который нужен.  
 
1. При возможности дублей в любой базе должны быть идентификаторы.  
2. Вы хотите применить УФ ко всему диапазону в 10000 записей? Нужно думать о макросе, ибо формула будет формулой массива или нужно применять доп. столбцы.
 
{quote}{login=vikttur}{date=19.01.2012 11:41}{thema=}{post}Хорошая база. Звоните по телефону Васе Пупкину Ивановичу, а связываетесь с Васей Пупкиным Ивановичем, который "однофамилец и одноименец", но никак не тот, который нужен.  
 
1. При возможности дублей в любой базе должны быть идентификаторы.  
2. Вы хотите применить УФ ко всему диапазону в 10000 записей? Нужно думать о макросе, ибо формула будет формулой массива или нужно применять доп. столбцы.{/post}{/quote}  
Хорошо, а если вместо ФИО Вносится только ИО. Я об этом случае. К примеру звоните Вы в компанию интересуетесь ценами. Не будете же Вы оставлять Вашу фамилию, имя и отчество, это же абсурд, максимум, что вы оставите имя, отчество.  
С идентификаторами не хочется связываться. Скорее макрос через Worksheet_Change.  
 
Если разделять все телефоны по ячейкам, то потом замучаешься объединять ячейки клиентов
 
MilanAC  
 
1) скорее всего нужен макрос  
 
2) номера написанные по-разному будут считаться разными, т.е. номер +7(926)555-55-55,    
8-926-555-55-55,    
89265555555,    
8(926)555-5555,    
8(926)555-55-55  
 
это один номер, но программа будет считать, что это 5 различных номеров.  
 
Если вы всегда вводите телефон как 89265555555 - то тут можно подумать о макросе
 
{quote}{login=Ластик}{date=19.01.2012 11:56}{thema=}{post}MilanAC  
 
1) скорее всего нужен макрос  
 
2) номера написанные по-разному будут считаться разными, т.е. номер +7(926)555-55-55,    
8-926-555-55-55,    
89265555555,    
8(926)555-5555,    
8(926)555-55-55  
 
это один номер, но программа будет считать, что это 5 различных номеров.  
 
Если вы всегда вводите телефон как 89265555555 - то тут можно подумать о макросе{/post}{/quote}  
Конечно есть определенные правила внесения информации в Базу Данных.  
Если это прямой номер с кодом (495), то он опускается. Т.е. к примеру номер +7(495)5550000 вносится как 5550000.  
Все номера вбиваются строго через 8, без всякий скобок, +7, тире и пробелов:  
89265556655.  
Если это городские коды с любым кодом, кроме 495, то порядок такой:  
84997825555.  
Это правила внесения информации в базу данных.  
Поэтому, я и хочу что-то с макросом иметь
 
И еще к слову.  
Например, когда в интернете на web-страницы нужно найти слово или фразу, то через CTRL+F, программа находит все варианты. Принцип поиска нужен такой же, чтобы он выделял эти ячейки. Да, возможно в Экселе не получится сделать, чтобы он часть текста в ячейке выделял цветом, но фиг с ним. Пусть хотя бы выделяет всю ячейку, чтобы сразу можно было понять, что такой телефон где-то в Базе уже есть
 
1) Телефонные номер вбиваются в столбец В с ячейки А2 и ниже?  
2) что макрос доложен делать, если найден такой же телефон? Просто окрасить ячейку красным цветом?  
 
P.S. Я думаю, придумаем сегодня что-нибудь с макросом, если ни я то, другие
 
{quote}{login=Ластик}{date=19.01.2012 12:06}{thema=}{post}1) Телефонные номер вбиваются в столбец В с ячейки А2 и ниже?  
2) что макрос доложен делать, если найден такой же телефон? Просто окрасить ячейку красным цветом?  
 
P.S. Я думаю, придумаем сегодня что-нибудь с макросом, если ни я то, другие{/post}{/quote}  
1) Да, с ячейки А2, т.к. А1 это название колонки  
2) Да, окрасить в какой-либо цвет.
 
Интересно, а в записную книжку мобильника Вы тоже оба номера через запятую записываете?  
Заносите каждый номер в свою ячейку строки - и проблем будет меньше, вполне УФ справится.  
Можно разбить базу по столбцам. И зачем затем телефоны объединять? Хотя и это тоже несложно сделать одной простой формулой.  
А так конечно макросом на словаре можно проверку сделать (вроде уже была аналогичная задача, что-то такое помню делал).  
Вроде так - цикл по ячейкам (по массиву), внутренний по номерам - заносим в словарь номер и адрес/номер ячейки.  
При повторе красим повтор и ячейку первого вхождения (достаём адрес из словаря).  
Можно повесить на изменение ячеек - каждый раз сперва убирать всю покраску и красить заново повторы по всей базе.  
Кстати, если разбить номера по ячейкам - то такой подход тоже сработает, но вероятно будет быстрее работать.
 
см. файл. Потестируйте, я особо не тестировал  
 
Не стал красить первую ячейку, будет ограшиваться текущая ячейку, куда вводится номер. Если он уже есть в базе эта ячейка станет красной. Удалите всё из ячейки, она станет бесцветной
 
{quote}{login=Ластик}{date=19.01.2012 12:33}{thema=}{post}см. файл. Потестируйте, я особо не тестировал  
 
Не стал красить первую ячейку, будет ограшиваться текущая ячейку, куда вводится номер. Если он уже есть в базе эта ячейка станет красной. Удалите всё из ячейки, она станет бесцветной{/post}{/quote}  
При вводе любого нового неповторного номера текущая ячейка становится красной. Т.е. даже если такого номера в базе нет
 
подкорректировал )
 
{quote}{login=Ластик}{date=19.01.2012 01:04}{thema=}{post}подкорректировал ){/post}{/quote}  
При редактировании уже существующего телефона происходит всегда заливка в красный цвет.  
И если я изменяю одну цифру из того номера, который уже существует (т.е. номер становится уникальным), заливка не пропадает
 
да.. есть такое... надо подумать )
 
а если так? ))
 
Ну не с нуля писать легче :)  
Попаразитировал чуть...  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
   If Intersect(Target, Range("B:B")) Is Nothing Then Exit Sub  
   Dim oDict As Object, ArrTel(), i&, iStr, iTel$, n&  
   Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row).Interior.ColorIndex = 0  
   ArrTel = Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row).Value  
   Set oDict = CreateObject("Scripting.Dictionary")  
   For i = LBound(ArrTel) To UBound(ArrTel)  
       iStr = Split(ArrTel(i, 1), ",")  
       For n = LBound(iStr) To UBound(iStr)  
           iTel = Application.Trim(iStr(n))  
           If iTel <> "" Then  
               If Not oDict.Exists(iTel) Then  
                   oDict.Item(iTel) = i    'vbNullString  
               Else  
                   Range("B" & oDict.Item(iTel)).Interior.ColorIndex = 3  
                   Range("B" & i).Interior.ColorIndex = 3  
               End If  
           End If  
       Next n  
   Next i  
End Sub  
 
 
P.S. коррекции Ластика не смотрел - это из его первой версии переделано.
 
Ещё такое дополнение:  
 
           If iTel <> "" Then  
           iTel = Replace(iTel, " ", "")  
           iTel = Replace(iTel, "(", "")  
           iTel = Replace(iTel, ")", "")  
           iTel = Replace(iTel, "-", "")  
               If Not oDict.Exists(iTel) Then  
 
Тогда    
(25)15-68  
251568  
25   1568  
2   5   15-   68  
 
будут считаться одинаковыми.
 
{quote}{login=Ластик}{date=19.01.2012 01:22}{thema=}{post}а если так? )){/post}{/quote}  
Отлично, теперь работает.  
 
Один только минус. Возможно ли его как-то подправить?    
Ситуация:  
1) внес номер  
........  
2) внес повторно этот же номер  
Далее: Зашел на 1) отредактировал одну цифру в номере, нажал Энтер.  
И в записи 2) осталась заливка, хотя повтора уже нет. Да конечно, если я зайду на ячейку 2) - 2 раза нажму для редактирования, ничего не меняя нажму Энтер, то заливка снимется. А можно ли это автоматизировать?  
 
 
 
 
Hugo, сейчас гляну Ваш код
 
Hugo очень интересное решение. Только я не понял куда дополнение вставлять, у меня ошибку выдает Block If Without End If  
Я вставлял в конец того кода
 
Надо не в конец, а  
 
iTel = Replace(iTel, " ", "")  
iTel = Replace(iTel, "(", "")  
iTel = Replace(iTel, ")", "")  
iTel = Replace(iTel, "-", "")  
 
 
между существующими  
If iTel <> "" Then  
и  
If Not oDict.Exists(iTel) Then  
 
Т.е. берём значение, чистим от мусора, заносим или сравниваем по словарю.
 
Hugo и Ластик огромное спасибо за помощь, теперь все работает так как я и хотел ;)
 
Hugo, одна проблема возникла, когда выделяю несколько ячеек с телефонами, а затем удаляю, то с удаленных участков фон остается красным и он не уходит до тех пор, пока я в эти участки не вобью что-то новое. Как-то это возможно исправить?  
 
2) А Option Explicit обязательно оставлять. Дело в том, что если оставлять, то у меня вылетает и оставляет ошибку. Если убираю, то нормально работает
 
1. Есть такое дело. Потому что обрабатывается диапазон с данными. Если данных уже нет - то соответственно не обрабатывается, и заливка не меняется.  
Но можно изменить -    
Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row).Interior.ColorIndex = 0  
на  
Range("B:B").Interior.ColorIndex = 0  
или лучше на  
Intersect(Range("B:B"), ActiveSheet.UsedRange).Interior.ColorIndex = 0  
 
Так будет убираться заливка всего столбца. Не знаю, будет ли это дольше, чем только в данных заливку убрать...  
 
2.Option Explicit заставляет объявлять все переменные. Можно это и не делать - работать будет. Но лучше объявлять и использовать Option Explicit - тогда никогда не перепутаете с и c, a и а.
 
{quote}{login=Hugo}{date=23.01.2012 02:05}{thema=}{post}  
1.  
2.{/quote}  
 
1. Да хорошо. При наборе нового номера в любую ячейку заливка исправляется, это то, что надо  
2. Как я понимаю, если я больше не буду лезть в макросы на этом листе и ничего не буду поправлять в кодах (будучи уверен на 100%, что все переменные введены на правильном языке), необходимости прописывать этот Option Explicit нет.  
Дело в том, что у меня на этом листе при изменении данных в ячейки каждый раз производится выполнение макроса (автоподбор высоты и ширины, перенос строк на другой лист по 2 критериям, пересчет листа) и если я ввожу этот код, то выдает ошибку. Поэтому и не хочу прописывать его. Без него ничего не выкидывает.  
 
За макрос Hugo и Ластик еще раз спасибо, очень нужная вещь, особенно с учетом того, что люди любят эти скобки и тире ставить где попало ;)
 
Hugo, за что отвечает этот код?  
If Target.Cells.Count > 1 Then Exit Sub  
 
Что-то конфликтовать начал.
 
Если количество изменённых ячеек больше одной - выход из кода.  
Т.е. обрабатываем только вводимые вручную данные, не кучей копипащенные.  
Если есть желание обрабатывать кучу - нужно усложнять код.  
Но - хорошая новость - для данной работы можно эту строку закомментировать, она не нужна! :)  
 
А насчёт конфликта не понял - это как? По идее просто ничего не должно происходить...
Страницы: 1 2 След.
Читают тему
Loading...