Excel如何从字符串中分别提取前两段连续数字?

Excel如何用公式从字符串中,分别提取前两段连续数字,到两个单元格内?
因工作需要,求各位大神帮忙写出公式
注意:
①A1值为数字、字符、标点随机组合,也极有可能为中文标点;【如下图A1】
②除数字以外字符有可能为其它任何字符(如:e / *),且这些字符不能影响结果的正确输出;【如下图A2】
③第一段连续数字前可能没有任何其它字符,第二段连续数字后也可能没有任何其它字符;(但是两段连续数字中间一定有除数字外的任意字符)【如下图A3】
④公式可以兼容Excel03版及以上且WPS2009及以上。
例如下图:A列为数据源,B列公式输出第一段连续数字,C列公式输出第二段连续数字

如有能正确输出上图三例的网友请赐教

没想到更好的办法,加了BDE三个辅助列才得出结果。

B1=REPLACE(A1,1,MIN(IF(ISNUMBER(FIND({0,1,2,3,4,5,6,7,8,9},A1)),FIND({0,1,2,3,4,5,6,7,8,9},A1),2^8))-1,"")

C1=LEFT(B1,MIN(IF(ISNUMBER(--MID(B1,ROW(1:50),1)),256,ROW(1:50)))-1)

D1=SUBSTITUTE(B1,C1,"",1)

三个公式中C1是数组公式,公式输完后,光标放在公式编辑栏同时按下CTRL+SHIFT+回车键,使数组公式生效。

三个公式向下复制

绿色区域复制到黄色区域。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-01-31
您好,用以下代码可全部满足你的要求,不用理会乱码

Public Function nStr1(Ovalue As String)
Dim t1, t2, t3, t4 As Single
t1 = 0 ‘¶ã¹ýµÚÒ»¶Î×Öĸ
t3 = 1 ‘Ê׶ÎÊý×ÖºóµÄÊ××ÖĸλÖÃ
t4 = 0 ‘ÅжÏÊÇ·ñÈ«Êý×Öt
t2 = 0 ‘ÅжÏÊÇ·ñÈ«ÆäËü×Ö·û
For m = 1 To Len(Ovalue)
If (Asc(Mid(Ovalue, m, 1)) > 47) And (Asc(Mid(Ovalue, m, 1)) < 59) Then ‘ÊÇ·ñΪÊý×Ö£¿
t5 = t5 + 1
End If
If (Asc(Mid(Ovalue, m, 1)) < 48) Or (Asc(Mid(Ovalue, m, 1)) > 58) Then ‘ÊÇ·ñΪ×Öĸ£¿
t6 = t6 + 1
End If
Next

For i = 1 To Len(Ovalue)
If Asc(Mid(Ovalue, i, 1)) > 47 And Asc(Mid(Ovalue, i, 1)) < 59 Then ‘ÊÇ·ñΪÊý×Ö£¿
t1 = 1
End If
If (t1 = 0 And Asc(Mid(Ovalue, i, 1)) < 48) Or (t1 = 1 And Asc(Mid(Ovalue, i, 1)) > 58) Then ‘ÊÇ·ñΪ×Öĸ£¿
t3 = i
Exit For
End If
Next
Dim my_String As String
my_String = ""
If (t5 <> Len(Ovalue)) Then
If (t6 <> Len(Ovalue)) Then
For j = 1 To t3
If Asc(Mid(Ovalue, j, 1)) > 47 And Asc(Mid(Ovalue, j, 1)) < 59 Then
my_String = my_String & Mid(Ovalue, j, 1)
End If
Next
End If
Else
my_String = (Ovalue)
End If
nStr1 = my_String
End Function
Public Function nStr2(Ovalue As String)
Dim t1, t2, t3, t4, t5, t6 As Single
t1 = 0 ‘¶ã¹ýµÚÒ»¶Î×Öĸ
t2 = 1
t3 = 1 ‘Ê׶ÎÊý×ÖºóµÄÊ××ÖĸλÖÃ
t4 = Len(Ovalue) ‘¶þ¶ÎÊý×ÖºóÊ××ÖĸλÖõÄ
t5 = 0 ‘ÅжÏÊÇ·ñÈ«Êý×Ö
t6 = 0 ‘ÅжÏÊÇ·ñÈ«ÆäËü×Ö·û
For m = 1 To Len(Ovalue)
If (Asc(Mid(Ovalue, m, 1)) > 47) And (Asc(Mid(Ovalue, m, 1)) < 59) Then ‘ÊÇ·ñΪÊý×Ö£¿
t5 = t5 + 1
End If
If (Asc(Mid(Ovalue, m, 1)) < 48) Or (Asc(Mid(Ovalue, m, 1)) > 58) Then ‘ÊÇ·ñΪ×Öĸ£¿
t6 = t6 + 1
End If
Next
For i = 1 To Len(Ovalue)
If Asc(Mid(Ovalue, i, 1)) > 47 And Asc(Mid(Ovalue, i, 1)) < 59 Then ‘ÊÇ·ñΪÊý×Ö£¿
t1 = 1
End If

If (t1 = 0 And Asc(Mid(Ovalue, i, 1)) < 48) Or (t1 = 1 And Asc(Mid(Ovalue, i, 1)) > 58) Then ‘ÊÇ·ñΪ×Öĸ£¿
t2 = i
Exit For
End If
Next

For j = t2 To Len(Ovalue)
If (Asc(Mid(Ovalue, j, 1)) > 47) And (Asc(Mid(Ovalue, j, 1)) < 59) Then ‘ÊÇ·ñΪÊý×Ö£¿
t3 = j
Exit For
End If
Next
For k = t3 To Len(Ovalue)
If (Asc(Mid(Ovalue, k, 1)) < 48) Or (Asc(Mid(Ovalue, k, 1)) > 58) Then ‘ÊÇ·ñΪ×Öĸ£¿
t4 = k
Exit For
End If
Next
Dim my_String As String
my_String = ""
If (t5 <> Len(Ovalue)) Then
If (t6 <> Len(Ovalue)) Then
For l = t3 To t4
If Asc(Mid(Ovalue, l, 1)) > 47 And Asc(Mid(Ovalue, l, 1)) < 59 Then
my_String = my_String & Mid(Ovalue, l, 1)
End If
Next
End If
End If
nStr2 = my_String
End Function
第2个回答  2020-10-03
=-lookup(1,-mid($a1,small(if(mmult(1*iserr(-mid($a1,row($1:$90)+{0,1},1)),{1;-1})=1,row($2:$91)),column(a1)),column($a:$o))),,右拉
或者
=lookup(9e+307,--mid(a1,small(if(iserror(-mid(a1,row(indirect("1:"&len(a1)))-2,3))*iserror(-mid(a1,row(indirect("1:"&len(a1)))-1,2))*mmult(n(isnumber(-mid(a1,row(indirect("1:"&len(a1))),{1,2,3}))),{1;1;1}),row(indirect("1:"&len(a1)))),2),row(indirect("1:"&len(a1)))))
第3个回答  2019-10-09
B1=-LOOKUP(1,-MID($A1,SMALL(IF(MMULT(1*ISERR(-MID($A1,ROW($1:$90)+{0,1},1)),{1;-1})=1,ROW($2:$91)),COLUMN(A1)),COLUMN($A:$O)))
数组公式,输入完公式后按ctrl+shift+回车结束,直接右拉
第4个回答  2015-01-24
需要定义个名称,把问题作为内容(邮件主题一定要包含“excel”,本人以此为依据辨别非垃圾邮件,以免误删)、excel样表文件(把现状和目标效果表示出来)作为附件发来看下 [email protected]
相似回答