Новости:

Интересные и полезные статьи по работе с Excel и VBA
можно найти в разделе ХИТРОСТИ

Главное меню

Поиск ряда определенных символов

Автор Nurbol, 26.04.2018, 20:10:25

« назад - далее »

Nurbol

Добрый день
В общем такая задача.
Необходимо определить поступившие платежи по назначению в соответствии с ФИО договора.
Все платежи поступают на один текущий счет

в банковской выписке в назначении платежа, либо в графе отправитель, либо в графе БИН/ИИН есть необходимые данные.
по отправителю и по БИН/ИИНу поиск осуществлять не особо составляет труда.
а вот в поле "Назначение платежа" бухгалтера разных компаний пишут кто во что горазд.
кроме суммы, могут написать ФИО, или ИИН, или РНН, или СИК или номер исполнительного листа, либо решение суда.
Есть отдельный файл, в котором в разных графах имеется вся эта информация. Эта информация состоит из цифр, символов "№", "-", "/", или "FV". Например, ИИН - это 12 подряд цифр, номер исполнительного листа может быть вида "№23-75/1", решение суда - вида "FV 12-54". В любом случае, длина полей, и содержимое - может быть разное. Даже для одной графы.
Набор записей этого файла - больше 120 тыс. Это портфель просроченной задолженности

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

vikttur

Вы только пожаловаться или пример все же покажете?

Nurbol

Простите.
Файл прошу после прочтения съесть и уничтожить.

там два листа:
1. банковская выписка
2. Некая таблица, выполняющая роль базы для поиска.

Наши девочки из назначения платежа (в выписке) копируют более-менее осмысленный набор цифр-символов.
затем запускают поиск через CTRL+F в базе. находят соответствующего человека.
и сажают платеж на него.

Nurbol

Так никто ничего и не скажет?

Nurbol


Дмитрий Щербаков(The_Prist)

Цитата: Nurbol от 28.04.2018, 09:21:06Ну же!
Ознакомьтесь с правилами форума. Подъем темы бессмысленными сообщениями, цель которых только сам подъем темы запрещен.
В следующий раз будете привлекать внимание подобным образом - тему закрою.
Здесь все помогают по собственному желанию в свободное время и вникать в чужую задачу по принуждению никто не будет. А задача может иметь не самое простое решение, чтобы взять и выделить на её решение час, а то и более. Так же вполне возможно, что описание задачи непонятно и никто не хочет угадывать что реально надо. Помните об этом каждый раз, когда появится желания "нукать" тут кому-то. Вам здесь никто ничем не обязан, чтобы кому-то "нукать". Это только отталкивает и отбивает желание помогать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Дмитрий Щербаков(The_Prist)

Ну вот из интереса, скачал файл. Вы пишите:
Цитата: Nurbol от 27.04.2018, 06:24:29Наши девочки из назначения платежа (в выписке) копируют более-менее осмысленный набор цифр-символов
а в приложенном файле поле "Назначение платежа" пустое. Нет ни одной заполненной ячейки.
Да даже если так: что такое "более-менее осмысленный набор символов"? Как Excel должен понять какой набор брать в качестве значения для поиска? На основании чего? Что-то мне подсказывает, что задача практически не имеет решения, пока не определены все возможные сочетания, которые надо брать в качестве искомых в базе.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Nurbol

Нобор состоит из ряда цифр или символов "№", "-", "/", или "FV"

Nurbol

Извините, столбцы съехали.
Назначение платежа стало в столбце "Кредит"

Дмитрий Щербаков(The_Prist)

Цитата: Nurbol от 28.04.2018, 10:05:32Нобор состоит из ряда цифр или символов "№", "-", "/", или "FV"
к сожалению лично мне это ни о чем не говорит. Вот нашел я тире("-") - что делать-то дальше? Что брать для поиска? Или "FV" нашел - искать в итоге что? "FV"? А смысл? Распишите поточнее, что надо делать, если нашли какое-то ключевое слово. Или они все в определенном порядке должны быть в ячейке. После того как нашли символы обязательно знать что делать дальше: есть подозрение, что на основании символов надо как-то определить что после них или до них. Но как - Вы не говорите.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Nurbol

#10
Пример.
Вот в первой строке Назначение платежа.

" СФ# 4649601/18-7875 за 21.04.2018 ЗП#  Ст.-Окончательный.Еңбек
ақы.  Мемлекеттік мекеме қызметкерлерінің еңбек ақысынан ұсталынған н
есие қарызы 42% -2018 ж   сәуір айы Иванов И.И. ИИН791007401375 решение суда №2
-387/16 29.07.2016 ж  Мақатаев "

Начинаем перебор по одному символу. Если символ входит в один из наших искомых, то смотрим следующий. Если и следующий входит в искомый перечень, то слово для поиска становится из двух символов. и просматриваем следующий. Если третий символ входит в искомый перечень, то слово для поиска становится из этих трех символов. Затем смотрим четвертый символ. Если он не входит в перечень искомых символов, то наше слово для поиска состоит из трех символов.
Затем через CTRL+F ищем это слово в листе "база". Если нашли, то каждый такой поиск из соответствующей строки вытаскиваем значение из столбца "Договор" и "Заемщик".

Например.
В первом назначении платежа на первой, второй и третьих позициях находятся символы, не входящие  искомый перечень.
А вот четвертым идет символ "#".
С него теперь начинается слово для поиска.
Просматриваем следующую букву. Это пробел. Пробел не входит в искомый перечень символов.
Значит наше слово для поиска ограничивается одним "#". Так как длина слова не более 1, то пропускаем поиск.
И переходим к поиску с позиции после пробела - это "4".
Этот символ входит в искомый перечень.
Значит наше слово для поиска состоит из "4". Тогда начинаем просматривать последующие символы, пока не дойдем до символа, не входящего в искомый перечень.
Так сказать, нанизываем по одному символы в наше слово для поиска, пока не дойдем до символа, который не входит в перечень.
В нашем примере это - 21 символ, пробел.
Слово для поиска будет "4649601/18-7875" - с шестого по 21-й символ из этой ячейки.
Переходим на лист "База", нажимаем CTRL+F и ищем это "4649601/18-7875".
Не находим.
Возвращаемся и продолжаем перебирать в ячейке дальше.
Начинаем перебирать с 22 позиции аналогично вышенаписанному.
Доходим до ИИН в этом назначении платежа. То есть подряд стоят символы "791007401375"
Запускаем поиск в листе "База" и находим в строке 4, где в столбце "ФИО" и "договор" указано "Иванов Иван Иванович" и "№15636778-1417-ЭК/2007 от 13.09.2007". Эту информацию записываем рядом с назначением платежа. Если находится несколько результатов - все они должны быть перечислены дальше, в следующих столбцах.
Дошли до последнего символа и переходим на следующую ячейку выделенного диапазона
И так далее.
Как вы поняли, порядок символов может быть разный. Разве только "FV" - это два подряд идущих символа.
Надеюсь так понятнее.

Nurbol

пытался сделать следующим образом.
Создал массив, в который внес все варианты: цифры от 0 до 9, "#", "/", "-", "FV"
Затем цикл, внутри еще один.
Первый цикл ищет первый совпадающий символ.
Второй циклы запускается, если символ нашелся в массиве. Он проверяет следующие и И по одному добавляет к уже найденной строке. Пока не доходит до символа, который не входит в массив.

Полученную строку нужно найти.

В общем в циклах запутался. Делаю через For... Next
А видимо надо через While/Until
Но тут мозг уже вскипел.


sboy

Добрый день.
Т.к. в файле-примере нет желаемого результата, проверить на правильность не имею возможности)
Также не совсем понятно про вывод результата (сделал как понял)
символ пробел у вас не входит в допустимые, а в примере ИИН в 7 строке разделен пробелом...
реализация функцией пользователя, но можете переделать на макрос с циклом по ячейкам
Function nurbol(t As String)
    With CreateObject("VBscript.RegExp")
        .Global = True
        .Pattern = "(FV)?[-#0-9?/]{6,}"
        If .test(t) Then
            For x = 0 To .Execute(t).Count - 1
                Set r = Sheets(2).UsedRange.Find(.Execute(t)(x), lookat:=xlWhole)
                    If Not r Is Nothing Then
                        s = Sheets(2).Cells(r.Row, 4) & Chr(10) & Sheets(2).Cells(r.Row, 5) & Chr(10)
                    End If
            Next x
           
            If Len(s) > 0 Then
                nurbol = Left(s, Len(s) - 1)
            Else: nurbol = ""
            End If
        End If
    End With
End Function

Nurbol

Это похлеще чем я предполагал.

Круть ваще жуть!
Жуть как круть!

Куча вопросов, но не сейчас.
Пару дней занят сильно, после завтра сяду протестю.

Спасибо огромное в любом случае!
Я уж не надеялся...

Nurbol

пока что выявил, что на 2016 и на 2013 офисе ведет себя по разному
на 2016 офисе поиск осуществляется точно по подстроке. Т.е. значение в ячейке должно точно соответствовать искомой подстроке
Это не в формуле, а в офисе видимо дело. Если искать подстроку, которая на 1 ячейку короче, чем значение в ячейке определенной, то офис ее не находит. А если добавить звездочку ("*"). то CTRL+F находит. Также видимо действует и формула.
Но допиливать надо будет именно формулу.

А как задать в формуле столбец, из которого нужно брать результирующее значение?
Понял, что нужно будет вставить ее здесь "s = Sheets(2).Cells(r.Row, 4)" вместо четверки, и понял, что нужно передать ее в параметрах функции. А как? Ну если совсем не сложно. Если сложно - буду сам разбираться.

Другой вопрос: а что делает функция, если в ячейке несколько возможных вариантов? Выводит первый попавшийся?
А как выводить все варианты?

И - да! в 7 строке есть пробел (а точнее символ переноса вроде).
Как вот здесь реализован поиск? Дело в том, что в 2016 Ексель нашел Кузнецову, а в 2013 - не нашел.


Яндекс.Метрика Рейтинг@Mail.ru