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

#excel #string #excel-formula

#преуспеть #строка #excel-формула

Вопрос:

Я пытаюсь добавить «## секунды» или «## минуты» из ячеек со строками в них.

Струны Желаемый результат
Ходите 30 секунд быстро 30 секунд
Бег трусцой 9 минут медленно 9 минут
Бегите очень быстро 1 минута 1 минута

Я могу построить формулу, чтобы получить число или меру, но я не смог создать одну формулу, чтобы сделать и то, и другое? Кто-нибудь может помочь?

Ответ №1:

Как насчет:

введите описание изображения здесь

Так что вы можете легко вставить ее:

 IFERROR(TRIM(MID(A3,FIND("min",A3,1)-3,10)),TRIM(MID(A3,FIND("sec",A3,1)-3,10)))
 

Ошибка iferror сначала проверяет минуты, а затем секунды.
Обрезка избавляет от начальных или конечных пробелов в зависимости от того, является ли число однозначным или двузначным.
Mid() и find() вырезают нужную часть. Я использовал только «min» и «sec» Вместо «минут» и т. Д., Как если бы была опечатка «minites», например, она не была бы найдена.

Разберите ее на части, чтобы увидеть каждый бит…

Комментарии:

1. @Gary’S Student Ну, я собирался сказать, что это метод «грубой силы», но все равно спасибо 🙂 Как и ваш UDF, и я предполагаю, что «длительность» зарезервирована, поэтому вы использовали «длительность»?

2. Мне очень нравится ваша формула. Вы правы duration() — это стандартная функция Excel.

3. Солар Майк: ты справился. Я изменил формулу, чтобы я мог искать термины (секунды, минуты, часы и другие) из списка слов, и это работает отлично! Спасибо. Вот модифицированная формула, в которой СПИСОК представляет собой диапазон слов для поиска: =IFERROR(TRIM(MID(A1,FIND(INDEX(LIST,MATCH(1,COUNTIF(A1,» «amp;LISTamp;» «),0)),A127,1)-3,10)),»»)

Ответ №2:

Рассмотрим следующую определяемую пользователем функцию:

 Option Explicit
Public Function durration(s As String) As String
    Dim t As String, arr, i As Long
    t = LCase(s)
    durration = ""
    
    If InStr(t, "minute") = 0 Then
        If InStr(t, "second") = 0 Then
            Exit Function
        End If
    End If
    
    arr = Split(s, " ")
    For i = LBound(arr)   1 To UBound(arr)
        t = LCase(arr(i))
        If t = "minute" Or t = "minutes" Or t = "second" Or t = "seconds" Then
            durration = arr(i - 1) amp; " " amp; arr(i)
            Exit Function
        End If
    Next i
End Function
 

введите описание изображения здесь

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

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

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

Чтобы удалить UDF:

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

Для использования UDF из Excel:

 =durration(a1)
 

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

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

и

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

а для получения более подробной информации об UDFS см.:

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

Для этого должны быть включены макросы!

Ответ №3:

-Получить позицию первого числа в строке:

     AGGREGATE(15,6,FIND(ROW($1:$9),A1 amp; " "),1)
 

-Получить индекс пробела после minute[s] or second[s] в строке:

     AGGREGATE(15,6,FIND(" ",A1amp;" ",SEARCH({"second","minute"}, A1amp;" ")),1)
 

Используйте функцию MID, эта формула работает для меня:

     =MID(A1 amp; " ",AGGREGATE(15,6,FIND(ROW($1:$9),A1 amp; " "),1),
                  AGGREGATE(15,6,FIND(" ",A1amp;" ",SEARCH({"second","minute"}, A1amp;" ")),1)- 
                  AGGREGATE(15,6,FIND(ROW($1:$9),A1 amp; " "),1)
        )
 

введите описание изображения здесь

-Причина использования A1 amp; " " заключается в том, чтобы избежать несуществующих пробелов после minute[s] or second[s]

Комментарии:

1. Ну, функционально похоже на мое, но, похоже, намного больше ввода…

2. Привет @SolarMike, ты был прав, похоже, я все усложнил =)

3. Однако этот агрегат настолько гибкий, что его нужно использовать чаще.