在Excel中反向stringsearch

试图让F / VENDOR#列仅填充供应商编号。 供应商编号被突出显示。 我的策略是从右侧find第三个"_" ,并用"|"代替它。 。 然后任何正确的pipe道填充在D列。

然而,三个以上的"_"不符合逻辑。 我究竟做错了什么?

列D公式=IF(ISERROR(FIND("_",C2)),"",RIGHT(C2,LEN(C2)-FIND("|",SUBSTITUTE(C2,"_","|",LEN(C2)-LEN(SUBSTITUTE(C2,"_","",3))))))

列F /卖方#公式=IF(ISERROR(LEFT(D2,FIND("_",D2)-1)),"",LEFT(D2,FIND("_",D2)-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函数中的索引。 如果string中有未知数的_ ,则需要使用相对偏移量( -2右边第三种 )。

如果你可以使用VBA,那么你应该看看使用正则expression式的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