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


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

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

它还可以识别smmedlg


感谢您的帮助-我会尝试的,让您知道,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.