Извлечь два числа из строки, используя формулу - PullRequest
2 голосов
/ 03 марта 2020

У меня есть формула для извлечения чисел из ответа Google XML, которые могут быть:

  1. 9 часов 24 минут
  2. 10 h 0 min
  3. 9 h 20 min
  4. 11 h 13 min
  5. 10 Std 55 min
  6. 9 timmar 5 min
  7. 19 min

Вот текущая формула ( значение указывается в BZ1):

=IFERROR(IF(VALUE(IF(FIND("min";BZ1;1)=11;MID(BZ1;FIND("min";BZ1;1)-2;1);MID(BZ1;FIND("min";BZ1;1)-3;2)))<30; VALUE(LEFT(BZ1;FIND("h";BZ1;1)-2))&","&5;VALUE(LEFT(BZ1;FIND("h";BZ1;1)-2))+1);"")

Формула округляет часы и минуты до часов, например

  • 1 h 39 min -> 2
  • 10 h 12 min -> 10,5
  • 9 h 20 min -> 9,5

Существует проблема, связанная с тем, что она не может учитывать изменения языка для hours и min.

Есть ли возможность заставить его работать так:

  • Если есть только номер (дело 19 min) -> номер извлечения
  • Если есть два числа (регистр 1 h 39 min) -> извлечь первое число как часы, затем из двух последних пробелов число как минуты

РЕДАКТИРОВАТЬ:

Проверьте, сколько чисел в ячейке (цель в CA25):

SUM(LEN(CA25)-LEN(SUBSTITUTE(CA25;{1;2;3;4;5;6;7;8;9};)))>1

Если больше 1

LEFT(CA25;(FIND(" ";CA25;1)-1))&TRIM(MID(SUBSTITUTE(CA25;" ";REPT(" ";50));100;50))

Если меньше 1

LEFT(CA25;SUM(LEN(CA25)-LEN(SUBSTITUTE(CA25;{"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"};""))))

Все вместе

=IF(SUM(LEN(CA25)-LEN(SUBSTITUTE(CA25;{1;2;3;4;5;6;7;8;9};)))>1;LEFT(CA25;(FIND(" ";CA25;1)-1))&TRIM(MID(SUBSTITUTE(CA25;" ";REPT(" ";50));100;50));LEFT(CA25;SUM(LEN(CA25)-LEN(SUBSTITUTE(CA25;{"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"};"")))))

В результате получается:

enter image description here

Теперь их нужно преобразовать в часы и округлить до одного часа


РЕДАКТИРОВАТЬ 2:

Вот формула (цель BZ1):

=IFERROR(IF(LEN(BZ1)-LEN(SUBSTITUTE(BZ1;" ";""))>2;LEFT(BZ1;(FIND(" ";BZ1;1)-1))+IF(TRIM(MID(SUBSTITUTE(BZ1;" ";REPT(" ";50));100;50))<60;1;1);IF(LEFT(BZ1;SUM(LEN(BZ1)-LEN(SUBSTITUTE(BZ1;{"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"};""))))<60;1;1));"")

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

Вот небольшая пользовательская функция:

Option Explicit
Public Function Tyme(inpt As String) As Double
    Dim arr, U As Long
    Tyme = 0
    arr = Split(inpt, " ")
    U = UBound(arr)
    If U = 0 Then Exit Function
    If U = 1 Then
        Tyme = CDbl(arr(0))
    Else
        Tyme = CDbl(arr(0)) + CDbl(arr(2)) / 60#
    End If
End Function

Это:

  • не зависит от языка
  • возвращает без округления значение с плавающей запятой (часы)

Некоторые примеры:

enter image description here

Пользовательские функции (UDF) очень просто установить и использовать:

  1. ALT-F11 открывает окно VBE
  2. ALT-I ALT-M открывает свободное sh module
  3. вставьте материал и закройте окно VBE

Если вы сохраните книгу, UDF будет сохранен вместе с ней. Если вы используете версию Excel более поздней, чем в 2003 году, вы должны сохранить файл как .xlsm, а не .xlsx

В удалить UDF:

  1. откройте окно VBE, как указано выше
  2. очистите код
  3. закройте окно VBE

до используйте UDF из Excel:

=Tyme(A1)

Чтобы узнать больше о макросах в целом, см .:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

и

http://msdn.microsoft.com/en-us/library/ee814735 (v = office.14) .aspx

и подробности об UDF см. В

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

Макросы должно быть включено, чтобы это работало!

ПРИМЕЧАНИЯ:

  1. должно применяться округление снаружи udf
  2. было бы легко изменить udf для обработки секунд
  3. было бы легко изменить udf так, чтобы он возвращал истинное время Excel, а не часы с плавающей запятой
2 голосов
/ 03 марта 2020

Могу ли я предложить вам использовать функцию VBA? Поскольку в ваших примерах всегда есть пробел между числами и другими символами, это должно быть сделано:

Public Function TimeInHoursRoundedUp(rng as Range)
    Dim var As Variant: var = Split(rng, " ")
    Dim item As Variant
    Dim hour As Integer: hour = 0
    For Each item In var
        If IsNumeric(item) Then
            If hour = 0 Then hour = hour + item Else hour = hour + 1
        End If
    Next item
    TimeInHoursRoundedUp = hour
End Sub

Тогда в вашем листе Excel вы можете просто написать =TimeInHoursRoundUp() и ввести ссылку на ячейку внутри кронштейны.

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