Страницы: 1
RSS
Из назначения платежа вынуть № договора, его дату и оплаченный период
 
Здравствуйте уважаемые форумчане!

Помогите пожалуйста допилить
Код
=СЖПРОБЕЛЫ(ПСТР(A8;ПОИСК(число;A8;ПОИСК("дог";A8));ПОИСК("от";A8;ПОИСК("дог";A8))-ПОИСК(число;A8;ПОИСК("дог";A8))))

Задача вынуть из назначения платежа № договора, его дату и оплаченный период (с - по)
Дату договора я нашел как вынимать. Оплаченный период - тоже имею представление как сделать.
А вот с номером договора засада. Таблица ~ 13 тыс, строк. За много лет, многими исполнителями - наполнение разнообразное.
Для поиска номера договора надежными маркерами могут быть только "дог", "от", пробелы и любое число.
Когда задумывал, то надеялся на то, что можно в формулу подставить #, но был приятно удивлен. Остановился на том, что присвоил имя "число" (диспетчер имен) диапазону ={0;1;2;3;4;5;6;7;8;9} и вставил в формулу. Не работает как задумано - блин!
И еще вопрос почему не получается (надстройка PLEX) завернуть формулу внутрь =GETDATA( ) ?. А если сослаться на вычисляемую ячейку, то работает.
 
Доброе время суток
№ договора легко извлекается UDF-функцией на регулярных выражениях.
Код
Public Function GetNumber(ByVal this As String) As String
    Dim pReg As Object
    Set pReg = CreateObject("VBScript.RegExp"): pReg.Pattern = "\d+-\d+-\d+"
    GetNumber = pReg.Execute(this)(0).Value
End Function

Успехов.
 
Дата:
=--ПСТР(A8;ПОИСК(" от ";A8)+4;8)
Номер:
=ЛЕВСИМВ(ПСТР(A8;ПОИСК(" ??-*-??";A8)+1;20);ПОИСК(" ";ПСТР(A8;ПОИСК(" ??-*-??";A8)+1;20))-1)
 
добрый день,дату выделяет функция yyy в столбце B,номер yyy1 в столбце C(это чуть измененный вариант от Андрей VG из #2)
 
Код
Function yyy$(t$)
 With CreateObject("VBScript.RegExp")
        .Pattern = "от (\d+\.\d+\.\d+)"
        If .test(t) Then yyy = .Execute(t)(0).Submatches(0)
    End With
End Function
Изменено: sv2013 - 05.01.2016 19:36:07
 
zuikovod,добавил в столбец D функцию zzz для выделения периода платежа
 
Код
Function zzz$(t$)
With CreateObject("VBScript.RegExp"): .Pattern = "с \d+\.\d+\.\d+ по \d+\.\d+\.\d+"
  zzz = .Execute(t)(0)
End With
End Function
Изменено: sv2013 - 05.01.2016 19:37:36 (русские буквы подправил)
 
Андрей VG, vikttur, sv2013,
Спасибо большое за участие. Забрал, попользую функцию вынимать периоды и даты = еще раз спасибо. Заодно ознакомился с двойным отрицанием - незнал. Всегда пользовался +0, *1.
По поводу номеров договоров, хочется сказать следующее. Я не смогу разместить все разнообразие записей. Это лишь маленький кусочек. Номера договоров  бывают какого хочешь формата и через дробь и №1 и 333, но благо первая всегда цифра и нет пробелов. В описании задачи, специально уточнил, что единственными надежными маркерами являются: "от", "дог", пробел и любая цифра. Предложенные же вами варианты опираются на маркер "-". Если опираться на "-" то может тысячи три строк обработается, а тем способом который я вижу и указал позволит автоматом пройти более 10 тыс строк.
Кроме того, формула для меня ценна тем, что я её могу изменить и с божьей помощью оставшиеся 2 тысяч строк одолеть + найдется штук 500 экслюзивчиков. А VBA для меня неизведанное, могу пользоваться только готовыми решениями.
Поэтому основная задача пока не решена: помогите допилить основываясь на маркерах "от", "дог", пробел и любая цифра. Как найти положение первой цифры после текста "дог." ?
 
Цитата
zuikovod написал:
Заодно ознакомился с двойным отрицанием - незнал.
Говорят, оно быстрее работает.
There is no knowledge that is not power
 
zuikovod,набросайте файл-пример или дополните вариантами свой предыдущий файл,или в сжатом виде выложите весь свой файл,например с
помощью WinRaR,Вам помогут,здесь принято выкладывать файл.
 
sv2013,Спасибо большое, но весь файл откровенно не могу и не хочу. Там точно не универсального решения для всех записей, даже с помощью волшебных макросов. Хочу сам дойти. Другого варианта привести данные в таблице в извлекаемый вид нет.
файл пример прикладываю.
 
Так же хочется добавить, что если я выложу файл, за меня ни кто не проведет анализ всех 13 тыс строк. Там правда, видов написания до фига! Я сам еще не со всеми видами записей столкнулся. Все происходит по ходу дела. Сижу и вылавливаю: где пошло не так и почему. Кто это сделает вместо меня? Отфильтровываю однотипные записи и по ним соответствующим инструментом прохожу.
 
=СЖПРОБЕЛЫ(ЛЕВБ(ПОДСТАВИТЬ(ПСТР(A8;ПОИСК("дог";A8)-1+МИН(ПОИСК({0;1;2;3;4;5;6;7;8;9};ПСТР(A8;ПОИСК("дог";A8);50)&123456789));50);" ";ПОВТОР(" ";50));50))
Строки 17, 18, 22 -буквосочетание "дог" не один раз, после первого дата, ее и ловит формула.
 
Помогите найти позицию первой встретившейся цифры после текста "дог" :-)
 
помог? :)
Формулу можно разделить на несколько ячеек, добавить определение количества буквосочетаний "дог" и брать последнее. Можно все в одной, но через пару дней долго придется разбирать логику работы  )
Количество "дог":
=(ДЛСТР(A8)-ДЛСТР(ПОДСТАВИТЬ(A8;"дог";)))/3
А это замена последнего "дог" на "ююю":
=ПОДСТАВИТЬ(A8;"дог";"ююю";(ДЛСТР(A8)-ДЛСТР(ПОДСТАВИТЬ(A8;"дог";)))/3)
Осталось заменить искомое  буквосочетание и ссылку на ячейку в формуле поиска (сообщение №11)
 
Отлично! Да, я фильтрами собираюсь учитывать, что есть принципиально разные формы записи. Еще раз спасибо и за количество договоров тоже! Пойду в excel :-)
 
добрый вечер,Zuikovod,отвечу на #12,позиция первой цифры после дог,начиная с начала функция bbb в G,в H проверка
Код
Function bbb%(t$)
   Dim t1$, i%
 With CreateObject("VBScript.RegExp"): .Pattern = "дог"
   i = .Execute(t)(0).FirstIndex
   t1 = Split(t, "дог")(1): .Pattern = "\d"
   bbb = i + .Execute(t1)(0).FirstIndex + 4
 End With
End Function
 
Изменено: sv2013 - 06.01.2016 00:42:57 (русские буквы подправил)
 
добрый вечер,zuikovod,Вы в #9 выложили файл,для этого файлав столбце E функция vvv2 и вышеупомянутая функция bbb для #6 в столбце G
выводит номер первой цифры  (отсчет с начала) после дог.
 
Код
Function vvv2$(t$)
    Dim t1$
With CreateObject("VBScript.RegExp"): .Pattern = " дог(овору аренды |\.|оворам)(.+)"
   If .test(t) Then t1 = .Execute(t)(0).Submatches(1)
 End With
   vvv2 = Split(t1, "от")(0)
End Function
Изменено: sv2013 - 06.01.2016 20:39:39 (добавил русский текст от)
 
Как-то так, но если объединить в один макрос, мне кажется, скорость увеличится
Код
Function tt(Text As String) As String
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Pattern = "с \d{2}\.\d{2}\.\d{4} по \d{2}\.\d{2}\.\d{4}"
        If .Test(Text) Then tt = .Execute(Text)(0)
    End With
End Function

Function tt_1(Text As String) As String
    Text = Application.WorksheetFunction.Trim(Text)
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Global = True
        .Pattern = "(\d+\-)+\d+"
        If .Test(Text) Then tt_1 = .Execute(Text)(0)
    End With
End Function

Function tt_2(Text As String) As String
    Text = Application.WorksheetFunction.Trim(Text)
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Pattern = "(?:(\d+\-)+\d+ от )(\d{2}\.\d{2}\.\d{2,4})"
        If .Test(Text) Then tt_2 = .Execute(Text)(0).Submatches(1)
    End With
End Function


 
добрый вечер,MBT, очень хорошо,что Вы приняли участие в обсуждении,поместил функцию tt а столбец B,этот вариант мы обсуждали ранее
tt_2 в столбце E,также раньше обсуждали такой вариант ранее,
tt_1 поместил в столбец C,можно сравнить этот вариант с моим вариантом vvv2 в столбце E,-где я ориентировался на образец создателя темы
в столбце D.Будем ждать создателя темы,может он отпишется.
 
МВТ, sv2013, проверьте коды на примере из сообщения №9
 
vikttur, Вы абсолютно правы, с такими данными работать не будет. Скажу больше, вообще с трудом представляю, что можно ТАК хранить информацию, а потом пытаться ее обрабатывать
UPD номер договора можно попробовать вытаскивать так (если в одной ячейке несколько номеров, вытащит только один)
Код
Function НомерДоговора(Text As String) As String
    Dim Obj As Object, I As Long
    Text = Application.WorksheetFunction.Trim(Text)
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Pattern = "дог.+?(\d.*?) (от|за)"
        If .test(Text) Then НомерДоговора = .Execute(Text)(0).submatches(0) Else Exit Function
        .Pattern = "\d{2}\.\d{2}\.\d{2,4}\D+"
        If .test(НомерДоговора) Then НомерДоговора = .Replace(НомерДоговора, "")
    End With
End Function

Изменено: МВТ - 07.01.2016 10:38:26
 
Здравствуйте всем! Кого можно поздравить, того с Рождеством Христовым!

Цитата
МВТ написал:
Скажу больше, вообще с трудом представляю, что можно ТАК хранить информацию, а потом пытаться ее обрабатывать
Конечно же ни кто, так информацию не хранит. Я в целях инвентаризации, натягиваю данные из бухгалтерского учета на данные своего учета... Назначение платежа - это разовая задача. Далее данные будут нормально цепляться по уникальному коду.
Таблицу,  с помощью форумчан практически прошел. Сейчас могу только по ночам заниматься таблицей. Сегодня выложу свою таблицу, со строками которые по разным причинам не обработались.
Изменено: zuikovod - 07.01.2016 11:21:11
 
Всем доброго!
Закончил я свою таблицу и хотел сказать огромное спасибо всем кто предложил решения и потратил на это свое время.
В знак благодарности я свел все решения в одну таблицу и тем самым составил некий рейтинг универсальности предложенных решений исходной задачи.
Макрос МВТ, оказался самым универсальным и продуктивным решением, в этих неоднородных данных, ну и т.д. см. приложенный файл.
Если кто из отцов допилит свои решения для общей копилки - будет здорово!!! Еще раз огромное спасибо друзья _однозначно всем!!! sv2013 и Вам особое спасибо за периоды, хотя они не везде захотели работать (буде время загляните в табл.), но тем не менее очень помогли. Остатки допилю позже вручную или формулами... vikttur, посмотрите пожалуйста на ячейку D11 - странная штука так и не понял почему Ваша формула именно здесь не работает, то ли длинна строки, то ли из-за единиц подряд - в общем голову сломал :-) Спасибо Вам то же, получилось наименее ресурсоемкое решение из всех и одно из самых продуктивных.

ps Ни когда не мог бы подумать, что под Эксель нужен мощный комп - упарился на старом ноуте :-)
Изменено: zuikovod - 09.01.2016 00:22:53
 
Цитата
странная штука так и не понял почему Ваша формула именно здесь не работает
При сцеплении с числом 0123456789 потерялся нолик. Поставим его справа:
=СЖПРОБЕЛЫ(ЛЕВБ(ПОДСТАВИТЬ(ПСТР(A5;ПОИСК("дог";A5)-1+МИН(ПОИСК({1;2;3;4;5;6;7;8;9;0};ПСТР(A5;ПОИСК("дог";A5);50)&1234567890));50);" ";ПОВТОР(" ";50));50))
 
vikttur, Ясно. Спасибо.
sv2013, Кстати функция BBB, которая ищет в ячейке первую цифру после текста "дог", была то что нужно для моей формулы. А vvv2 у меня не заработала.
Изменено: zuikovod - 09.01.2016 00:57:12
 
Дорогие программисты. У меня тоже такая проблема, надо вытащить номер и дата договора. Прощу помочь. Отправляю все текст с ячейками. Там иногда на узбекском тоже написано.
 
Цитата
надо вытащить номер и дата договора
UDF
Код
Function iNumber(cell$)
 With CreateObject("VBScript.RegExp")
     .Global = True
     .Pattern = "№\s?(.+)(?= от)"
     If .Test(cell) Then
       iNumber = .Execute(cell)(0).SubMatches(0)
     Else
       iNumber = "нет"
     End If
 End With
End Function

Код
Function iDate(cell$)
 With CreateObject("VBScript.RegExp")
 Dim temp
     .Global = True
     .Pattern = "от ((\d{2}\.\d{2}\.)(\d{2,4}))"
     If .Test(cell) Then
       temp = .Execute(cell)(0).SubMatches(0)
       If Len(.Execute(cell)(0).SubMatches(2)) = 2 Then
       .Pattern = "(\d{2}\.\d{2}\.)(\d{2,4})"
         iDate = .Replace(temp, "$120$2")
       Else
         iDate = .Replace(temp, "$1$2")
       End If
     Else
       iDate = "нет"
     End If
 End With
End Function
 
Спасибо большое. Могу эти двоих в одном макросе использовать?
Страницы: 1
Наверх