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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2009, 12:44   #1
S_M
 
Регистрация: 05.08.2009
Сообщений: 4
По умолчанию Выделить дату и номер договора из текста

В столбце "А" длинный список - назначения платежа из платежных поручений типа "Оплата за товар по договору № 37 от 14.08.2009".
Нужно в столбец "B" поместить номер договора, в столбец "С" - дату.

Сложность в том, что назначение платежа может быть и таким: "Оплата за товар по счету 1736 от 18.08.09 по договору № 37 от 14.08.2009". В этом случае, если однозначно решить задачу нельзя, достаточно оставить пустыми ячейки в столбцах "B" и "С" для ручного заполнения. По статистике около 90% платежек можно разобрать автоматически - то есть время ручной обработки сократится в 10 раз.
Можно ли это сделать?
S_M вне форума Ответить с цитированием
Старый 30.08.2009, 13:13   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Могу предложить вариант с пользовательскими функциями:
Код:
  Ячейка: B1      Формула  (стиль A1):   =ДатаДоговора(A1)
                  Формула  (стиль R1C1): =ДатаДоговора(RC[-1])

  Ячейка: C1      Формула  (стиль A1):   =НомерДоговора(A1)
                  Формула  (стиль R1C1): =НомерДоговора(RC[-2])
Вот весь код:
Код:
Function ДатаДоговора(ByVal txt As String)
    If UBound(Split(txt, " от ")) > 1 Then ДатаДоговора = "две или больше дат!!!": Exit Function
    ДатаДоговора = CDate(Trim(Split(txt, " от ")(1)))
End Function

Function НомерДоговора(ByVal txt As String)
    If UBound(Split(txt, " от ")) <> 1 Then НомерДоговора = "не распознано!!!": Exit Function
    arr = Split(Trim(Split(txt, " от ")(0)), " ")
    НомерДоговора = arr(UBound(arr))
End Function
Скачать пример можно по этой ссылке: http://excelvba.ru/XL_Files/Sample__...__15-11-22.zip
EducatedFool вне форума Ответить с цитированием
Старый 30.08.2009, 17:01   #3
S_M
 
Регистрация: 05.08.2009
Сообщений: 4
По умолчанию Выделить дату и номер договора из текста

Спасибо. Но почему-то у меня Ваш пример не работает: при попытке скопировать формулу вниз в столбцах "В" и "С" появляется ошибка #ИМЯ?
Я что-то не так делаю? У меня Excel-2003 русский.
S_M вне форума Ответить с цитированием
Старый 30.08.2009, 20:18   #4
DV68
Форумчанин
 
Регистрация: 05.08.2009
Сообщений: 465
По умолчанию

Для ячейки В1:
Код:
=ПСТР(A1;ПОИСК("№";A1)+1;ПОИСК("от";A1)-ПОИСК("№";A1)-1)
Для С1:
Код:
=ПРАВСИМВ(A1;10)
"Все следует делать настолько простым, насколько это возможно, но не проще." Альберт Эйнштейн
DV68 вне форума Ответить с цитированием
Старый 31.08.2009, 18:50   #5
S_M
 
Регистрация: 05.08.2009
Сообщений: 4
По умолчанию

Проверил первый пример (на другом компьютере почему-то работает), номер договора на реальной базе распознается хорошо - действительно в 90% случаев.
С датой договора гораздо хуже (15%) - к сожалению, назначение платежа может быть не только "Оплата за товар по договору № 37 от 14.08.2009", но и "За рога и копыта по договору № 37 от 14.08.2009, НДС 172 руб.50 коп.", "В счет гашения договора займа 37 от 14.08.09, без НДС, в т.ч. проценты 10123 руб." и т.д. и т.п. То есть задача - нужно из абсолютно произвольного текста выбрать дату.
Я думаю, лучше распознавать по шаблону типа "##.##.##" или "##.##.####". Причем лучше сделать это макросом, а не функцией. Иначе таблица (в ней сейчас порядка 19 тыс. строк) получается перегруженной, она очень долго пересчитывается. В день добавляется до 200 строк, и макросом прогонять только их будет быстрее (я их могу фильтровать по дате и потом распознавать). Как сделать такой макрос?
S_M вне форума Ответить с цитированием
Старый 31.08.2009, 19:40   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Как сделать такой макрос?
Для начала выложите файл со всеми возможными вариантами строк
(чтобы было на чём тестировать макрос)
EducatedFool вне форума Ответить с цитированием
Старый 04.09.2009, 17:46   #7
S_M
 
Регистрация: 05.08.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Для начала выложите файл со всеми возможными вариантами строк
(чтобы было на чём тестировать макрос)
Файл выкладываю.
Вложения
Тип файла: rar назначение платежа.rar (4.1 Кб, 39 просмотров)
S_M вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
справка о междугороднем тел. разговоре содержит: номер телефона абонента(6 цифр),дату(год, месяц, число) @RH@nhel Помощь студентам 2 21.06.2009 10:12
выделить строки Romuald Microsoft Office Excel 7 22.02.2008 04:58
Выделить все Михаил Юрьевич Общие вопросы Delphi 1 21.02.2008 23:12