Как управлять временем в секундах в текстовом формате? - PullRequest
0 голосов
/ 14 февраля 2020

Я сообщаю об одном из старых телекоммуникационных приложений, которое экспортирует данные в текстовом формате.

Я могу преобразовать текст во время.

Проблема: Проблема возникает, когда я получить время в этом формате
-: 00,
-: 22,

Данные изменяются с: 22 на 00:22:00, что изменяется от 22 секунд до 22 минут.

Sub FixTime()
    For Each cell In Range("A1:A10")
        cell.Value = "00" & cell.Value
    Next
End Sub

Этого не произойдет, если у меня есть 00:22:00 (минуты) и 01:22:00 (часы).

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Я настоятельно рекомендую использовать функцию TimeSerial для создания формата реального времени, а не строки снова. Недостаток использования функции Format заключается в том, что она снова создает строку. Обратите внимание, что эта строка может выглядеть как время, но это не . Для Excel это просто строка, в то время как если вы используете TimeSerial(), вы получите реальное время, которое Excel распознает как время и может вычислить с помощью.

Правило № 1, когда вы работаете с датами и время:
Никогда не позволяйте Excel конвертировать дату или время самостоятельно. Никогда не позволяйте Excel угадать, какой формат этой строки. Никогда не позволяйте Excel решать что-либо! • Вместо этого всегда указывайте c и разбирайте строку самостоятельно. Вы единственный, кто может сказать на 100%, какой формат должен быть правильным. Excel определенно потерпит неудачу рано или поздно.

Option Explicit

Public Sub ConvertStringIntoTimes()
    Dim Cell As Range
    For Each Cell In Range("A1:A10").Cells
        Dim RawData() As String 'split cell text by `:`
        RawData = Split(Cell.Text, ":")

        'validate if one is empty string or non-numeric
        Dim i As Long
        For i = 0 To UBound(RawData)
            If RawData(i) = vbNullString Then
                RawData(i) = 0 'epmty string is considered to be zero
            ElseIf Not IsNumeric(RawData(i)) Then
                GoTo NextCell  'non-numeric cannot be handled continue with next cell
            End If
        Next i

        Dim OutputTime As Date
        Select Case UBound(RawData)
            Case 2: '01:22:33 or :22:33
                OutputTime = TimeSerial(RawData(0), RawData(1), RawData(2))

            Case 1: '22:33 or :33
                OutputTime = TimeSerial(0, RawData(0), RawData(1))

            Case 0: '33
                OutputTime = TimeSerial(0, 0, RawData(0))

            Case Else: 'anything else that connot be converted
                GoTo NextCell
        End Select

        'set numberformat and write value as real time
        Cell.NumberFormat = "[$-F400]h:mm:ss AM/PM" 'choose your desired time format
        Cell.Value = OutputTime

NextCell:
    Next Cell
End Sub

enter image description here Изображение 1: Слева - входные данные, справа столбец - вывод, который будет выполнять процедура дать.

1 голос
/ 14 февраля 2020

Добро пожаловать в ТА Maciej. Я надеюсь, что я использовал несколько действительных примеров, и этот код поможет вам начать!

Sub FixTime()
    Dim cell As Range

    For Each cell In Range("A1:A10")
        Select Case Len(cell.Value)
            Case 3 'seconds
                cell.Offset(0, 1).Value = TimeSerial(0, 0, Right(cell.Value, 2))
            Case 6 'minutes
                cell.Offset(0, 1).Value = TimeSerial(0, Mid(cell.Value, 2, 2), Right(cell.Value, 2))
            Case 8 'full time
                cell.Offset(0, 1).Value = TimeSerial(Left(cell.Value, 2), Mid(cell.Value, 4, 2), Right(cell.Value, 2))
        End Select
    Next
End Sub

(код был изменен с использованием TimeSerial согласно комментарию @ Pᴇʜ)

I Преобразую значения из столбца A и перенесу результаты в столбец B (не стесняйтесь пропустить часть Offset(0,1), чтобы просто заменить существующие значения):

enter image description here

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

Попробуйте что-то вроде этого.

Sub FixTime()
    Dim t As Double
    Dim s As String
    For Each cell In Range("A1:A10")
        If Left(cell, 3) = "- :" Then
            s = Replace(cell, "- :", "")
            t = Val(s) / 24
            t = t / 3600
            cell.Value = Format(t, "hh:mm:ss")
        Else
            cell.Value = "00" & cell.Value
        End If

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