VBA - Date-Time String Заменить / Заменить - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть столбец, в котором есть дата и время писем от outlook. Некоторые даты в формате - January 2, 2020 4:15 PM, January-14-20 12:44 PM, December-24-19 20:15 PM.

Я пытался использовать функции Заменить и Заменить, Замена работает, как определено, но из строки время удаляется. Я хотел бы иметь все даты как 2019-12-27 3:02 PM.

sub Replace()
 Dim sString, searchString as String
 dim i, LastCell as Long

 LastCell = Range("C" & Rows.Count).End(xlUp).Row
 Set searchRng = Range("C3:C" & lastCell)

 For Each c In searchRng
   sString = c
   searchString = "-"

   If InStr(1, sString, searchString, vbTextCompare) > 0 Then
      i = InStr(1, sString, SearchString, vbTextCompare)
      i = InStr(i + 1, sString, SearchString, vbTextCompare)
      c.Offset(0, 1) = WorksheetFunction.Replace(sString, i, "19", " 2020")
   End If
 Next c
End Sub

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Действительно безопасный способ сделать это, не позволяя Excel угадать:

Используйте Регулярное выражение , чтобы проанализировать и разделить дату на части (например, используя этот шаблон ):

А затем используйте функции DateSerial и Функция TimeSerial для создания значения реальной даты:

Dim RealDateTime As Date
RealDateTime = DateSerial(2020, 2, 20) + TimeSerial(16, 50, 22)

Это можно записать как реальное значение даты в ячейке:

Range("A1").Value = RealDateTime 

И отформатировано как вам угодно (потому что это реальное значение даты)

Range("A1").NumberFormat = "yyyy-mm-dd hh:mm AM/PM"
1 голос
/ 20 февраля 2020

CDate преобразует дату / время, которое является строкой, в реальную дату / время, которое можно отформатировать.

Таким образом, код типа:

For Each c In rngSrc
    c.Offset(0, 1) = CDate(c)
    c.Offset(0, 1).NumberFormat = "yyyy-mm-dd h:mm AM/PM"
Next c

будет преобразовывать

enter image description here

0 голосов
/ 20 февраля 2020

Я все еще думаю, что вы могли бы сделать это проще:

'
'
'
 LastCell = Range("C" & Rows.Count).End(xlUp).Row
With Range("C3:C" & lastCell).Offset(0, 1)
    .FormulaR1C1 = "=TEXT(RC[-1],""yyyy-mm-dd hh:mm AM/PM"")"
    .Value = .Value
End With

ПРИМЕЧАНИЕ: yyyy-mm-dd hh:mm AM/PM будет работать в соответствии с вашими региональными настройками, поэтому, если Excel не на английском sh , перевести его. Мой Excel - это испанский sh, и этот код не будет работать для меня, если я не наберу aaaa-mm-dd hh:mm AM/PM вместо yyyy-mm-dd hh:mm AM/PM

Конвертируем все даты одновременно.

Диапазон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...