Страницы: 1 2 След.
RSS
-=Обратное преобразование даты=-
 
Всем привет и с праздником!  
 
В А1 есть текст "первое сентября 2011 года"  
Задача: преобразовать его в дату.  
Год извлекается легко  
=MID(A1;SEARCH(" года";A1)-4;4)  
Месяц тоже:  
=MID(MID(SUBSTITUTE(A1;MID(A1;SEARCH(" года";A1)-4;4)&" года";"");FIND(" ";A1);LEN(SUBSTITUTE(A1;MID(A1;SEARCH(" года";A1)-4;4)&" года";"")));1;4)  
Вопрос: Как извлечь день? Есть другой способ, кроме как создавать массив констант соответствий?
 
Наверное, нет. 31 написание дня месяца - как же без поиска?
 
Я тоже так думаю...  
Решил проконсультироваться  
Фишка с преобразованием текстового названия месяца в числовое смущает...    
А вдруг такое и для числа есть?
 
Месяц тоже нужно в число?  
Какой формат результата?
 
Месяц я уже преобразовал в число  
Формат даты. Нормальной, полноценной даты
 
Для дня - захалявный словарик :)
 
Ясно, спасибо :-)
 
=СУММПРОИЗВ(ЕЧИСЛО(ПОИСК({"пе":"вт":"тре":"четв":"пято":"шесто":"сед":"вось":"девятое":"дес":"оди":"две":"трин":"четы":"пятн":"шестн":"семн":"восе":"девятнад":"два":"трид"};A1))*{1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:30})
 
MCH, спс
 
.
 
Сергей хотел, чтобы не "создавать массив констант соответствий".  
Но для темы подходит.
 
=--(ПОИСКПОЗ(2;1/ПОИСК({"":"пе":"вт":"тре":"четв":"пято":"шесто":"сед":"вось":"вято":"дес":"оди":"две":"трин":"четы":"пятн":"шестн":"семн":"восе":"вятн"};A1))-1+СУММ((ЛЕВСИМВ(A1;4)={"двад";"трид"})*{20;30})&"/"&ПОИСКПОЗ(2;1/ПОИСК({"ян":"ф":"мар":"ап":"мая":"юн":"юл":"ав":"сен":"ок":"но":"дек"};A1))&"/"&ПСТР(A1;ПОИСК(" го";A1)-4;4))  
 
Констант соответсвий нет, ищем только позицию
 
{quote}{login=vikttur}{date=23.02.2012 01:54}{thema=}{post}Сергей хотел, чтобы не "создавать массив констант соответствий".  
{/post}{/quote}Да, я надеялся что можно обойтись покороче формулкой :-)
 
Еще вариант:  
=--(ПОИСКПОЗ(2;1/ПОИСК({"":"пе":"вт":"тре":"четв":"пято":"шесто":"сед":"вось":"вято":"дес":"оди":"две":"трин":"четы":"пятн":"шестн":"семн":"восе":"вятн"};A1))-1+СУММ((ЛЕВСИМВ(A1;4)={"двад";"трид"})*{20;30})&ПОДСТАВИТЬ(ПСТР(A1;ПОИСК(" ";A1;ПОИСК(" г";A1)-14);4);"мая";"май")&ПСТР(A1;ПОИСК(" г";A1)-5;5))  
 
всего то 302 знака, не так уж и длинно  
 
PS: Сергей, твоя формула из первого поста по нахождению месяца не корректно работает для числительных состоящих из двух слов, например, "двадцать первое сентября 2011 года"
 
{quote}{login=MCH}{date=23.02.2012 03:28}{thema=}  
PS: Сергей, твоя формула из первого поста по нахождению месяца не корректно работает для числительных состоящих из двух слов, например, "двадцать первое сентября 2011 года"{/post}{/quote}Точно. Спасибо за конкретику!    
Воспользуесь твоей.
 
{quote}{login=MCH}{date=23.02.2012 03:28}{thema=}{post}  
всего то 302 знака, не так уж и длинно  
{/post}{/quote}Я надеялся на 5-10 знаков ПСТР(дата;1;3), как месяц...
 
формулка покороче:  
=d(A1)  
 
где d - UDF:  
 
Option Base 1  
Function d(s As String) As Long  
 Dim sm, sd, sd2  
 sm = Array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", _  
   "октября", "ноября", "декабря")  
 sd = Array("первое", "второе", "третье", "четвертое", "пятое", "шестое", "седьмое", "восьмое", _  
   "девятое", "десятое", "одиннадцатое", "двенадцатое", "тринадцатое", "четырнадцатое", _  
   "пятнадцатое", "шестнадцатое", "семнадцатое", "восемндцатое", "девятнадцатое", "двадцатое", "тридцатое")  
 sd2 = Array("двадцать", "тридцать")  
 x = Split(s, " ")  
 y = Val(x(UBound(x) - 1)): i = 1: s1 = x(UBound(x) - 2)  
 Do: If sm(i) = s1 Then Exit Do Else i = i + 1  
 Loop Until i = 12  
 m = i: s1 = x(0)  
 If UBound(x) = 4 Then  
   s1 = x(1): If x(0) = sd2(1) Then v = 20 Else v = 30  
 End If  
 i = 1  
 Do: If sd(i) = s1 Then Exit Do Else i = i + 1  
 Loop Until i = 21  
 If i = 21 Then d = DateSerial(y, m, 30) Else d = DateSerial(y, m, v + i)  
End Function
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=ikki}{date=23.02.2012 04:03}{thema=на всякий случай )}{post}формулка покороче:  
{/post}{/quote}Чего же здесь короткого?
 
формула.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Саш, разве это:  
 
Option Base 1  
Function d(s As String) As Long  
-----------------------  
-----------------------  
-----------------------(еще 2 десятка строк)  
End Function  
 
коротко?
 
Я вот о чём (см.вложение), но прокатывает это с числами?!
 
Сергей,    
0) в моем мозгу понятия "формула" и "реализация функции" существуют отдельно.  
1) безусловно, текст UDF гораздо длиннее, чем формула МСН.  
2) вполне возможно, UDF написана не лучшим образом, но правильный результат она дает.  
3) скорее всего, Михаил потратил на написание своей формулы меньше времени, чем я на свою UDF (хотя и не факт)  
4) что уж абслютно точно - я бы на написание такой формулы потратил времени в десятки раз больше, чем на UDF, причем не факт, что я вообще смог бы такую формулу создать, да и в результате не был бы уверен до самого конца.  
4а) я такой не один особенный.  
5) если задача разовая - то вариант с формулой от МСН, конечно, лучше. да и то... смотря кто использует эту формулу и смотря что в ней надо будет поправить, если такая необходимость возникнет.    
6) если же задача возникает периодически. да еще и в разных файлах... имхо, готовую UDF использовать проще.  
7) одному больше нравится арбуз, другому - свиной хрящик.  
8) формула (именно формула) короче. можно переназвать функцию, чтобы было понятней - например, ДАТАИЗТЕКСТА(), и всё равно это будет короче.  
9) пост назывался "на всякий случай" и, кроме того, там в конце еще и смайлик был.  
 
могу повторить этот смайлик:  
:) Сергей, спорить вообще не о чем. И - с праздником тебя! :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=ikki}{date=23.02.2012 08:52}{thema=}{post}  
:) Сергей, спорить вообще не о чем. И - с праздником тебя! :){/post}{/quote}  
И тебя тоже :)
 
UDF:  
 
Function Text2Date(txt$) As Date  
Dim i&, dn&, ms&, x  
For Each x In Split("пе вт тре четв пято шесто сед вось вято дес оди две трин четы пятн шестн семн восе вятн два трид")  
   i = i + 1: If i = 21 Then i = 30  
   If InStr(txt, x) Then dn = dn + i  
Next x  
i = 0  
For Each x In Split("ян ф мар ап мая юн юл ав сен ок но дек")  
   i = i + 1: If InStr(txt, x) Then ms = i: Exit For  
Next x  
Text2Date = DateSerial(Mid(txt, InStr(txt, " г") - 4, 4), ms, dn)  
 
End Function
 
Сократил формулу до 279 знаков и поправил UDF
 
Михаил, спасибо, но идея была в другом...  
Если она не реализуема, то и нет проблем, такую формулу я и сам напишу :-)
 
а нет в Excel таких вот функций:  
=Функция("Двадцать один") = 21
 
Но функция:  
функция("янв")=1 есть!  
Вот об этом и был вопрос.  
Всем спасибо, ответ я получил, тема закрыта.
 
Именно такой функции нет, можно использовать функцию МЕСЯЦ, но для этого слово "янв" нужно преобразовать:  
=МЕСЯЦ(1&"янв"&1900)  
 
а если месяц будет записан как "мая" (что получается по формуле из первого поста) то получим ошибку:  
=МЕСЯЦ(1&"мая"&1900) = #ЗНАЧ!
 
{quote}{login=MCH}{date=24.02.2012 12:23}{thema=Re: Re: }{post}  
Именно такой функции нет...{/post}{/quote}  
Если быть точным - то да ИМЕННО такой функции нет.  
Но есть аналог. Я показал его в примере.  
Т.е. фактически такая функция есть. Её просто не оформляли и не документировали.
Страницы: 1 2 След.
Наверх