Excel 2007在文本字符串中查找最大数字

时间:2016-09-26 20:13:02

标签: excel excel-formula excel-2007

我有Excel 2007.我试图找到包含以下内容的单元格中的最大数字:

[[E:\ DATA \ SQL \ SY0 \,19198],[E:\,18872],[E:\ DATA \ SQL \ ST0 \,26211],[E:\ DATA \ SQL \ ST1 \ ,26211],[E:\ DATA \ SQL \ SD0 \,9861],[E:\ DATA \ SQL \ SD1 \,11220],[E:\ DATA \ SQL \ SL0 \,3377],[E:\ DATA \ SQL \ SL1 \,1707],[E:\ DATA \ SQL_Support \ SS0 \,14375],[E:\ DATA \ SQL_Support \ SS1 \,30711]]

我不是编码员,但我可以接受一些基本的指示。如果有一个公式可以做到这一点,太好了!如果最好的方法是使用某种后端代码,请告诉我。谢谢你的时间。

我确实有以下几乎让我在那里的公式:

=SUMPRODUCT(MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW(INDIRECT("1:"&LEN($A$2))),1))*ROW(INDIRECT("1:"&LEN($A$2))),0),ROW(INDIRECT("1:"&LEN($A$2))))+1,1)*10^ROW(INDIRECT("1:"&LEN($A$2)))/10)

对于包含上述字符串的单元格,它将起作用。但是,使用包含以下内容的字符串:

[[E:\ DATA \ SQL \ SY0 \,19198.934678],[E:\,18872.2567]]

我最终将19198934678的值作为最大值。

4 个答案:

答案 0 :(得分:1)

如果前后总是有空格,您可以使用此公式。该公式是一个数组公式,必须通过按住 ctrl + shift 确认,同时按输入

你的字符串在A1:

=MAX(IFERROR(--TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",99)),IF(seq=1,1,(seq-1)*99),99)),0))

seq是一个定义的名称,引用:

=ROW(INDEX(Sheet1!$1:$65536,1,1):INDEX(Sheet1!$1:$65536,255,1))

如果更喜欢VBA UDF,我建议如下。正则表达式将匹配任何可能是数字的东西。预计数字的格式为iiii.dddd。整数部分和小数点都是可选的。

Option Explicit
Function LargestNumberFromString(S As String) As Double
    Dim RE As Object, MC As Object, M As Object
    Dim D As Double
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = "\b[0-9]*\.?[0-9]+\b"
    If RE.test(S) = True Then
        For Each M In MC
            D = IIf(D > CDbl(M), D, CDbl(M))
        Next M
    End If
End With
End Function

答案 1 :(得分:1)

对于没有编程背景的人来说,这将是一个相当复杂的答案,所以如果你真的希望实现一个能够找到字符串中最大数字的函数,那么请准备好花大量时间来研究和讨论这个主题。 Excel中。

解决方案需要使用VBARegular expressions 当需要使用内置电子表格函数无法实现的更复杂功能时,在Excel中使用VBA。 正则表达式是一种用于告诉程序如何从文本中提取有用信息的语言,在这种情况下,我们可以提取文本中的所有数字。使用以下正则表达式。

(\ d +。?\ d *)/ G

大致意味着:将一个或多个数字与可选句点和后续可选数字匹配。 解释它的程序将执行以下操作:查找数字,如果您看到数字,那么这是一个匹配,抓取所有连续数字并将它们添加到匹配中。找到不是数字的字符后,开始寻找新的匹配项。如果在任何时候你找到一个点,将它添加到匹配,但只需一次,并继续寻找数字。冲洗并重复,直到文本结束。

你可以在这里测试一下。在这种情况下,正则表达式匹配19个数字。

http://www.regextester.com/

一旦你有一个包含19个匹配项的集合(参见正则表达式的链接),你需要做的就是遍历每个匹配项以找出哪个数字最高:

for each number in matches
    if number > highestNumber then
        highestNumber = number
    end if
next

而最高数字将是结果!为了让这个代码在一个简单的自定义函数中运行,你可以按照这个微软教程(https://support.office.com/en-us/article/Create-Custom-Functions-in-Excel-2007-2f06c10b-3622-40d6-a1b2-b6748ae8231f?ui=en-US&rs=en-US&ad=US&fromAR=1

答案 2 :(得分:1)

您可以使用此UDF:

Function MaxInString(rng As String) As Double
Dim splt() As String
Dim i&

splt = Split(rng)
For i = LBound(splt) To UBound(splt)
    If IsNumeric(splt(i)) Then
        If splt(i) > MaxInString Then
            MaxInString = splt(i)
        End If
    End If
Next i
End Function

将其放在工作簿附带的模块中。工作表或ThisWorkbook代码中的 NOT

然后你可以像任何其他公式一样调用它:

= MaxInString(A1)

enter image description here

答案 3 :(得分:0)

其中c是从

中找到最大值的字符串
Dim qwe() As String
qwe = Split(c, ", ")
maxed = 0
For x = LBound(qwe) To UBound(qwe)
    qwe(x) = Left(qwe(x), InStr(1, qwe(x), " ", vbBinaryCompare))
    On Error Resume Next
    If CLng(qwe(x)) > maxed Then maxed = CLng(qwe(x))
Next x
    MsgBox maxed

当qwe(x)无法转换为LONG数时,错误行会被忽略。

我必须说这是非常具体的字符串格式,对于更全面的doodad,您希望将拆分分隔符作为变量并且可能使用" IsNumeric"用于扫描整个字符串的功能。