概括
我想檢查一個單元格是否包含與其旁邊的單元格相同的 az 中的每個字母和 0-9 中的數字。順序無關緊要,但字符數很重要。例如,如果一個單元格包含“flat 1, 32 test road”,而它旁邊的單元格包含“32, flat 1, test road”,它將匹配,因為它們都包含 3 t's, 2 a's, 1 l, ETC。)。
示例表
下面是預期輸出的示例,公式填充在 C 列中:
| 資料 1 | 資料 2 | 匹配? |
|---|---|---|
| 123試驗路 | 測驗道路123 | 匹配 |
| FOOBAR 34 | FOO,/,34BAR | 匹配 |
| 你好世界1 | 你好世界2 | 不匹配 |
| FLAT4,33 街道名稱 | 街道名稱 33,FLAT 4 | 匹配 |
| 12345 | 12345路 | 不匹配 |
作業代碼
目前,我首先將單元格的內容轉換為小寫,然后在IF(AND)陳述句中分別檢查 az 中的每個字母和 0-9 中的每個數字。它有效,但看起來很糟糕,而且無疑是非常低效和資源密集型的。代碼如下:
=IF(AND(LEN(A1)-LEN(SUBSTITUTE(A1,"a",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"a","")),LEN(A1)-LEN(SUBSTITUTE(A1,"b",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"b","")),LEN(A1)-LEN(SUBSTITUTE(A1,"c",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"c","")),LEN(A1)-LEN(SUBSTITUTE(A1,"d",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"d","")),LEN(A1)-LEN(SUBSTITUTE(A1,"e",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"e","")),LEN(A1)-LEN(SUBSTITUTE(A1,"f",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"f","")),LEN(A1)-LEN(SUBSTITUTE(A1,"g",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"g","")),LEN(A1)-LEN(SUBSTITUTE(A1,"h",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"h","")),LEN(A1)-LEN(SUBSTITUTE(A1,"i",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"i","")),LEN(A1)-LEN(SUBSTITUTE(A1,"j",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"j","")),LEN(A1)-LEN(SUBSTITUTE(A1,"k",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"k","")),LEN(A1)-LEN(SUBSTITUTE(A1,"l",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"l","")),LEN(A1)-LEN(SUBSTITUTE(A1,"m",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"m","")),LEN(A1)-LEN(SUBSTITUTE(A1,"n",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"n","")),LEN(A1)-LEN(SUBSTITUTE(A1,"o",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"o","")),LEN(A1)-LEN(SUBSTITUTE(A1,"p",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"p","")),LEN(A1)-LEN(SUBSTITUTE(A1,"q",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"q","")),LEN(A1)-LEN(SUBSTITUTE(A1,"r",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"r","")),LEN(A1)-LEN(SUBSTITUTE(A1,"s",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"s","")),LEN(A1)-LEN(SUBSTITUTE(A1,"t",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"t","")),LEN(A1)-LEN(SUBSTITUTE(A1,"u",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"u","")),LEN(A1)-LEN(SUBSTITUTE(A1,"v",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"v","")),LEN(A1)-LEN(SUBSTITUTE(A1,"w",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"w","")),LEN(A1)-LEN(SUBSTITUTE(A1,"x",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"x","")),LEN(A1)-LEN(SUBSTITUTE(A1,"y",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"y","")),LEN(A1)-LEN(SUBSTITUTE(A1,"z",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"z","")),LEN(A1)-LEN(SUBSTITUTE(A1,"0",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"0","")),LEN(A1)-LEN(SUBSTITUTE(A1,"1",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"1","")),LEN(A1)-LEN(SUBSTITUTE(A1,"2",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"2","")),LEN(A1)-LEN(SUBSTITUTE(A1,"3",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"3","")),LEN(A1)-LEN(SUBSTITUTE(A1,"4",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"4","")),LEN(A1)-LEN(SUBSTITUTE(A1,"5",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"5","")),LEN(A1)-LEN(SUBSTITUTE(A1,"6",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"6","")),LEN(A1)-LEN(SUBSTITUTE(A1,"7",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"7","")),LEN(A1)-LEN(SUBSTITUTE(A1,"8",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"8","")),LEN(A1)-LEN(SUBSTITUTE(A1,"9",""))=LEN(B1)-LEN(SUBSTITUTE(B1,"9",""))),TRUE,FALSE)
正如您所看到的,它很礙眼。它有效,但我需要將其應用于至少 100,000 行資料,而且我相信它會過于密集而無法可靠地作業。當前的解決方案是遍歷每個字母并確保它們的計數匹配,如果匹配則回傳 TRUE。
結論
我有一個可行的解決方案,它給出了所需內容的示例,但它笨拙且不可靠。我希望有更好的方法來利用 Excel 以更有效地完成這項任務。在此先感謝您的時間!
我使用的是 MSO 365,Excel 版本 2202
uj5u.com熱心網友回復:
替代使用LEN:
=AND(MMULT(LEN(A2:B2)-LEN(SUBSTITUTE(UPPER(A2:B2),MID("0123456789ABCDEFGHIJKLMNOPQRSTUVXYZ",SEQUENCE(36),1),"")),{-1;1})=0)
并復制下來。
uj5u.com熱心網友回復:
非常好的問題。這是一個會溢位結果的選項:

中的公式C2:
=BYROW(A2:B6,LAMBDA(x,COUNTA(UNIQUE(MAP(x,LAMBDA(a,CONCAT(LET(b,MID(a,SEQUENCE(LEN(a)),1),c,CODE(UPPER(b)),SORT(IFERROR(--b,IF((c>64)*(c<91),b,""))))))),1))))=1
簡而言之:
BYROW()- 遍歷資料集中的每一行;MAP()- 上述回圈的每次迭代都將通過此函式傳遞兩個值以將每個元素拆分為字符,檢查這些是否為數字,如果不是則檢查 ASCIICODE()表,如果兩者都不是回傳空字串。SORT()這些字符和CONCAT()結果一起回傳;COUNTA(UNIQUE())- 組合以測驗上述迭代是否回傳兩個相同的值(不區分大小寫)。
uj5u.com熱心網友回復:
@JvdV 的回答很好。
我決定撰寫一個 lambda,CharFreq,將字串拆分為字符,并使用 Frequency 生成字符和數字的頻率。我的 lambda 在高級公式環境中看起來像這樣:
=LAMBDA(string,
LET(
codes, SEARCH(
MID(
string,
SEQUENCE(
LEN(
string
)
),
1
),
"0123456789abcdefghijklmnopqrstuvxyz"
),
fcodes, FILTER(
codes,
ISNUMBER(codes)
),
freq, FREQUENCY(
fcodes,
SEQUENCE(36)
),
freq
)
)
然后我可以比較頻率來識別任何差異:
=IF(SUM(--(CharFreq(A2)<>CharFreq(B2)))=0,"Match","No match")

筆記
如果像“*”或“?”這樣的通配符,這可能會給出錯誤的結果。出現在其中一個字串中 - 可以通過使用查找而不是搜索來修復,或者通過替換這些字符來修復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/537931.html
上一篇:查找升級值(復合百分比)
下一篇:VBAIF其他條件
