![](/img/trans.png)
[英]Macros for Excel to replace text or add to the end and beginning of the cell
[英]Trying to extract a string of text pattern from the beginning and the end of a cell in Excel
我有以下數據以及我希望在列結果中看到的內容:
數據 | 結果 |
---|---|
PN 65011:2020text text text PN 65011:2020 | PN 65011:2020, PN 65011:2020 |
PN 45014-1:2017 文本 文本 文本 文本 PN 65014-1:2017 PN 8726-1:2017/P11:2020 | PN 45014-1:2017、PN 65014-1:2017、PN 8726-1:2017/P11:2020 |
PN 6534:2020文本文本文本文本 | PN 6534:2020 |
PN 65014-1:2017 文本 文本 文本 文本 PN 65014-1:2017/PC1:2013 | PN 65014-1:2017,PN 65014-1:2017/PC1:2013 |
PN ESO 67345:2019text text text PN 65018-1:2019/PC2:2020 | PN ESO 67345:2019、PN 65018-1:2019/PC2:2020 |
PN ESO/EOC 5320:2013text text text PN ESO 27380:2019 PN 65015-1:2020/PC:2021 | PN ESO/EOC 5320:2013、PN ESO 27380:2019、PN 65015-1:2020/PC:2021 |
我用過="PN "&TEXTJOIN(", PN ",1,IF(ISNUMBER(SEARCH("/",TRIM(MID(SUBSTITUTE(A2,"PN ",REPT(" ",LEN(A2))),(ROW(INDIRECT("1:"&LEN(A2))))*LEN(A2)-(LEN(A2)-1),LEN(A2))))),TRIM(MID(SUBSTITUTE(A2,"PN ",REPT(" ",LEN(A2))),(ROW(INDIRECT("1:"&LEN(A2))))*LEN(A2)-(LEN(A2)-1),LEN(A2))),LEFT(TRIM(MID(SUBSTITUTE(A2,"PN ",REPT(" ",LEN(A2))),(ROW(INDIRECT("1:"&LEN(A2))))*LEN(A2)-(LEN(A2)-1),LEN(A2))),MIN(IFERROR(FIND({" "},LOWER(TRIM(MID(SUBSTITUTE(A2,"PN ",REPT(" ",LEN(A2))),(ROW(INDIRECT("1:"&LEN(A2))))*LEN(A2)-(LEN(A2)-1),LEN(A2))))),""))-1)))
我幾乎得到了我想看到的內容,除了最后一行(PN ESO 5320:2013),我沒有得到數字。 它停在 PN ESO。 像這樣:
數據 | 結果 |
---|---|
PN ESO/EOC 5320:2013 文本 PN ESO 27380:2019 文本 PN 65015-1:2020/PC:2021 | PN ESO/EOC,PN ESO |
關於如何獲得整個參考的任何想法?
非常感謝您提前。
這是一個關於如何使用 Excel O365 來解決此問題的示例
B2
中的公式:
=TEXTJOIN(", ",,LET(X,FILTERXML("<t><s>"&SUBSTITUTE(A2,"PN ","</s><s>PN ")&"</s></t>","//s[position() > 1]"),Y,LEFT(X,FIND("|",SUBSTITUTE(X,":","|",LEN(X)-LEN(SUBSTITUTE(X,":",""))))+4),Y))
這里的想法是首先將“PN”的所有實例SUBSTITUTE()
替換為有效的 xpath 構造。 然后我們使用FILTERXML()
將所有值作為數組返回,顯然仍然是連接的“文本文本文本”。 因此,我使用LET()
將數組作為變量加載,並對所有元素使用一些字符串操作。
首先,我將所有字符串中最后出現的冒號替換為管道符號,然后我們FIND()
並返回它的 position。 現在我們有了可以使用LEFT()
提取正確子字符串的位置。 使用TEXTJOIN()
將結果數組重新連接在一起。
如果您可以接受 VBA 解決方案,則正則表達式非常適合此類問題。 如果您的示例都如您所見:
我們使用正則表達式來查找子字符串
/
,則尋找下一個設置為冒號-多位數字的模式。 要輸入此用戶定義的 Function (UDF), <alt-F11>
打開 Visual Basic 編輯器。 確保您的項目在 Project Explorer window 中突出顯示。 然后,從頂部菜單中,select插入/模塊並將下面的代碼粘貼到打開的 window 中。
要使用此用戶定義的 Function (UDF),請在某個單元格中輸入類似=extrPN(cell_Ref)
的公式。
Option Explicit
Function extrPN(S As String) As String
Dim RE As Object, MC As Object, M As Object
Const sPat As String = "PN[^:]+:\d+(?:/[^:]+:\d+)?"
Dim sTemp As String
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.Pattern = sPat
.ignorecase = False
If .Test(S) = True Then
Set MC = .Execute(S)
For Each M In MC
sTemp = sTemp & ", " & M
Next M
extrPN = Mid(sTemp, 3)
Else: extrPN = "no match"
End If
End With
End Function
正則表達式的解釋
提取PN
PN.*?:\d+(?:/[^:]+:\d+)?
選項:不區分大小寫; ^$ 匹配換行符
PN
.*?
:
\d+
(?:/[^:]+:\d+)?
使用RegexBuddy創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.