2013-04-22 5 views
1

Я получил следующее задание: поворот "dd/mm/yyyy hh: mm: ss" time to "yyyy. mm.dd hh: mm ".Время форматирования от dd/mm/yyyy hh: mm: ss to yyyy.mm.dd hh: mm

Я надеялся, что простой формат (activecell.value, "yyyy.mm.dd hh: mm") поможет, но. В некоторых случаях это работает. Однако в некоторых особых случаях это не так. Когда день между 01-12 (взаимозаменяемый с месяцами!), Тогда он испортил дни с месяцами. (Вероятно, из-за США формат даты стиль.)

Например, оригинальная строка: 04/06/2013 09:00:00

Ожидаемое: 2013.06.04 09:00

Результат : 2013.04.06 09:00 (день и месяц были заменены)

Я попытался преодолеть это путем форматирования ввода, я дал ему «dd/mm/yyyy hh: mm: ss» custom format. Не помогло, оно все равно меняет день и месяц.

Итак, у меня нет идей, но регулярных выражений. Формат даты всегда один и тот же, так что просто перемещение частей строки будет в порядке. Однако я не знаю, как это работает, и поиск в Google приводит к запутывающим результатам.

Может ли кто-нибудь мне помочь? Конечно, если есть более элегантный способ сделать это, это также приветствуется.

+0

Каким образом даты вошли в рабочий лист? Если он был сильно импортирован, часто возникают такие ошибки (сочетание между датами Британии и США). Я бы предложил сначала правильно отформатировать его. Один из показателей, который я нашел из опыта, заключается в том, что даты не группируются вместе, когда вы помещаете фильтр и открываете фильтр для дат. – Jerry

+0

Я не тот, кто импортирует данные, поэтому я не знаю, как это делается. Я должен работать с этим так, не так много, что я могу с этим справиться. –

+0

Хорошо, вы попробовали фильтр, о котором я упоминал ранее? Я не уверен, как спросить вас, поэтому я получаю ответ, который я ищу. Можете ли вы определить, какие даты плохо отформатированы? Я подозреваю, что «хорошие даты» находятся в формате 'dd/mm/yyyy hh: mm: ss', тогда как плохие даты указаны в' mm/dd/yyyy hh: mm: ss'. Что произойдет, если вы отформатируете все их как 'mm/dd/yyyy hh: mm: ss'? Все изменения датируются или меняются только хорошие даты? – Jerry

ответ

2

Попробуйте использовать этот пользовательский формат:

yyyy/mm/dd h:mm;@ 

Чтобы ввести его, щелкните правой кнопкой мыши на ячейке и выберите Формат ячеек:

Format Cell

Тогда под Number Tab Выберите Custom из списка. И введите предоставленный формат в текстовое поле Type:.

Example

Если это не сработает. Вы ***** Абсолютно ***** Положительно, что 04/06/2013 09:00:00 IS 6 апреля 2013 года, а НЕ 4 июня 2013 года?

Если это не работает, и вы подтвердили правильность дат.

Sub ChangeDateFormat() 

Application.ScreenUpdating = False 

Dim CurrentCell As Range 
Dim LastRow As Long 
Dim RegEx As Object 
Set RegEx = CreateObject("vbscript.regexp") 
RegEx.Global = True 

LastRow = Range("A" & Rows.Count).End(xlUp).Row 'Get The Last Row in Column Change A as Needed 

For Each CurrentCell In Range("A1:A" & LastRow) ' Loop through all cells. Change Column as needed 

    If InStr(CurrentCell.Value, "/") <> 0 Then 'To make sure only convert non converted ones 

     RegEx.Pattern = "(\d{2})/(\d{2})/(\d{4}) (\d{2}):(\d{2}):(\d{2})" ' Seperate all parts of imported Data into groups 
     CurrentCell.Value = RegEx.Replace(CurrentCell.Value, "$3.$2.$1 $4:$5") ' Change order of groups and place into cell. 

    End If 

Next 

Application.ScreenUpdating = True 

End Sub 

***** Примечание: ***** Это будет работать только если ВСЕ значения даты имеют dd/mm/yyyy hh:mm:ss, если они вам не придется добавить некоторые Обработка ошибок и, возможно, немного изменить код как он WILL вызвать проблемы.

Это также будет работать с датами, которые находятся внутри другого текста. Если значение A1 является

This is a test 04/06/2013 09:00:00 Lets see what happens

Тогда новое значение будет

This is a test 2013.06.04 09:00 Lets see what happens

+0

Пользовательское форматирование ячеек ничего не делает, я тоже сам их пробовал. Я написал макрос для форматирования ячеек, здесь: --- 'LastRow = Диапазон («I2»). Конец (xlDown) .Row; Для i = 2 To LastRow; Если ячейки (i, 9) .NumberFormat <> "yyyy.mm.dd hh: mm" Then; Ttime = Клетки (I, 9) .value; клетки (я, 9) .Value = Формат (TTIME, "YYYY.MM.DD HH: мм"); End If; Next' --- могу» t загружать изображения прямо сейчас, так что вот два противоречащих примера: Вход -> результат | 25/04/2013 10:00:00 -> 2013.04.25 10:00 | 01/04/2013 00:00:00 -> 2013.01.04 00:00 –

+0

Если вы используете 'DATEVALUE' в ячейке, вы получаете' #VALUE! '? – user2140261

+0

Да, тот же результат с 'TIMEVALUE'. –

0

его простой. , , просто выполните шаги выберите весь столбец или даже нужные ячейки нажмите правую кнопку мыши и выберите опцию ячейки ячейки, откроется окно вкладки с даты выбора номера, из выпадающего меню локали выберите английский (Южная Африка) из указанных опций в типе выберите нужный обратный формат. , , и вы сделали :)

+0

Выбор южноафриканского формата ничего не делает для текста. Если я запустил свой макрос, он снова производит те же результаты :( –

0

Если месяц и день находятся в неправильном месте, вы можете использовать "DATE(YEAR(A1),DAY(A1),MONTH(A1))", при условии, что это даты формат и "DATE(MID(A1,7,4),LEFT(A1,2),MID(A1,4,2))", если он находится в текстовом формате

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