如果数字落在给定范围内,则从复杂字符串中提取数字

car*_*oll 4 vba worksheet-function microsoft-excel microsoft-excel-2013

我需要一个 Excel 公式(或 VBA 宏),它可以让我从字符串中提取一个值。字符串是单个单元格中由空格分隔的单词序列。我想要这个词(代表自行车尺寸)是

  • 一个介于 47 和 60(或其他范围,可能会动态指定)之间的数字(大概是一个整数,但未指定),或
  • 字符串“sm”、“med”或“lg”之一。

我希望字符串中只有一个限定词,因此任何合理的错误处理响应

  • 没有限定词,或
  • 多个限定词

会被接受。大小可能位于字符串中的不同位置。例子:

Cervelo车队P2 105 5800 56 '15                        56是所希望的结果
Cervelo车队P2 105 54 6000 '15                        54是所希望的结果
Cervelo车队P3 105 5800 60 '15                        60是所希望的结果
Cervelo车队P2 105 5800 SM '15                        的字符串sm是所需的结果

我只对整个单词感兴趣,所以 58(“5800”的子字符串)不符合条件。

现在我正在剥离'15然后提取最后两位数字。但是这种方法只有在自行车尺寸是倒数第二个值时才有效。但是,如上所示,存在大小在字符串中的其他位置的情况。

如何使用 Excel 中的公式或 VBA 宏执行此操作?

jcb*_*rmu 5

我使用 VBA 做了一个解决方案:

Public Function BikeSize(MinSize As Integer, MaxSize As Integer, datainput As String)
    Dim dataoutput() As Variant
    ReDim dataoutput(0)
    BikeSize = 0
    datasplitted = Split(datainput, " ")
    arraysize = UBound(datasplitted)
    j = 1
    For i = 0 To arraysize
        m = datasplitted(i)
        If m >= MinSize And m <= MaxSize Then
            ReDim Preserve dataoutput(j)
            dataoutput(j) = m
            j = j + 1
        End If
        If m = "sm" Or m = "med" Or m = "lg" Then
            ReDim Preserve dataoutput(j)
            dataoutput(j) = m
            j = j + 1
        End If
    Next i
    totalresults = UBound(dataoutput)
    Select Case totalresults
        Case 0
            BikeSize = 0
        Case 1
            BikeSize = dataoutput(totalresults)
        Case Else
            For i = 1 To totalresults
                wrongresult = wrongresult & dataoutput(i) & " - "
            Next i
            BikeSize = wrongresult
    End Select
End Function
Run Code Online (Sandbox Code Playgroud)

您必须打开宏/Visual Basic 转到模块 _> 添加模块并将代码粘贴到右侧(另请参阅如何在 MS Office 中添加 VBA?)。

然后,如果您的字符串在单元格A1 上,您在C1 上的最小值,在D1上的最大值,然后在B1 上,您只需输入=BikeSize(C1,D1,A1)即可获得结果。

如果字符串没有匹配的数字,则输出零0

如果字符串有多个匹配数字,它将输出所有匹配的数字,以破折号分隔。

它还可以识别smmedlg