Excel VBA или Формула для преобразования текста в дату с типом времени

У меня есть довольно много данных, где его дата / временная метка была импортирована в excel в виде текста. В Excel не распознает ее как дата С время. например 25.08.2011 16: 17: 59 (мм. dd.гггг чч:мм:СС)

теперь мне нужно преобразовать его в дату со временем, чтобы его можно было использовать для дальнейшего расчета с excel.

Как я могу это сделать? Текущий обходной путь должен "повторно ввести" материал. Означает, что если вы нажмете в ячейку, чтобы активировать "редактировать" и нажмите просто вернуться, то это автоматически преобразуется Excel в дату и время. Я могу автоматизировать материал макросом VBA ниже, но в то время как у меня есть довольно огромный диапазон более 30 000, это занимает много времени, и вы не можете изменить окно / или приложение в то же время, потому что оно работает через графический интерфейс.

 Set c = Range("A1").Cells
 c.Select
 For row = c.row To 30000
     SendKeys "{F2}", True
     SendKeys "{ENTER}", True
 Next row

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

    изменить там ячейки с пользовательский формат мм. ДД.гггг чч: мм: ss-значение ячейки не преобразуется автоматически в дату
  • использование формулы DATEVALUE (String): значение преобразуется, но оно просто преобразует дату и время теряется, например, 25.08.2011 00:00: 00 (mm.dd.гггг чч:мм:СС)
  • использование формулы TIMEVALUE (String) значение преобразуется, но он просто преобразует время и дата теряется, например, 00.00.1900 16:17:59 (mm.dd.гггг чч:мм:СС)
  • использование функции VBA "Format ()" например, значение получить изменение формата, но до сих пор впоследствии распознается как текст, например,

    Dim myVar как строка
    myVar = формат (ячейка.значение, "ДД/ММ/гггг чч:НН:СС")

  • использование макроса VBA с ячейкой.FormulaR1C1 = "25.08.2011 16:17:59" но это не сработало. значение сохранять распознанным как text

Спасибо за помощь

3
задан megloff
25.03.2023 21:41 Количество просмотров материала 3277
Распечатать страницу

5 ответов

выделите ячейки и выполните команду:

Sub DateFixer()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
        For Each r In Selection
            v = r.Text
            r.Clear
            r.NumberFormat = "dd/mm/yyyy hh:mm:ss"
            r.Value = DateSerial(Mid(v, 7, 4), Mid(v, 4, 2), Left(v, 2)) + TimeSerial(Mid(v, 12, 2), Mid(v, 15, 2), Right(v, 2))
        Next r
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub
1
отвечен Gary's Student 2023-03-27 05:29

Это сработало для меня

Sub dothis()

Dim row As Integer
row = 0

Dim maxRows As Integer
maxRows = 3

For row = 1 To maxRows
    Range("A" & row).Value = Replace(Range("A" & row).Value, ".", "/")
Next row

End Sub

просто, на ПК Великобритании в любом случае, это не понравилось 25.08.2011 из-за периода (.). Итак, я преобразовать точку на forwardslash.

после этого, я мог бы использовать код =Today(A1) и он распознал дату. Может быть, вам нужно отформатировать ячейки на сегодняшний день после макроса.

0
отвечен Dave 2023-03-27 07:46

для Формулы:

=DATE(MID(A1,7,4),MID(A1,4,2),LEFT(A1,2))+TIME(MID(A1,12,2),MID(A1,15,2),RIGHT(A1,2))

и затем отформатировать его, как вам нравится.

Если вы хотите использовать макрос VBA, предполагается

  • ваши данные начинаются с A1 и находятся в столбце a
  • результаты будут в столбце B -- но вы можете легко изменить код, чтобы перезаписать, как только вы видите, что он работает нормально
  • формат похож на ваши примеры: дата и время разделены одним пробелом; компоненты даты разделены по < точке >; компоненты времени разделяются < двоеточием >

Option Explicit
Sub ConvertDateTimeString()
    Dim vraw, vRes()
    Dim vDT, vTime, V
    Dim DT As Date, TM As Date
    Dim I As Long, S As String

vraw = Range("a1", Cells(Rows.Count, "A").End(xlUp))
    If VarType(vraw) < vbArray Then 'check for only one entry
        ReDim vraw(1 To 1, 1 To 1)
        vraw(1, 1) = [a1]
    End If
ReDim vRes(1 To UBound(vraw), 1 To 1)

For I = 1 To UBound(vraw)
    S = vraw(I, 1)
    vDT = Split(Split(S)(0), ".")
    vTime = Split(Split(S)(1), ":")

    DT = DateSerial(vDT(2), vDT(1), vDT(0))
    vTime = TimeSerial(vTime(0), vTime(1), vTime(2))
    vRes(I, 1) = DT + vTime
Next I

With Range("B1").Resize(UBound(vRes), 1)
    .EntireColumn.Clear
    .Value = vRes
    .NumberFormat = "dd.mm.yyyy hh:mm:ss"
    .EntireColumn.AutoFit
End With
End Sub
0
отвечен Ron Rosenfeld 2023-03-27 10:03

Hack: скопируйте весь столбец в буфер обмена, вставьте в блокнот, скопируйте все из блокнота, вставьте обратно в excel. Убедитесь, что формат даты/времени вашего компьютера совпадает с используемым там, иначе excel не будет интерпретировать его.

0
отвечен JollyMort 2023-03-27 12:20

все значения можно установить сразу:

With Range("A1:A30000")
    .NumberFormat = "dd.mm.yyyy hh:mm:ss"     ' optional to set the display format
    .Value = .Value
End With

или заменить любой символ на себя, чтобы повторно оценить значения:

With Range("A1:A30000")
    .NumberFormat = "dd.mm.yyyy hh:mm:ss"     ' optional to set the display format
    .Replace " ", " "
End With
0
отвечен Slai 2023-03-27 14:37

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

date-time
microsoft-excel
vba
worksheet-function
Вверх