我有一个包含文本字符串单元格的列,其中包含文本和数字。我发现了一个很好的公式,可以找到字符串中的第一个数字并将其提取到相应的单元格,例如
文字字符串:“9,999.99英镑的初始佣金,然后从99年开始续订佣金9.9英镑”
在单元格旁边输入此公式result = ((1,2), (3,4), (5,6))
a, b = result[:2]
# a == (1,2)
# b == (3,4)
将提取第一个数字9,999.99。
这不是我的公式,而是我发现和喜爱的公式,但我希望能够表明我还想提取第二个出现的数字以及第三个出现的数字。基本上是字符串中的所有数字,分成单独的单元格。
您是否有聪明的人能够建议对公式进行编辑以允许此操作?
提前致谢。
答案 0 :(得分:0)
好吧,我设法用一个疯狂的长公式彻底解决它。 它不是最漂亮的公式,但它确实起作用。
感谢您的建议,这些建议引导我走下思路,以获得答案。这是我的公式。
文本字符串位于名为'事件标签'公式参考[@ [事件标签]]。
所以对于第一个数字,我使用这个公式:
=SUBSTITUTE(LEFT([@[Event Label]],FIND("Â",[@[Event Label]],FIND("Â",[@[Event Label]])+1)),LEFT([@[Event Label]],FIND("Â",[@[Event Label]],FIND("Â",[@[Event Label]])+1)),LOOKUP(99^99,--("0"&MID(LEFT([@[Event Label]],FIND("Â",[@[Event Label]],FIND("Â",[@[Event Label]])+1)),MIN(SEARCH({0,1,2,3,4,5,6,7,8,9},LEFT([@[Event Label]],FIND("Â",[@[Event Label]],FIND("Â",[@[Event Label]])+1))&"0123456789")),ROW($1:$10000)))))
对于第二个数字,我使用这个公式:
=SUBSTITUTE(RIGHT([@[Event Label]],FIND("Â",[@[Event Label]],FIND("Â",[@[Event Label]]))),RIGHT([@[Event Label]],FIND("Â",[@[Event Label]],FIND("Â",[@[Event Label]]))),LOOKUP(99^99,--("0"&MID(RIGHT([@[Event Label]],FIND("Â",[@[Event Label]],FIND("Â",[@[Event Label]]))),MIN(SEARCH({0,1,2,3,4,5,6,7,8,9},RIGHT([@[Event Label]],FIND("Â",[@[Event Label]],FIND("Â",[@[Event Label]])))&"0123456789")),ROW($1:$10000)))))
对于最后的第3个数字,我使用这个公式:
=SUBSTITUTE(RIGHT([@[Event Label]],LEN([@[Event Label]])-FIND("month",[@[Event Label]])+1),RIGHT([@[Event Label]],LEN([@[Event Label]])-FIND("month",[@[Event Label]])+1),LOOKUP(99^99,--("0"&MID(RIGHT([@[Event Label]],LEN([@[Event Label]])-FIND("month",[@[Event Label]])+1),MIN(SEARCH({0,1,2,3,4,5,6,7,8,9},RIGHT([@[Event Label]],LEN([@[Event Label]])-FIND("month",[@[Event Label]])+1)&"0123456789")),ROW($1:$10000)))))
这对我有用,因为我已经定义了文本字符串,它们总是在文本字符串中的相同位置。
我确信可能有更好的方法,但现在可以做到。
答案 1 :(得分:0)
所以这是建议的功能 - 它使用简单的2状态方法。一般解决方案的问题是使用逗号作为千位分隔符和问题中的部分文本。因此999,999可以是单个数字或两个单独的数字。此外,99,99,99虽然不是有效数字,但从ISNUMERIC返回TRUE,从VAL返回99。您可以尝试找到尽可能长的数字,但如果遇到像99,999,99这样的字符串,则必须回溯并且简单的2状态模型不起作用。
所以我认为这种简单级别的唯一实用解决方案是使用参数调用函数,该参数告诉它(a)将逗号视为千位分隔符(并且基本上忽略它)或(b) )将其视为分隔符,因此每当遇到逗号时停止向数字添加字符。
如果需要,能够处理初始减号应该很容易,但目前的版本还没有。
Function GetNthNumber(s As String, n As Integer, Optional CommaAsThousands As Boolean = True) As Variant
Dim c, testNumber, number As String
' Ignore commas if treated as thousands separator
If CommaAsThousands Then s = Replace(s, ",", "")
s = s & "x"
Dim i, j, count As Integer
Dim inNumber As Boolean
inNumber = False
' Loop through each character of string
For i = 1 To Len(s)
c = Mid(s, i, 1)
' Part of a number - append new character or finish number
If inNumber Then
If IsNumeric(number & c) And (CommaAsThousands Or c <> ",") Then
number = number & c
Else
inNumber = False
If count = n Then Exit For
End If
Else
' Not part of a number - start new number or do nothing
If IsNumeric(c) Then
inNumber = True
number = c
count = count + 1
End If
End If
Next i
'Return nth number or #Value error
If count = n Then
GetNthNumber = Val(number)
Else
GetNthNumber = CVErr(xlErrValue)
End If
End Function
以下两种不同的方式调用结果(第一行用逗号作为千位分隔符,第二行用逗号作为分隔符): -