Страницы: 1
RSS
Извлечение из текста двух и более дат
 
Всем добрый день! Помогите пожалуйста решить задачу по извлечению из текстовых строк различной длины всех содержащихся в них дат, согласно прилагаемому файлу. Очень хотелось бы формулами. Офис 2007. Вопрос по извлечению одной даты решен. Но как быть, если дат может быть 2, 3 и более?
 
вот Вам пример коротенький, как вытащить 1 или 2 даты, по аналогии можете затащить 3-ю )
Код
=ТЕКСТ(
ПСТР(A2;ПОИСК("??.??.";A2);8)&
ТЕКСТ(ПСТР(A2;ПОИСК(".??.";A2)+6;2);"0;;;");"ДД.ММ.ГГГ")&"
"&
ЕСЛИОШИБКА(
ТЕКСТ(ПСТР(ПСТР(A2;ПОИСК(ТЕКСТ(--(ПСТР(A2;ПОИСК("??.??.";A2);8)&
ТЕКСТ(ПСТР(A2;ПОИСК(".??.";A2)+6;2);"0;;;"));"ДД.ММ.ГГГГ");A2)+11;1000);
ПОИСК("??.??.";ПСТР(A2;ПОИСК(ТЕКСТ(--(ПСТР(A2;ПОИСК("??.??.";A2);8)&
ТЕКСТ(ПСТР(A2;ПОИСК(".??.";A2)+6;2);"0;;;"));"ДД.ММ.ГГГГ");A2)+11;1000));8)&
ТЕКСТ(ПСТР(ПСТР(A2;ПОИСК(ТЕКСТ(--(ПСТР(A2;ПОИСК("??.??.";A2);8)&
ТЕКСТ(ПСТР(A2;ПОИСК(".??.";A2)+6;2);"0;;;"));"ДД.ММ.ГГГГ");A2)+11;1000);
ПОИСК(".??.";ПСТР(A2;ПОИСК(ТЕКСТ(--(ПСТР(A2;ПОИСК("??.??.";A2);8)&
ТЕКСТ(ПСТР(A2;ПОИСК(".??.";A2)+6;2);"0;;;"));"ДД.ММ.ГГГГ");A2)+11;1000))+6;2);"0;;;");"ДД.ММ.ГГГГ");
"")

Изменено: Тимофеев - 26.08.2022 18:40:20
 
Цитата
как быть, если дат может быть 2, 3 и более?
UDF
Код
Function iDate(cell$)
Dim mo As Object
Dim i As Long
 With CreateObject("VBScript.RegExp")
     .Global = True
     .Pattern = "(([0-2]?\d{1})|([3][0,1]{1}))\.[0,1]?\d{1}\.(([1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))"
   If .test(cell) Then
       Set mo = .Execute(cell)
       For i = 0 To mo.Count - 1
         iDate = iDate & mo(i) & " "
       Next
   End If
 End With
End Function
 
Спасибо за помощь уважаемые Тимофеев и Кузьмич!  Меня больше заинтересовало решение Тимофеева, так как  UDF в в моей задаче не пойдет. Скажите, Тимофеев, как мне по аналогии вытащить 3-ю дату? Пытался достроить Вашу формулу "по аналогии" в ячейке В4, третья дата появляется, но такая же как вторая? Тяжко с этими аналогиями...
 
для 2007 массивная до 4х дат в строке
=IFERROR(MID(A2;SMALL(IF(ISNUMBER(SEARCH("??.??.????";MID(A2;ROW($1:$999);10)));ROW($1:$999));1);10);"")&
IFERROR(CHAR(10)&MID(A2;SMALL(IF(ISNUMBER(SEARCH("??.??.????";MID(A2;ROW($1:$999);10)));ROW($1:$999));2);10);"")&
IFERROR(CHAR(10)&MID(A2;SMALL(IF(ISNUMBER(SEARCH("??.??.????";MID(A2;ROW($1:$999);10)));ROW($1:$999));3);10);"")&
IFERROR(CHAR(10)&MID(A2;SMALL(IF(ISNUMBER(SEARCH("??.??.????";MID(A2;ROW($1:$999);10)));ROW($1:$999));4);10);"")


ну или если есть агрегат есть то не массивная
=IFERROR(MID(A2;AGGREGATE(15;6;ROW($1:$999)/ISNUMBER(SEARCH("??.??.????";MID(A2;ROW($1:$999);10)));1);10);"")&
IFERROR(CHAR(10)&MID(A2;AGGREGATE(15;6;ROW($1:$999)/ISNUMBER(SEARCH("??.??.????";MID(A2;ROW($1:$999);10)));2);10);"")&
IFERROR(CHAR(10)&MID(A2;AGGREGATE(15;6;ROW($1:$999)/ISNUMBER(SEARCH("??.??.????";MID(A2;ROW($1:$999);10)));3);10);"")&
IFERROR(CHAR(10)&MID(A2;AGGREGATE(15;6;ROW($1:$999)/ISNUMBER(SEARCH("??.??.????";MID(A2;ROW($1:$999);10)));4);10);"")


999 - задано с запасом на длину строки.

В версиях где есть возможность сцепить все будет еще проще в один блок все уложится.
Изменено: БМВ - 27.08.2022 09:35:49
По вопросам из тем форума, личку не читаю.
 
Здравствуйте, Добрый Мишка с папиросой)! Спасибо Вам!!!
Страницы: 1
Наверх