在Excel中反向字符串搜索

时间:2017-06-17 02:49:50

标签: regex excel excel-formula

尝试获取列F / VENDOR#以仅填充供应商编号。供应商编号突出显示。我的策略来自右侧,找到第三个Artist并将其替换为"_"。然后在D列填充管道的任何右侧。

然而,具有三个以上"|"的那些不遵循逻辑。我做错了什么?

D栏公式"_"

F栏/供应商#formula =IF(ISERROR(FIND("_",C2)),"",RIGHT(C2,LEN(C2)-FIND("|",SUBSTITUTE(C2,"_","|",LEN(C2)-LEN(SUBSTITUTE(C2,"_","",3))))))

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

问题出在D栏公式中 - 您有:

...LEN(C2)-LEN(SUBSTITUTE(C2,"_","",3))...

应该是:

...LEN(C2)-LEN(SUBSTITUTE(C2,"_",""))-2...

为D列提供完整的公式:

=IF(ISERROR(FIND("_",A17)),"",RIGHT(A17,LEN(A17)-FIND("|",SUBSTITUTE(A17,"_","|",LEN(A17)-LEN(SUBSTITUTE(A17,"_",""))-2))))

原因是因为该部分公式实际上用于计算另一个SUBSTITUTE函数中的索引。如果字符串中有-2个未知数,则需要使用相对偏移量(_第3个来自右侧)。

如果您可以使用VBA,那么您应该考虑使用带有正则表达式的UDF,因为我觉得这比双公式方法稍微复杂一点,这种方法并不容易。 UDF可能就是这样:

Option Explicit

Function GetVendorNumber(rng As Range) As String
    Dim objRegex As Object
    Dim objMatches As Object

    GetVendorNumber = ""
    Set objRegex = CreateObject("VBScript.RegExp")
    With objRegex
        .Pattern = "\D+_(\d+)_.+"
        Set objMatches = .Execute(rng.Text)
        If objMatches.Count = 1 Then
            GetVendorNumber = objMatches(0).SubMatches(0)
        End If
    End With

End Function