Excel 2007 找出文本字符串中最大的数
Excel 2007 find the largest number in text string
我有 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))),1))*ROW(INDIRECT("1:"&LEN($A))),0),ROW(INDIRECT("1:"&LEN($A))))+1,1)*10^ROW(INDIRECT("1:"&LEN($A)))/10)
对于包含上述字符串的单元格,它将起作用。但是,使用包含以下内容的字符串:
[[ E:\DATA\SQL\SY0\ , 19198.934678 ],[ E:\ , 18872.2567 ]]
我最终会得到最大值 19198934678。
其中 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 数字时,可以忽略错误行。
我必须说这是非常特定于您的字符串格式的,对于更全面的装饰,您希望将分隔符作为变量并可能使用 "IsNumeric" 函数来扫描整个字符串。
如果前后总有一个space,可以用这个公式。该公式是一个数组公式,必须通过按住 ctrl + shift 的同时按 enter[ 来确认=14=]
A1 中的字符串:
=MAX(IFERROR(--TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",99)),IF(seq=1,1,(seq-1)*99),99)),0))
seq
是定义的名称,指的是:
=ROW(INDEX(Sheet1!:536,1,1):INDEX(Sheet1!:536,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
对于没有编程背景的人来说,这将是一个相当复杂的答案,所以如果您真的希望实现一个函数来找到excel.
中的字符串
解决方案,需要使用VBA and Regular expressions
当需要使用内置电子表格函数无法实现的更复杂功能时,VBA 用于 excel。
正则表达式是一种用于告诉程序如何从文本中提取有用信息的语言,在这种情况下我们可以提取文本中的所有数字。使用以下正则表达式。
(\d+.?\d*)/g
大致意思是:将一个或多个数字与一个可选的句点和随后的可选数字匹配。
将对此进行解释的程序将执行以下操作:查找数字,如果你看到一个,那么这是一个匹配项,获取所有连续的数字并将它们添加到匹配项中。一旦找到不是数字的字符,就开始寻找新的匹配项。如果您在任何时候找到一个点,请将其添加到匹配项中,但只需一次,然后继续寻找数字。冲洗并重复直到文本结束。
你可以在这里测试。在这种情况下,正则表达式匹配 19 个数字。
一旦你有了一个包含 19 个匹配项的集合(参见 link 正则表达式),你需要做的就是遍历每个匹配项以找出哪个数字是最高的:
for each number in matches
if number > highestNumber then
highestNumber = number
end if
next
highestNumber 将是结果!为了在简单的自定义函数中使用此代码 运行,您可以遵循此 Microsoft 教程 (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)
您可以使用这个 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
将其放入工作簿附带的模块中。 NOT 在工作表或 ThisWorkbook 代码中。
然后您可以像调用任何其他公式一样调用它:
=MaxInString(A1)
我有 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))),1))*ROW(INDIRECT("1:"&LEN($A))),0),ROW(INDIRECT("1:"&LEN($A))))+1,1)*10^ROW(INDIRECT("1:"&LEN($A)))/10)
对于包含上述字符串的单元格,它将起作用。但是,使用包含以下内容的字符串:
[[ E:\DATA\SQL\SY0\ , 19198.934678 ],[ E:\ , 18872.2567 ]]
我最终会得到最大值 19198934678。
其中 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 数字时,可以忽略错误行。
我必须说这是非常特定于您的字符串格式的,对于更全面的装饰,您希望将分隔符作为变量并可能使用 "IsNumeric" 函数来扫描整个字符串。
如果前后总有一个space,可以用这个公式。该公式是一个数组公式,必须通过按住 ctrl + shift 的同时按 enter[ 来确认=14=]
A1 中的字符串:
=MAX(IFERROR(--TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",99)),IF(seq=1,1,(seq-1)*99),99)),0))
seq
是定义的名称,指的是:
=ROW(INDEX(Sheet1!:536,1,1):INDEX(Sheet1!:536,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
对于没有编程背景的人来说,这将是一个相当复杂的答案,所以如果您真的希望实现一个函数来找到excel.
中的字符串解决方案,需要使用VBA and Regular expressions 当需要使用内置电子表格函数无法实现的更复杂功能时,VBA 用于 excel。 正则表达式是一种用于告诉程序如何从文本中提取有用信息的语言,在这种情况下我们可以提取文本中的所有数字。使用以下正则表达式。
(\d+.?\d*)/g
大致意思是:将一个或多个数字与一个可选的句点和随后的可选数字匹配。 将对此进行解释的程序将执行以下操作:查找数字,如果你看到一个,那么这是一个匹配项,获取所有连续的数字并将它们添加到匹配项中。一旦找到不是数字的字符,就开始寻找新的匹配项。如果您在任何时候找到一个点,请将其添加到匹配项中,但只需一次,然后继续寻找数字。冲洗并重复直到文本结束。
你可以在这里测试。在这种情况下,正则表达式匹配 19 个数字。
一旦你有了一个包含 19 个匹配项的集合(参见 link 正则表达式),你需要做的就是遍历每个匹配项以找出哪个数字是最高的:
for each number in matches
if number > highestNumber then
highestNumber = number
end if
next
highestNumber 将是结果!为了在简单的自定义函数中使用此代码 运行,您可以遵循此 Microsoft 教程 (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)
您可以使用这个 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
将其放入工作簿附带的模块中。 NOT 在工作表或 ThisWorkbook 代码中。
然后您可以像调用任何其他公式一样调用它:
=MaxInString(A1)