Excel VBA Дата замены - PullRequest
0 голосов
/ 17 мая 2018

У меня есть некоторые даты в ячейках в качестве стандарта ISO (ГГГГ / ММ / ДД), но меня просят изменить его на ДД МММММММ ГГГГ, например. 1 января 2018 года.

В одной ячейке несколько дат, я проверил несколько сайтов и не смог найти какой-либо VBA, который можно использовать для поиска в формате ГГГГ / ММ / ДД и изменить его на ДД МММММММ ГГГГ.

Кто-нибудь знает некоторые VBA / Links, которые могут помочь изменить все даты за один раз, а не вручную.

[Example of current status and desired output]

В настоящее время я пробовал, но мой VBA в лучшем случае ниже уровня новичка, поэтому не может перепроектировать приведенные ниже решения. https://www.myonlinetraininghub.com/6-ways-to-fix-dates-formatted-as-text-in-excel

https://www.ozgrid.com/forum/.../excel.../93919-search-and-replace-date-with-vba

https://stackoverflow.com/.../find-replace-macro-that-properly-formats-a-date-cell

https://webcache.googleusercontent.com/search?q=cache:EIyJ2TGgqQMJ:https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-msoffice_custom-mso_2007/find-and-replace-date-in-vba-keeping-the-format/64377177-9b0f-4118-81ed-49d8f9ddc8f4+&cd=6&hl=en&ct=clnk&gl=uk

EDIT: Вывод с решением Картика ниже. Единственная проблема заключается в том, что первая дата изменена, но разрывы строк из ALT + Enter теряются, а форматирование идет не очень хорошо.

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Регулярные выражения станут вашим другом для чего-то подобного. Следующее будет соответствовать каждой числовой дате с / в качестве разделителя. Затем он найдет каждое совпадение и заменит его форматом, указанным в переменной DateFormat. Обновите With ActiveSheet до имени вашего листа, чтобы объявить его явно, и вам может потребоваться изменить переменную rng для вашего собственного диапазона

Option Explicit
Public Sub ConvertDateFormat()
    Dim rng As Range
    Dim RegExp As Object: Set RegExp = CreateObject("VBScript.RegExp")
    Dim DateFormat As String
    Dim c, d

    DateFormat = "DD MMMM YYYY"

    With ActiveSheet
        Set rng = .Range(.Cells(2, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 3))
    End With

    With RegExp
        .Global = True
        .Pattern = "(\d{2,4}(\/|(?=\s)|\d$)){3}"

        For Each c In rng
            If .test(c) Then
                For Each d In .Execute(c.Value2)
                    c.Value2 = Replace(c.Value2, d, Format(d.Value, DateFormat))
                Next d
            End If
        Next c
    End With
End Sub
0 голосов
/ 17 мая 2018

Попробуйте по формуле ниже

=TEXT(LEFT(C2,10),"DD MMMMMMMM YYYY")&MID(C2,11,LEN(C2))

OUTPUT

enter image description here

EDIT

Пожалуйста, используйте код VBA, чтобы получить желаемый результат.

Sub test()
    Dim a, b As String
    Dim str1, str2 As Long
    a = Range("C2").Value
    str1 = Split(a, Chr(10))
    str2 = UBound(str1)
    For i = 0 To str2
        b = b & Format(Left(str1(i), 10), "DD MMMM YYYY") & Mid(str1(i), 11, Len(str1(i))) & Chr(10)
    Next i
    Range("D2").Value = b
End Sub

VBA OUTPUT

enter image description here

...