使用VBA解析和拆分带有通配符的字符串?

时间:2016-05-06 14:13:27

标签: regex excel vba excel-vba udf

我有一张包含字母数字字符的项目编号的表格,以及该行中的一堆其他信息。有时,类似的项目组合成一行,项目编号的差异将显示为(X / Y),以选择在项目编号中的该点使用哪个字符(不只是X或Y,可以是任何字母数字字符)。换句话说,这些条目将如下所示:

AB(X / Y)CD123

我需要的是将其分成两个项目编号ABXCD123和ABYCD123的方法。之后,我必须在当前行之下创建一行,并使用更改的项目编号将当前行复制到其中,但该部分很容易。我曾尝试使用InStr来标记(X / Y),但我不知道如何拉出X和Y字符来制作新的字符串。我也不知道通配符是否适用于InStr,而且我对RegEx不太熟悉。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

以下是对UDF²中正则表达式的一点介绍。

Function partNums(str As String, _
                  Optional num As Integer = 1)
    Dim tmp As String
    Static rgx As Object

    'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF
    If rgx Is Nothing Then
        Set rgx = CreateObject("VBScript.RegExp")
    End If
    partNums = vbNullString

    With rgx
        .Global = True
        .IgnoreCase = True
        .MultiLine = False
        .Pattern = "\([A-Z]{1}/[A-Z]{1}\)"
        If .Test(str) Then
            tmp = .Execute(str)(0)
            Select Case num
                Case 2
                    tmp = Mid(tmp, 4, 1)
                Case Else
                    tmp = Mid(tmp, 2, 1)
            End Select
            partNums = .Replace(str, tmp)
        End If
    End With
End Function

在B2:B3中,

=partNums(A2)
=partNums(A3,2)

partnums

这是一个基本上重复的UDF,处理1到3个字符。

Function partNums(str As String, _
                  Optional num As Integer = 1)
    Dim tmp As String
    Static rgx As Object

    'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF
    If rgx Is Nothing Then
        Set rgx = CreateObject("VBScript.RegExp")
    End If
    partNums = vbNullString

    With rgx
        .Global = True
        .IgnoreCase = True
        .MultiLine = False
        .Pattern = "\([A-Z]{1,3}/[A-Z]{1,3}\)"
        If .Test(str) Then
            tmp = .Execute(str)(0)
            tmp = Split(Replace(Replace(tmp, Chr(40), vbNullString), Chr(41), vbNullString), Chr(47))(num - 1)
            partNums = .Replace(str, tmp)
        End If
    End With
End Function

enter image description here

¹ 问题通常可以通过How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops中的解决方案来回答。

²用户定义函数(又名UDF)被放入标准模块代码表中。点击 Alt + F11 ,当VBE打开时,立即使用下拉菜单插入►模块 Alt + 中号)。将功能代码粘贴到标题为 Book1 - Module1(Code)的新模块代码表中。点击 Alt + Q 返回工作表。