Naohh
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору [excel функция нечёткое неполное совпадение поиск пересечение] Вопрос о старом: "поиск неполного совпадения выбранного текстового значения в диапазоне. например сравнивая СибТлк-6об и интлкот7 есть пересечение ТЛК" найденные методы не подходят, прошу помощи правильно дописать идею на VBA. На сколько понял для экселя есть только одна подобная функция fuzzy_search\fuzzy_ВПР Не самая удачная, конечно, но хоть что-то. В связи с чем хочется реализовать один из более подходящих механизмов поиска нечётких совпадений. Реализовать самостоятельно не хватит знаний либо времени ((( Прошу о помощи, если кому не составит труда написать пользовательскую функцию по представленной ниже идее #### Синтаксис: Код: Function fuzzy_search( stToFind As String, ЧТО искать rgLookup As Range, ГДЕ искать Optional jIndex As Integer = 0, ИНДЕКС в списке вараинтов с вероятными совпадениями (0 или 1 не принципиально) Optional iTolerance As Integer = 2, ОБЪЁМ пересечения fuzzy_search = string искомого сопадения из ГДЕ | #### Логика: Считается кол-во одинаковых пар(iTolerance = 2) букв СибТлк-6об >> Си иб бТ Тл лк к- -6 6о об интлкот7 >> ин нт тл лк ко от т7 Тут будет две одинаковые пары [тл] [лк] #### Механизм: Код: fuzzy_search( "СибТлк-6об" ; Range включающий "интлкот7" ; 0 ; 2 ) Dim i, rez As Integer, cc As Range, stPattern As String fuzzy_search="Н/Д" Dim Array1( length(rgLookup), 2 ) As Integer 'массив для дальнейшей сортировки наиболее вероятных совпадений Array1( length(rgLookup), 1 ) = rgLookup.Range For Each cc In rgLookup rez = 0 For i = 1 To Len(stToFind) - iTolerance + 1 'сдвиг If cc Like ("*" & Mid(stToFind, i, iTolerance) & "*") Then rez = rez + 1 '(по возможности без учёта регистра, раскладки(рус или английские А В Н К и прочие; не уверен что like для этого подойдёт) Next Array1( номер текущего СС из rgLookup, 2 ) = rez 'Сосчитать кол-во одинаковых пар Next отсортировать Array1 по "кол-ву совпадений", где на 0м\1ом месте наиболее вероятные(больше кол-во своп.) fuzzy_search = Array1 (jIndex) End Function | ####: помогите кому легко кодить на VBA!! пожалуйста. Не могу без слёз смотреть на проходящее время за сверкой полей. (Можно предложить чуть продвинутый вариант с автоматическим итеративным сравнением в группах от 3х и более букв, использование сдвига и расчёта индекса схожести, но тут можно самому сдвинуться, и от-того излишне) | Всего записей: 1 | Зарегистр. 01-05-2009 | Отправлено: 23:14 01-05-2009 | Исправлено: Naohh, 23:21 01-05-2009 |
|