Как найти ячейку, которая содержит круглые скобки вокруг числа - например, (1) - PullRequest
0 голосов
/ 02 января 2019

Формула, которую я использую:

=IF(SUM(COUNTIF(K6,"*"&{"current","(1)"}&"*")),"within 5 minutes",
IF(SUM(COUNTIF(K6,"*"&{"current","(2)"}&"*")),"within 10 minutes",
IF(SUM(COUNTIF(K6,"*"&{"current","(3)"}&"*")),"within 15 minutes",
IF(SUM(COUNTIF(K6,"*"&{"current","(4)"}&"*")),"within 20 minutes",
IF(SUM(COUNTIF(K6,"*"&{"current","(5)"}&"*")),"within 25 minutes",
IF(SUM(COUNTIF(K6,"*"&{"current","(6)"}&"*")),"within 30 minutes"))))))

Выход вытягивает любую ячейку, содержащую current и 1 / 2 / 3 и т. Д.

Мне нужно, чтобы он вытягивал только те ячейки, которые содержат current и (1) / (2) / (3) и т. Д.


Надеюсь, есть простой способ убедиться, что формула содержит скобки!


Вот пример скриншота ожидаемого результата: enter image description here

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Если VBA и UDF в порядке, тогда я советую вам использовать регулярные выражения.

Откройте редактор VBA (ALT + F11) и добавьте модуль.

Вставьте следующий код и сохраните книгу Excel как макроактивированную книгу (xlsm).

Function Regex(Cell)
    Dim RE As Object

    Set RE = CreateObject("vbscript.regexp")

    RE.Pattern = ".*(current and \(\d+\))"
    ' or if you want to match optional ()
    'RE.Pattern = ".*(current and \(?\d+\)?)"
    RE.Global = True
    RE.IgnoreCase = True
    Set Matches = RE.Execute(Cell)

    If Matches.Count <> 0 Then
        Regex = Matches.Item(0).submatches.Item(0)
    End If

End Function

Используйте его как формулу, например:

=Regex(A1)

Он вернет искомую часть current and [number]

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


Теперь я вижу логику.

Это вернетсявывод, как вы ожидаете.

Function Regex(Cell)
    Dim RE As Object

    Set RE = CreateObject("vbscript.regexp")

    RE.Pattern = ".*current and \((\d+)\)"
    ' or if you want to match optional ()
    'RE.Pattern = ".*current and \(?(\d+)\)?"
    RE.Global = True
    RE.IgnoreCase = True
    Set Matches = RE.Execute(Cell)

    If Matches.Count <> 0 Then
        Regex = "within " & Matches.Item(0).submatches.Item(0)*5 & " minutes"
    Else
        Regex = "False"
    End If

End Function

Он умножает захваченное число на 5, чтобы получить количество минут.
Если ничего не найдено, возвращается False.

VBAи регулярное выражение обычно означает, что код на листе легче поддерживать и легче отлаживать.


Чтобы заставить его реагировать на строку с current и (number), используйте этот код:

Function Regex(Cell)
    Dim RE As Object

    Set RE = CreateObject("vbscript.regexp")

    RE.Pattern = ".*current.*?\((\d+)\)"
    RE.Global = True
    RE.IgnoreCase = True
    Set Matches = RE.Execute(Cell)

    If Matches.Count <> 0 Then
        Regex = "within " & Matches.Item(0).submatches.Item(0)*5 & " minutes"
    Else
        Regex = "False"
    End If

End Function

Этот код будет выглядетьдля [anything] current [anything] ([number])

0 голосов
/ 03 января 2019

Если вы действительно не хотите следовать предложению @Andreas (это еще один способ сказать «почему я не подумал об этом»), попробуйте:

=IFERROR(IF(FIND("current",A3)>0,CONCATENATE("within ", CHOOSE(VALUE(MID(A3,FIND("(",A3)+1,1)),5,10,15,20,25,30), " minutes"),),FALSE)

Предостережение: оно игнорируетзакрывающая скобка, поэтому this cell contains current and (1 не вернет "FALSE"

...