Преобразовать строку, содержащую дни, часы и минуты в чч: мм: сс - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть 400 записей для обработки, и они имеют следующие форматы (строка):

3h
24h20min
3h
2d
26min
1h12min
17h35min
6h12min
30s

Как мне создать формулу, которая бы автоматически обнаруживала d, h, min и s и конвертировалась в правильные hh:mm:ss с чч, в конечном итоге превышающим 24?

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

Эта формула работает для всех ваших примеров

=SUM(MID(0&A1&"0000",FIND({"s","m","h","d"},0&A1&"xxsmhd")-2,2)/{86400,1440,24,1})

при условии, что данные в ячейке A1, отформатируйте ячейку результата как [ч]: мм: сс

Сбой, если у вас есть однозначное значение, которого нет в начале, поэтому если у вас есть 12h03min, все будет в порядке, но если у вас будет 12h3min, формула не будет выполнена. Я, наверное, могу это исправить, хотя ......

2 голосов
/ 17 февраля 2012

Этот мой предыдущий ответ поможет вам в этом.

Небольшая корректировка:

=VALUE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B5,"d"," "),"h",":"),
 "min",":"),"s",""))

А затем отформатируйте ячейку как [h]:mm:ss, где [h] означает, что число часов может быть больше 24 (вместо перехода к нулю),

Я не утверждаю, что эта формула будет работать во всех ваших случаях.На самом деле, он терпит неудачу, когда у вас есть только минуты, секунды, дни и минуты, но нет часов и т. Д. Но вы просите «помощи или подсказок», и это действительно должно дать вам отправную точку для разработки формулы, которая подходитдля ваших обстоятельств.

enter image description here

РЕДАКТИРОВАТЬ Я не мог устоять.Я сделал пользовательскую функцию VBA, которая анализирует ваши строки дат.Он достаточно надежен и работает для всех ваших примеров и даже больше, даже для строки со случайными символами, например, 6d 243min + 7s.Обратите внимание, что вы все равно должны отформатировать ячейки как [h]:mm:ss.

enter image description here

Function ParseDateTime(sTime As String) As Date

    Dim i As Long
    Dim identifierPos As Long
    Dim iTimeUnit As Long
    Dim nTimeUnit As Long
    Dim timeUnitCount As Long
    Dim timeUnitIdentifier() As String
    Dim timeUnitDateValue() As Date
    Dim thisDate As Date

    ' What are we looking for in the string?
    ReDim timeUnitIdentifier(1 To 4)
    timeUnitIdentifier(1) = "d"
    timeUnitIdentifier(2) = "h"
    timeUnitIdentifier(3) = "min"
    timeUnitIdentifier(4) = "s"

    ' What does each of these identifiers mean?
    ReDim timeUnitDateValue(1 To 4)
    timeUnitDateValue(1) = 1 ' value of 1 means 1 day in Date type.
    timeUnitDateValue(2) = TimeSerial(1, 0, 0)
    timeUnitDateValue(3) = TimeSerial(0, 1, 0)
    timeUnitDateValue(4) = TimeSerial(0, 0, 1)

    nTimeUnit = UBound(timeUnitIdentifier)

    ' Treat each time unit separately
    For iTimeUnit = 1 To nTimeUnit
        ' Try to locate this time unit's identifier
        identifierPos = InStr(sTime, timeUnitIdentifier(iTimeUnit))
        If identifierPos > 0 Then
            ' Found it. Extract the digits that precede the identifier.
            For i = identifierPos - 1 To 1 Step -1
                If Not (Mid(sTime, i, 1) Like "[0-9]") Then
                    Exit For
                End If
            Next i
            timeUnitCount _
                = CLng(Mid(sTime, i + 1, identifierPos - i - 1))
            thisDate = thisDate _
                + timeUnitCount * timeUnitDateValue(iTimeUnit)
        Else
            ' Identifier not found. Do nothing.
        End If

    Next iTimeUnit

    ParseDateTime = thisDate
End Function
0 голосов
/ 19 февраля 2018

Пример: 7 недель 31 день 24 часа 60 минут

Формула:

= ((IFERROR(VALUE(MID(J2,IF((FIND("weeks",A1)-3)=0,1,
(FIND("weeks",A1)-3)),2)),0))*(60*60*7*24))+
   ((IFERROR(VALUE(MID(A1,IF((FIND("days",A1)-3)=0,1,
(FIND("days",A1)-3)),2)),0))*(60*60*24))+
   ((IFERROR(VALUE(MID(A1,IF((FIND("hours",A1)-3)=0,1,
(FIND("hours",A1)-3)),2)),0))*(60*60))+
   ((IFERROR(VALUE(MID(A1,IF((FIND("minutes",A1)-3)=0,1,
(FIND("minutes",A1)-3)),2)),0))*(60))

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