Извлечение минимального числового значения из нескольких определенных значений в ячейке - PullRequest
0 голосов
/ 26 января 2019

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

K3 = US 35516109 A 20090116, US 35142006 A 20060210, US 1154108 P 20080117

Есть ли способ извлечьсамое низкое значение из всех числовых значений, которые находятся справа от каждого экземпляра текста A и текста P?

. В приведенном выше примере 20060210 следует извлечь, поскольку это самое низкое значение 20090116 (котороенаходится справа от A), 20060210 (справа от A) и 20080117 (справа от P).

Ответы [ 2 ]

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

Double Split 2.0

Эта функция игнорирует A или P , она просто извлекает минимум значений последней строки в каждой (запятой) строке.

Код

Function MinDate(CellRange As Range) As Long

    Const strDel1 As String = ","   ' 1st Split Delimiter
    Const strDel2 As String = " "   ' 2nd Split Delimiter

    Dim vntS1 As Variant  ' 1st Split Array
    Dim vntS2 As Variant  ' 2nd Split Array
    Dim vntT As Variant   ' Target Array
    Dim i As Long         ' Array Row Counter

    On Error GoTo ProcedureExit

    ' Split the cell value by 1st Split Delimiter into 1st Split Array.
    vntS1 = Split(CellRange, strDel1)
    ' Resize Target Array to size of 1st Split Array.
    ReDim vntT(UBound(vntS1))
    ' Loop through elements of 1st Split Array.
    For i = 0 To UBound(vntS1)
        ' Split 1st Split Array by 2nd Split Delimiter into 2nd Split Array.
        vntS2 = Split(vntS1(i), strDel2)
        ' Add the last element of 2nd Split Array to Target Array.
        vntT(i) = Val(vntS2(UBound(vntS2)))
    Next

    ' Check for the minimum.
    MinDate = vntT(0)
    For i = 1 To UBound(vntT)
        If vntT(i) < vntT(i - 1) Then
            MinDate = vntT(i)
        End If
    Next

ProcedureExit:

End Function

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

=MinDate(K3)
0 голосов
/ 26 января 2019

Попробуйте простую функцию регулярного выражения.

Option Explicit

Function lowestNumber(str As String) As Variant
    Dim n As Long, nums() As Variant
    Static rgx As Object, cmat As Object

    Set rgx = CreateObject("VBScript.RegExp")
    lowestNumber = CVErr(xlErrNA)

    With rgx
        .Global = True
        .MultiLine = True
        .Pattern = "[AP] [0-9]{8}"
        If .Test(str) Then
            lowestNumber = 1E+99
            Set cmat = .Execute(str)
            For n = 0 To cmat.Count - 1
                lowestNumber = Application.Min(lowestNumber, Val(Mid(cmat.Item(n), 3)))
            Next n
        End If
    End With

End Function

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

enter image description here

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