Excel VBA Макросы: разбить дату по столбцам

Автор Сергей, 15 ноября 2018, 21:35

Сергей

В столбце A даты формата:
1 января 2018
1-2 января 2018
1 января - 1 февраля 2018

Требуется разбить дату на два столбца: B, C:
01.01.18 01.01.18
01.01.18 02.01.18
01.01.18 01.02.18

Для первых двух случаев я разобрался и сделал через сплит, разделитель тире. Код прикладываю. А вот по третьему случаю не получается.
Подскажите как это можно сделать?

Макрос
Sub uuu()
    Dim a()
    Dim i&
    Dim sp_date, sp_day
    Dim d1$, d2$, m$, y$
'-------------------------
    Application.ScreenUpdating = False
    With ActiveSheet
        a = .UsedRange.Value
        For i = 1 To UBound(a)
            If a(i, 1) <> "" Then
                sp_date = Split(a(i, 1), " ")
                sp_day = Split(sp_date(0), "-")
                d1 = sp_day(0)
                d2 = d1
                If UBound(sp_day) > 0 Then d2 = sp_day(1)
                m = sp_date(1)
                y = sp_date(2)
                .Cells(i, 2) = CDate(d1 & " " & m & " " & y)
                .Cells(i, 3) = CDate(d2 & " " & m & " " & y)
            End If
        Next
    End With
    Application.ScreenUpdating = True
End Sub
[свернуть]

[вложение удалено администратором]

Администратор

Макрос
Sub Макрос()

    Dim arr(), src, date1 As Date, date2 As Date
    Dim spl, i As Long
   
   
    '1. Отключение монитора, чтобы ускорить макрос.
    Application.ScreenUpdating = False
   
    '2. Копирование данных из активного листа из области, в которой есть данные и оформление, в массив.
    arr() = ActiveSheet.usedrange.Value
   
    '3. Разбивка дат и запись их в столбцы B, C.
    ' Цикл по первому столбцу массива 'arr'.
    For i = 1 To UBound(arr)
       
        '1) Копируем данные из ячейки в переменную. Может быть это упростит чтения кода.
        src = arr(i, 1)
       
        '2) Если ячейка пустая.
        If src = "" Then
            GoTo metka_NextRow
        End If
       
        '3) Запись дат в переменные.
        'a) Если нет дефиса.
        If InStr(src, "-") = 0 Then
            spl = Split(src, " ")
            date1 = CDate(spl(0) & " " & spl(1) & " " & spl(2))
            date2 = CDate(spl(0) & " " & spl(1) & " " & spl(2))
        'b) Если дефис между цифрами: 1-2 января 2018.
        ElseIf src Like "*#-#*" Then
            HyphenAmongDigits src, date1, date2
        'c) Если дефис в другом месте: 1 января - 1 февраля 2018.
        Else
            HyphenInOtherPlace src, date1, date2
        End If
       
        '4) Копирование данных из переменных в эксель.
        Cells(i, 2) = date1
        Cells(i, 3) = date2
       
metka_NextRow:
    Next i
   
    '4. Включение монитора.
    Application.ScreenUpdating = True
   
End Sub

Private Sub HyphenAmongDigits(src, date1 As Date, date2 As Date)

    ' Если дефис между цифрами: 1-2 января 2018.
   
    Dim sp_date, sp_day
   
   
    '1. Разбивка текста на слова по пробелам.
    sp_date = Split(src, " ")
   
    '2. Разбивка первого слова на два слова по дефису.
    sp_day = Split(sp_date(0), "-")
   
    '3. Запись дат в переменые.
    date1 = CDate(sp_day(0) & " " & sp_date(1) & " " & sp_date(2))
    date2 = CDate(sp_day(1) & " " & sp_date(1) & " " & sp_date(2))
   
End Sub

Private Sub HyphenInOtherPlace(src, date1 As Date, date2 As Date)

    ' Если дефис в другом месте: 1 января - 1 февраля 2018.
   
    Dim spl, sp_1st, sp_2nd
   
   
    '1. Разбивка на части по дефису и пробелам, которые окружают дефис.
    spl = Split(src, " - ")
   
    '2. Разбивка первой даты на слова по пробелам.
    sp_1st = Split(spl(0), " ")
   
    '3. Разбивка второй даты на слова по пробелам.
    sp_2nd = Split(spl(1), " ")
   
    '4. Запись дат в переменные.
    date1 = CDate(sp_1st(0) & " " & sp_1st(1) & " " & sp_2nd(2))
    date2 = CDate(sp_2nd(0) & " " & sp_2nd(1) & " " & sp_2nd(2))
   
End Sub
[свернуть]

Сергей