将数字串拆分为单个单元格,包括括号/括号内的数字

时间:2015-09-17 18:40:36

标签: regex string excel excel-vba excel-formula vba

我有一个列,其中每个单元格都有一串数字,?, - 和括号/括号/大括号中的数字。一个很好的例子如下:

3????0{1012}?121-2[101]--01221111(01)1

如何通过字符将字符串分隔成不同的单元格,其中“字符”在这种情况下是指任何数字,?, - 和括号/括号/花括号内的值(包括所述括号/括号/卷曲)括号)?

实质上,上面的字符串会变成以下字符串(间隔开以表示单独的单元格):

3 ? ? ? ? 0 {1012} ? 1 2 1 - 2 [101] - - 0 1 2 2 1 1 1 1 (01) 1

括号/括号/花括号内的数字量有所不同。任何字符串都没有字母。

3 个答案:

答案 0 :(得分:1)

你在这里!

RegEx方法:

Integer

循环方法:

Sub Test_RegEx()
    Dim s, col, m
    s = "3????0{1012}?121-2[101]--01221111(01)1"
    Set col = CreateObject("Scripting.Dictionary")
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "(?:\d|-|\?|\(\d+\)|\[\d+\]|\{\d+\})"
        For Each m In .Execute(s)
            col(col.Count) = m
        Next
    End With
    MsgBox Join(col.items) ' 3 ? ? ? ? 0 {1012} ? 1 2 1 - 2 [101] - - 0 1 2 2 1 1 1 1 (01) 1
End Sub

答案 1 :(得分:1)

要看的其他内容:)

Sub test()

    'String to parse through
    Dim aStr As String
    'final string to print
    Dim finalString As String

    aStr = "3????0{1012}?121-2[101]--01221111(01)1"

    'Loop through string
    For i = 1 To Len(aStr)
        'The character to look at
        char = Mid(aStr, i, 1)
        'Check if the character is an opening brace, curly brace, or parenthesis
        Dim result As String
        Select Case char

            Case "["
                result = loop_until_end(Mid(aStr, i + 1), "]")
                i = i + Len(result)
                result = char & result

            Case "("
                result = loop_until_end(Mid(aStr, i + 1), ")")
                i = i + Len(result)
                result = char & result

            Case "{"
                result = loop_until_end(Mid(aStr, i + 1), "}")
                i = i + Len(result)
                result = char & result

            Case Else
                result = Mid(aStr, i, 1)

        End Select
        finalString = finalString & result & " "
    Next
    Debug.Print (finalString)
End Sub
'Loops through and concatenate to a final string until the end_char is found
'Returns a substring starting from the character after
Function loop_until_end(aStr, end_char)
    idx = 1
    If (Len(aStr) <= 1) Then
        loop_until_end = aStr
    Else
        char = Mid(aStr, idx, 1)
        Do Until (char = end_char)
            idx = idx + 1
            char = Mid(aStr, idx, 1)
        Loop
    End If
    loop_until_end = Mid(aStr, 1, idx)
End Function

答案 2 :(得分:0)

假设数据在第1行开始的A列中,并且您希望结果从B列开始,并且对于A列中的每一行数据都是正确的,这里是仅使用工作表公式的替代方法。

在单元格B1中使用以下公式:

=IF(OR(LEFT(A1,1)={"(","[","{"}),LEFT(A1,MIN(FIND({")","]","}"},A1&")]}"))),IFERROR(--LEFT(A1,1),LEFT(A1,1)))

在单元格C1中使用以下公式:

=IF(OR(MID($A1,SUMPRODUCT(LEN($B1:B1))+1,1)={"(","[","{"}),MID($A1,SUMPRODUCT(LEN($B1:B1))+1,MIN(FIND({")","]","}"},$A1&")]}",SUMPRODUCT(LEN($B1:B1))+1))-SUMPRODUCT(LEN($B1:B1))),IFERROR(--MID($A1,SUMPRODUCT(LEN($B1:B1))+1,1),MID($A1,SUMPRODUCT(LEN($B1:B1))+1,1)))

复制C1公式直到它开始给你空白(没有剩余的项目从A单元格中的字符串中分离出来)。在您的示例中,需要将其复制到AA列。然后,您可以将公式复制到其余的A列数据中。