2

我确实没有经验,我依赖于古老的 Java 知识

我有以下格式的数据,我想提取 001-222-170 组件(从第 1 行等)

TEXT,TEXT,TEXT,001-222-170,TEXT    
LINER,612-942-001,TEXT    
TEXT,TEXT17,612-551-001,TEXT   
SHOE,435-687-204,TEXT    
TEXT,ASSY,O.B,632-005-202,TEXT    
TEXT,TEXT,I.B,632-012-202,TEXT

经过广泛的研究,我知道你必须建立一个.pattern认可。我最接近的东西是

Sub RegEx()
    Dim RegEx As Object
    Dim strTest As String
    Dim valid As Boolean
    Dim Matches As Object
    Dim i As Integer

    Set RegEx = CreateObject("VBScript.RegExp")
    'What I happen to be looking for    
    RegEx.Pattern = "MT\d{6}V\d"

    For i = 2 To 115
        Range("B" & i).Activate
        strTest = ActiveCell.Text
        valid = RegEx.test(strTest)
        If valid = True Then
            Set Matches = RegEx.Execute(strTest)
            Range("C" & i).Value = CStr(Matches(0))
        Else
            Range("C" & i).Value = "#N/A#"
        End If
    Next

    Set RegEx = Nothing
End Sub

但它仍然不能解决问题,而且我知道有一种更短的方法可以做到这一点。我只是不知道如何格式化模式线。像 ("(\d)"-"(\d)"-"(\d)")什么?

4

5 回答 5

2
RegEx.Pattern = "\d{3}\-\d{3}\-\d{3}"
于 2012-06-22T15:10:35.280 回答
1

下面的代码一次性将 RegExp UDF 转储到 C2:C115(无循环)以分别在 B2:b115 上运行

您的正则表达式可以缩短为 (\d{3}\-){2}\d{3}"

Sub DumpReg()
    Range("C2:115").FormulaR1C1 = "=EXTRACT1(RC[-1])"
End Sub

Function Extract1(strIn As String) As String
    Dim objRegex As Object
    Dim objRegMC As Object
    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
        .Pattern = "(\d{3}\-){2}\d{3}"
        If .test(strIn) Then
            Set objRegMC = .Execute(strIn)
            Extract1 = objRegMC(0)
        Else
            Extract1 = "#N/A#"
        End If
    End With
End Function
于 2012-06-23T02:46:48.350 回答
0

如果数据始终是您需要的 XXX-XXX-XXX 格式,您可以在没有 VBA 或 RegEx 的情况下在电子表格上执行此操作。

例子

更新 VBA 解决方案

这也是一个更简单的 VBA 解决方案,没有 RegExp。

注意 - 此解决方案假定单元格文本模式中不会有任何其他“-”实例,除了 XXX-XX-XXX 模式。

Sub dude()

Dim strTest As String

For i = 2 To 115

    strTest = Range("A" & i).Text

    If InStr(1, strText, "-") > 0 Then
        Range("C" & i) = Mid(strTest, InStr(1, strText, "-") - 3, 11)
    Else
        Range("C" & i) = "#N/A#"
    End If

Next

End Sub
于 2012-06-22T14:58:13.733 回答
0

您可以使用的模式是:\d+-\d+-\d+ . \d+仅表示一位或多位小数。子可以写成:

Sub RegEx()
    Dim RegEx As Object
    Dim strTest As String
    Dim valid As Boolean
    Dim Matches As Object
    Dim i As Integer

    Set RegEx = CreateObject("VBScript.RegExp")

    RegEx.Pattern = "\d+-\d+-\d+"

    For i = 2 To 115
        strTest = Range("B" & i).Text
        Set Matches = RegEx.Execute(strTest)
        If Matches.Count > 0 Then
            Cells(i, "C").Value = CStr(Matches(0))
        Else
            Cells(i, "C").Value = "#N/A#"
        End If
    Next

    Set RegEx = Nothing
End Sub
于 2012-06-22T14:58:56.033 回答
0

如果您的格式是相同的并且您想要一个 VBA 解决方案,那么 Regex 对于这种事情来说是一种过度杀伤力。这是一个简单的使用方法SPLIT()

Sub Sample()
    Dim MyAr() As String, strSample As String

    strSample = "TEXT,TEXT,TEXT,001-222-170,TEXT"
    'strSample = "LINER,612-942-001,TEXT"

    MyAr = Split(strSample, ",")

    Debug.Print MyAr(UBound(MyAr) - 1)
End Sub
于 2012-06-22T17:44:06.560 回答