从复杂字符串中提取数字(如果它在给定范围内)


4

我需要一个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宏执行此操作?


1
您怎么知道兴趣数是56,而不是58?如果在这种情况下该字符串包含多个匹配项,该怎么办?我能想到的每个解决方案都会匹配它找到的符合条件的第一个实例。另外,您在同一问题中建议两个范围。是否打算将范围输入为变量,以便可以在不更改任何地方的公式的情况下进行更改?
— fixer1234

谢谢你的帮助。每个记录只会有一个次数
— 卡罗尔

一个数字,范围在44-62之间。这些是自行车尺寸-因此,如果我可以定义此范围(44-62),则该公式将为每个记录在该范围内找到一个数字。感谢Carroll
— carroll

那你可以澄清你的例子吗?如上所述,58和56都符合您的标准。如果人们不完全了解需求,将很难提供有用的答案。
— fixer1234

1
“我……不确定自己做错了什么。”认真吗?由于您指定了多个值,因此我要求您澄清范围。您不仅在问题中留下了47-60和47-62,而且还在问题中添加了44-62(您之前在评论中提到过)。(此外,您今天在评论中输入的示例输入(和相应的期望结果)应该已经编辑到问题中,并且您编辑到问题中的注释也已经编辑(“我不确定下一步该怎么做。我也。不知道我做错了什么”)应该已经张贴在评论(或者根本没有)......(续)。
— 斯科特

Answers:


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

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

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

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

如果字符串具有多个匹配号,则输出所有匹配项,并用破折号分隔。

它还可以识别sm,med和lg。


感谢您的帮助-我会尝试的,让您知道,Carroll
— carroll 2015年

jcbermu-您的VBA解决方案效果很好。很抱歉耽误您的回复。我确实有几个问题,但是来自fixer1234的消息称该帖子已关闭。我是新来的,不确定此职位的状态
— carroll 2015年

@carroll很棒!!!你想知道什么?
— jcbermu

jcbermu,非常感谢您的解决方案。问题1)在您指定范围44-62的位置,我可以在相邻的两列中引用单元格吗,以便在将“ bikesize” VBA复制到电子表格的下方时,可以碰到范围的低点和高点。2)我是否也可以在同一VBA程序中提取sm,med,lg。有时,自行车的尺寸是用sm,med,lg而不是54或58或48等表示的。。。显然,我对VBA编程知之甚少,但是感谢您,我了解到您的帮助非常感谢,解释如何插入VBA程序确实很有帮助-我在哪里对您的解决方案进行评分?
— 卡罗尔2015年

1
@carroll:您可以通过“接受”(单击左侧的复选标记)和/或投票(单击指向上方的箭头)来表达对答谢的赞赏/赞同。注意:只有问题的作者才能接受答案,每个问题只能接受一个答案。声誉超过15的任何人都可以投票支持任何数量的帖子。有关更多信息,请参见帮助中心。
— 斯科特,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.