Страницы: 1
RSS
Как преобразовать дату текстом на английском языке в настоящую, Изменить формат даты с текстового на числовой
 
Добрый день.
Ежедневно формируется отчет о гостях. Как можно изменить формат даты на числовой, то-есть, если в ячейке стоит 26-AUG-20, то изменить его на 21.08.2022.
Возможно необходим макрос, на замену текста.
Изменено: Artur Serikov - 15.03.2022 12:55:41
 
Как преобразовать дату текстом на английском языке в настоящую

Артур Сериков, здравствуйте
Файл-пример
Изменено: Jack Famous - 15.03.2022 10:49:21
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
=ДАТА("20"&ПРАВСИМВ(A1;2);ПОИСКПОЗ(ПСТР(A1;4;3);{"Jan":"Feb":"Mar":"Apr":"May":"Jun":"Jul":"Aug":"Sep":"Oct":"Nov":"Dec"};0);ЛЕВСИМВ(A1;2))
=ДАТА("20"&ПРАВСИМВ(A1;2);(ПОИСК(ПСТР(A1;4;3);"JanFebMarAprMayJunJulAugSepOctNovDec")+2)/3;ЛЕВСИМВ(A1;2))
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ещё вариант
Код
Function myDate(ByVal txtDate As String) As Date
    txtDate = Replace(txtDate, "JAN", "01")
    txtDate = Replace(txtDate, "FEB", "02")
    txtDate = Replace(txtDate, "MAR", "03")
    txtDate = Replace(txtDate, "APR", "04")
    txtDate = Replace(txtDate, "MAY", "05")
    txtDate = Replace(txtDate, "JUN", "06")
    txtDate = Replace(txtDate, "JUL", "07")
    txtDate = Replace(txtDate, "AUG", "08")
    txtDate = Replace(txtDate, "SEP", "09")
    txtDate = Replace(txtDate, "OCT", "10")
    txtDate = Replace(txtDate, "NOV", "11")
    txtDate = Replace(txtDate, "DEC", "12")
    
    myDate = DateValue(txtDate)
End Function

Sub test()
    Debug.Print myDate("26-AUG-20")
End Sub
 
Цитата
Артур Сериков написал:
в ячейке стоит 26-AUG-20, то изменить его на 21.08.2022
А почему год 2022, должен быть 2020
 
Msi2102, а замена 26 на 21 число вас не смутила. ;)
 
Цитата
V написал:
вас не смутила.
На 20 посмотрел, а на 26 даже не глянул  :D  :D  :D
 
VBA-аналог для #3. Один из самых быстрых вариантов
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
С датой и вправду не удобно получилось) Спасибо за варианты, но вот теперь понять, как их использовать
 
Цитата
Jack Famous написал:
Один из самых быстрых вариантов
А это один из самых экзотичных  :D
Код
Function myDate(txDate$)
Dim n As String, m As Byte
    n = LCase(Mid$(txDate, 4, 3))
    m = Switch(n = "jan", 1, n = "feb", 2, n = "mar", 3, n = "apr", 4, n = "may", 5, n = "jun", 6, n = "jul", 7, n = "aug", 8, n = "sep", 9, n = "oct", 10, n = "nov", 11, n = "dec", 12)
    myDate = DateSerial(Right$(txDate, 2), m, Left$(txDate, 2))
End Function
'----------------------------------------------------------------------------------------------------
Sub test()
    Debug.Print myDate("26-AUG-20")
End Sub
 
Тестовый стенд. Лучший вариант обрабатывает миллион менее секунды
Msi2102, спасибо, что напомнили про преимущество DateSerial () в скорости  :idea:

Преимущество метода от Дмитрия (The_Prist) Щербакова ещё в том, что он сразу отсеивает НЕПОДХОДЯЩИЕ значения, то есть будет пропускать неподходящие строки вместо того, чтобы перебирать все варианты месяцев. То есть в "боевом" режиме смешанных данных будет ещё лучше  8)
Изменено: Jack Famous - 15.03.2022 11:50:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
И ещё один экзотический вариант
Код
Function PolinomDate(txtDate As String) As Date
    Dim txt As String
    txt = UCase(Mid(txtDate, 4, 3))
    Dim hash As Long
    hash = Asc(Mid(txt, 1, 1)) + Asc(Mid(txt, 2, 1)) + Asc(Mid(txt, 3, 1))
    Dim mon As Long
    If hash < 224 Then
        mon = -1.89470669197905E-04 * hash ^ 4
        mon = mon + 0.122350058017732 * hash ^ 3
        mon = mon - 26.3190615328644 * hash ^ 2
        mon = mon + 1885.9696811132 * hash ^ 1
    ElseIf hash > 231 Then
        mon = 4.92506117789911E-05 * hash ^ 4
        mon = mon - 3.45191172333351E-02 * hash ^ 3
        mon = mon + 8.06155247342111 * hash ^ 2
        mon = mon - 627.285078150264 * hash ^ 1
    Else
        mon = -1.25923870624653E-03 * hash ^ 4
        mon = mon + 0.858743160468105 * hash ^ 3
        mon = mon - 195.191113587677 * hash ^ 2
        mon = mon + 14787.6437535653 * hash ^ 1
    End If
    PolinomDate = DateValue(Replace(txtDate, txt, mon))
End Function

Sub test()
    Debug.Print PolinomDate("26-APR-20")
End Sub
 
Я далек от скриптов, Эти коды в макрос добавлять нужно? Можно файлик с примером прислать?
 
Цитата
написал:
здравствуйте Файл-пример
Артур, именно об этом Вас и просили с самого начала:
Вы готовите пример с различными вариантами (несекретной!) информации и желаемым результатом (пусть и подготовленным вручную).
А уже для этого примера желающие помочь подготовят для Вас разные варианты.
 
Прикладываю фаил пример
Изменено: Artur Serikov - 15.03.2022 12:48:28
 
Теперь скопируйте формулу из 3 сообщения и вставьте в любую ячейку, затем измените ссылки и будет вам счастье.
PS: а что нужно менять в примере, у меня там нормальные даты
Изменено: Msi2102 - 15.03.2022 12:54:50
 
Виноват! не добавил сам фаил к первому сообщению. Стыдоба  
 
Решение Дмитрий(The_Prist) Щербаков, из #3 сообщения. Просто формулами
 
Получается, что формула берет данные из столбца и подставляет значения в новую ячейку, а можно настроить так, что бы он сразу менялся на нужный формат?
Изменено: Artur Serikov - 15.03.2022 13:05:38
 
А просто скопировать и вставить значения не судьба
 
Подобные вопросы уже были на форуме.
Выделите ячейки с проблемными датами (прямоугольный диапазон) и выполните макрос:

Код
Sub test()
  With Selection
    .Value = .Value
    .NumberFormat = "m/d/yyyy"
  End With
End Sub
Владимир
 
Заработало, спасибо.
 
Цитата
написал:
=ДАТА("20"&ПРАВСИМВ(A1;2);ПОИСКПОЗ(ПСТР(A1;4;3);{"Jan":"Feb":"Mar":"Apr":"May":"Jun":"Jul":"Aug":"Sep":"Oct":"Nov":"Dec"};0);ЛЕВСИМВ(A1;2))=ДАТА("20"&ПРАВСИМВ(A1;2);(ПОИСК(ПСТР(A1;4;3);"JanFebMarAprMayJunJulAugSepOctNovDec")+2)/3;ЛЕВСИМВ(A1;2))
можно ли эту формулу сделать под формат 01JAN22. Сейчас она работает с форматом 01-JAN-22
 
Power Query (Sheet1)
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type with Locale" = Table.TransformColumnTypes(Source, {{"BEGIN_DATE", type date}}, "ru-RU"),
    #"Changed Type with Locale1" = Table.TransformColumnTypes(#"Changed Type with Locale", {{"END_DATE", type date}}, "ru-RU")
in
    #"Changed Type with Locale1"
 
Код
=ДАТА("20"&ПРАВСИМВ(A1;2);(ПОИСК(ПСТР(A1;3;3);"JanFebMarAprMayJunJulAugSepOctNovDec")+2)/3;ЛЕВСИМВ(A1;2))
 
Цитата
написал:
=ДАТА("20"&ПРАВСИМВ(A1;2);(ПОИСК(ПСТР(A1;3;3);"JanFebMarAprMayJunJulAugSepOctNovDec")+2)/3;ЛЕВСИМВ(A1;2))
грейт, работает, благодарю от души
Страницы: 1
Наверх