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


0

У мене є чимало даних, коли його дата / часова мітка була імпортована в excel як текст. Excel насправді не визнає це датою з часом. напр., 25.08.2011 16:17:59 (мм.дд.р. гг: мм: сс)

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

Як я можу це зробити? Поточний спосіб вирішення - це "повторне введення" матеріалів. Значить, якщо натиснути на клітинку, щоб активувати "редагування", і натиснути просто повернутись, то воно автоматично перетворюється Excel у час дати. Я можу автоматизувати матеріал за допомогою макросу VBA нижче, але, хоча у мене досить великий діапазон понад 30 000, це займає тривалий час, і ви не можете змінити вікно / програму в середній час, оскільки воно працює через gui.

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

Будь-які інші пропозиції, як автоматизувати цей матеріал набагато швидше? Я вже спробував інші можливості, але не вийшло:

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

    Dim myVar як String myVar = Формат (cell.value, "dd / mm / yyyy hh: nn: ss")

  • використовуючи макрос VBA з cell.FormulaR1C1 = "25.08.2011 16:17:59", але він також не працює. значення зберігається як текст

Спасибі за вашу допомогу


Як щодо DATEVALUE(String)+TIMEVALUE(String)?
G-Man

Відповіді:


1

Виберіть комірки та запустіть:

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

0

Це добре працювало для мене

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 через період ( .). Отже, я перетворюю крапку в прокрутку.

Після цього я міг використовувати код =Today(A1)і він розпізнав дату. Можливо, вам потрібно відформатувати комірки до дати після макросу.


0

Для формули робочого листа:

=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

Хак: скопіюйте увесь стовпчик у буфер обміну, вставте в блокнот, скопіюйте все з блокнота, вставте назад в excel. Переконайтесь, що формат дати / часу вашого комп’ютера відповідає тому, який використовується там, інакше excel не буде його інтерпретувати.


0

Усі значення можна встановити за один раз:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.