2017-06-17 88 views
2

試圖讓F/VENDOR#列僅填充供應商編號。供應商編號被突出顯示。我的策略是從右側找到第三個"_",並用"|"替代它。然後,管道的任何權利都填充在列D中。Excel中的反向字符串搜索

但是,具有三個以上"_"的那些不符合邏輯。我究竟做錯了什麼?

列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))

enter image description here

enter image description here

+0

問題是,在找到的最後一個「_」處進行替換。我需要指定從右到左替換第三個匹配項。任何幫助表示讚賞。 – DigitalSea

回答

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函數索引。如果字符串中存在未知數字_ s,則需要使用相對偏移量(-2的第二種,右邊第三個來自)。

如果你可以使用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