Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用Excel VBA从字符串中提取5位数字_String_Vba_Excel_Numbers - Fatal编程技术网

String 使用Excel VBA从字符串中提取5位数字

String 使用Excel VBA从字符串中提取5位数字,string,vba,excel,numbers,String,Vba,Excel,Numbers,作为非开发人员,我面临一个问题。我在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

作为非开发人员,我面临一个问题。我在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
我怎样才能将“Else”后面的部分变成一个循环,这样它就可以扫描字符串的每个空格,只提取包含5位数字的数字

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:

  • 38320
  • 83201

如果单词/数字之间总是有空格,那么就可以了

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
使用正则表达式

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

数据:



如果有多个匹配项,将返回一个逗号分隔的列表。

根据您尝试应用的解决方案(在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
的三个匹配项更改为公式中所需的数字计数。

Thx以获取答案。如果我想在一整列上使用宏,并在下一列上打印它,我应该怎么做?我发现它应该通过执行ValIn=Range(C2:C2000)来工作printing@Nad-不客气。关于列的使用,对于每个循环,通过列的每个单元格循环将是一个解决方案。那么
valIn
将是
单元格
单元格。Offset(0,1)
您可以参考下一列。我恐怕您在
单元格中找不到我了。Offset(0.1)
,请您具体一点:)@Nad-看看这里的答案-但是,您的Offset是
。Offset(0,1)
而不是这里提到的那个。我可以在那里找到它,仍然不容易被吸收,谢谢你的帮助。很抱歉耽搁了,我试过了,效果很好,如果我看的是小于5位数的,我甚至可以玩arround。救命,非常感谢!