2014-01-09 6 views
-1

Я новичок в VBA и работаю над макросом, который поможет мне преобразовать записи вызовов во что-то полезное для анализа.VBA Конвертировать и комбинировать дату и время

Столбец E содержит дату вызова, которая отформатирована YYYYMMDD. Мне нужно преобразовать в MM/DD/YYYY. (т. е. 20140101 конвертировать в 1/1/2014)

Столбец F содержит время разговора, которое отформатировано HHMMSS или HMMSS в зависимости от того, имеет ли час две цифры или одну. Мне нужно преобразовать в HH: MM: SS (т. Е. 130101 или 90101, которые необходимо преобразовать в 13:01:01 и 9:01:01, соответственно). Поскольку в часе отсутствует десятка цифр, если значение меньше десяти, (ниже), я добавил «0» в начало значения, чтобы использовать функцию даты.

я в настоящее время не ввести следующую формулу в колонке K и автозаполнение до конца диапазона:

= ДАТА (ЛЕВЫЙ (E2,4), MID (E2,5,2), вправо (E2,2)) + ВРЕМЯ (LEFT (IF (LEN (F2) = 5, 0 & F2, F2), 2), MID (IF (LEN (F2) = 5, 0 & F2, F2), 3,2), ПРАВЫЙ (ЕСЛИ (LEN (F2) = 5, 0 & F2, F2), 2))

формула приводит к значению, как "1/1/2013 13:01:01".

Может кто-нибудь помочь мне написать код VBA для автоматизации этого процесса?

спасибо.

ответ

2

Созданы отдельные UDF для этого. Вставьте следующее в модуль.

Function MorphDate(DateRng As Range) 

    Dim DateStr As String: DateStr = DateRng.Value 
    Dim Yr As String, Mt As String, Dy As String 

    Yr = Left(DateStr, 4) 
    Mt = Mid(DateStr, 5, 2) 
    Dy = Right(DateStr, 2) 

    MorphDate = Format(DateSerial(Yr, Mt, Dy), "m/dd/yyyy") 

End Function 

Function MorphTime(TimeRng As Range) 

    Dim TimeStr As String: TimeStr = TimeRng.Value 
    Dim Hh As String, Mm As String, Ss As String 

    If Len(TimeStr) = 5 Then TimeStr = "0" & TimeStr 

    Hh = Left(TimeStr, 2) 
    Mm = Mid(TimeStr, 3, 2) 
    Ss = Right(TimeStr, 2) 

    MorphTime = Format(TimeSerial(Hh, Mm, Ss), "hh:mm:ss") 
End Function 

Function MorphDateTime(DateRng As Range, TimeRng As Range) 

    Application.Volatile 
    MorphDateTime = CDate(MorphDate(DateRng)) + CDate(MorphTime(TimeRng)) 

End Function 

Теперь вы можете использовать формулы MorphDate, чтобы изменить дату, MorphTime изменить время и MorphDateTime для сочетания обоих.

Скриншот:

enter image description here

Дайте нам знать, если это помогает.

EDIT:

Если вы хотите использовать его внутри подпрограммы, добавьте следующий код в модуль:

Sub MorphingTime() 

    Dim DateRng As Range, Cell As Range 
    Set DateRng = Range("E2:E100") '--Modify as needed. 

    For Each Cell in DateRng 
     Range("K" & Cell.Row).Value = MorphDateTime(Cell, Cell.Offset(0,1)) 
    Next Cell 

End Sub 

Надеется, что это помогает.

+0

Большое вам спасибо! Это отлично работает. В качестве продолжения, если бы я хотел включить это в подпрограмму Sub, как бы я это сделал? Диапазон для даты - E2 до конца, а время - F2 до конца. – blahblahblah

+0

@ bfs1990: Проверьте обновленный код. :) – Manhattan

+0

Отлично! В очередной раз благодарим за помощь. Я многому учусь! – blahblahblah

Смежные вопросы