Извлечь первое число с плавающей запятой справа в строке Excel - PullRequest
1 голос
/ 18 июня 2020

У меня есть столбец Excel, полный строк, из которых я пытаюсь извлечь одно число.

Вот пример конкретной строки (все строки соответствуют этому формату):

5) something here 93 4. something else- here too(24+Mths) Y Y 249 5) 24+ Months 1) lots more rubbish text Y N some more rubbish text 24/04/2012 25/04/1999 0.263 10 L rubbish text 3521.37233 4130 rubbish text1041023.

Мне просто нужно извлечь первое десятичное число справа , в данном случае 3521.37233 .

ОБНОВЛЕНИЕ: я пробовал использовать текст в столбцы с пробелом в качестве разделителя, но между символами есть разное количество пробелов. Есть ли способ разграничить любым количеством пробелов?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Для всех, кто интересуется нативным решением функции Excel, если у вас есть функция FILTERXML, вы можете использовать:

=FILTERXML("<t><s>" & SUBSTITUTE(A1," ","</s><s>")& "</s></t>","//s[number(.) = number(.) and contains(.,'.')][last()]")

xPath ищет все узлы, которые являются числовыми c, и также содержат dot, а затем возвращает последний узел, который соответствует этим спецификациям.

Примечание: Если в ваших региональных настройках Windows используется dot как разделитель тысяч, это не будет работать так, как написано. Вам нужно будет заменить . десятичным разделителем вашей системы.

1 голос
/ 18 июня 2020

Это вопрос, который может быть быстро решен с помощью Regex. К сожалению, Excel не поддерживает регулярное выражение с использованием формулы Excel.

Вы можете использовать следующую UDF (добавьте ее в свою книгу).

Использование:

  • , если вам нужно последнее десятичное число (например, первое справа): =StrRegex([cell reference],"[0-9]{1,}\.[0-9]{1,}",-1)
  • , если вы хотите все десятичные числа: =StrRegex([cell reference],"[0-9]{1,}\.[0-9]{1,}",0)
Function StrRegex(findIn As String, pattern As String, Optional matchID As Long = 1, Optional separator As String = ",", Optional ignoreCase As Boolean = False) As String  ' matchID - 1-based, matchID=0 => return all

    Application.Volatile (True)

    Dim result As String
    Dim allMatches As Object
    Dim re As Object
    Set re = CreateObject("vbscript.regexp")
    Dim mc As Long
    Dim i As Long
    Dim j As Long

    re.pattern = pattern
    re.Global = True
    re.ignoreCase = ignoreCase
    Set allMatches = re.Execute(findIn)

    mc = allMatches.count
    If mc > 0 Then
        If matchID > mc Then
            result = CVErr(xlErrNA)
        Else
            If matchID > 0 Then
                result = allMatches.Item(matchID - 1).Value
            ElseIf matchID < 0 Then
                result = allMatches.Item(mc + matchID).Value
            Else
                result = ""
                For i = 0 To allMatches.count - 1
                    result = result & separator & allMatches.Item(i).Value
                    For j = 0 To allMatches.Item(i).submatches.count - 1
                        result = result & separator & allMatches.Item(i).submatches.Item(j)
                    Next
                Next

                If Len(result) <> 0 Then
                    result = Right(result, Len(result) - Len(separator))
                End If
            End If
        End If
    Else
        result = ""
    End If

    StrRegex = result

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