作为非开发人员,我面临一个问题。我在Excel中有一个列,其中包含如下信息:
46843 xxxx xxx x
xxxx 65483 xxxx
xxxx xxx 65432 xxxxx 4 xx
“ x”是正常角色。
我想要的是只能提取五位数的数字。 我开始了类似的事情,但是努力使循环循环,以便它扫描所有字符串:
Function test()
val_in = "rue 4 qsdqsd CURIE 38320 EYBENS"
Filte = Left(val_in, 5)
If IsNumeric(Filte) Then
test = Left(val_in, 5)
Else
sp1 = InStr(1, val_in, " ")
sp2 = InStr(sp1 + 1, val_in, " ")
spt = sp2 + sp1
If spt > 5 Then
extr = Mid(val_in, spt, 5)
End If
End If
End Function
如何将“其他”之后的部分变成循环,以便它扫描字符串的每个空格并仅提取包含5位数字的数字?
答案 0 :(得分:2)
使用正则表达式
Option Explicit
Public Function GetNumbers(ByVal rng As Range) As Variant
Dim arr() As String, i As Long, matches As Object, re As Object
Set re = CreateObject("VBScript.RegExp")
With re
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "\b\d{5}\b"
If .test(rng.Value) Then
Set matches = .Execute(rng.Value)
ReDim arr(0 To matches.Count - 1)
For i = LBound(arr) To UBound(arr)
arr(i) = matches(i)
Next i
Else
arr(i) = rng.Value
End If
End With
GetNumbers = Join(arr, ",")
End Function
数据:
如果有多个匹配项,则返回逗号分隔的列表。
答案 1 :(得分:1)
Sub TestMe()
Dim valIn As String
valIn = "rue 4 qsdqsd CURIE 38320 EYBENS 43443"
Dim i As Long
Dim splitted As Variant
splitted = Split(valIn)
For i = LBound(splitted) To UBound(splitted)
If IsNumeric(splitted(i)) And Len(splitted(i)) = 5 Then
Debug.Print splitted(i)
End If
Next i
End Sub
考虑到在您的示例中,您的意思是5位数字按空格分隔,因此上述方法有效。它将字符串按空间分割成一个数组,并遍历该数组的各个元素。如果该元素包含5个字符并且为数字,则将其打印出来。
如果空格规则不是人们可以依靠的规则,则可以采用另一种实现方式:
Sub TestMe()
Dim valIn As String
valIn = "44244rue4qsdqsdCURIE383201EYBENS43443"
Dim i As Long
For i = 1 To Len(valIn) - 4
If IsNumeric(Mid(valIn, i, 5)) Then
Debug.Print Mid(valIn, i, 5)
End If
Next i
End Sub
它开始遍历字符串,检查每个5个字符是否为数字。当您使用数字6个字符时,它给出两个结果-1到5和2到6。因此383201被“翻译”为以下2:
答案 2 :(得分:0)
如果单词/数字之间始终有空格,那么应该这样做
Sub test()
Dim TestStr As String
Dim Temp As Variant
Dim i As Long, FoundVal As Long
TestStr = "rue 4 qsdqsd CURIE 38320 EYBENS"
Temp = Split(TestStr, " ")
For i = 0 To UBound(Temp)
If Len(Trim(Temp(i))) = 5 And IsNumeric(Temp(i)) Then
FoundVal = Temp(i)
MsgBox FoundVal
End If
Next i
End Sub
答案 3 :(得分:0)
通过您尝试应用的解决方案(在VBA中创建自定义函数),我了解您实际上需要在公式中使用它。
要从单元格A1中查找具有五位数的数字,您可以使用不带VBA的以下公式:
=IF(ISERROR(FIND("0"&REPT("1",5)&"0",CONCAT(0+(ISNUMBER(-MID(" "&A1&" ",ROW(INDIRECT("1:"&LEN(A1)+2)),1))+0)))),"",MID(A1,FIND("0"&REPT("1",5)&"0",CONCAT(0+(ISNUMBER(-MID(" "&A1&" ",ROW(INDIRECT("1:"&LEN(A1)+2)),1))+0))),5))
要搜索其他数字,请将出现的三个5
更改为公式中所需的数字。