Board logo

標題: 帶出符合一長串字串資料 [打印本頁]

作者: leiru    時間: 2020-5-21 22:26     標題: 帶出符合一長串字串資料

問題:
B欄求的答案是:
A欄內只要有和E1和E2內任何一個字串符合就在B欄內標示
例如:
E1裡有XSV和XSW…,則儲存格A8351和儲存格A8352有符合這兩個字串,儲存格B8351顯示XSV,儲存格B8352顯示XSW


C欄求的答案是:
A欄內只要符合儲存格E1的任何一個字串,就在C欄內顯示XSV
A欄內只要符合儲存格E2的任何一個字串,就在C欄內顯示XT3
例如:
儲存格A8351和儲存格A8352符合E1內任一字串,則儲存格B8351顯示XSV,儲存格B8352顯示XSV
作者: 准提部林    時間: 2020-5-22 14:28

B2:
=IF(COUNT(FIND(A2,E$1)),A2,"")

C2:
=IFERROR(LEFT(VLOOKUP("*"&A2&"*",E$1:E$2,1,),3),"")
作者: leiru    時間: 2020-5-22 16:05

回復 2# 准提部林


    謝謝回覆
但B欄位,只有帶出XSV,XSW,XSX,其他的XSY,XSZ,XT0,XT1,XUX,XV0,XV1,XV2也要帶出來,還有不要帶出S,T,U,V,X

C欄內帶出的XSV,對應的A欄不要有S,T,U,V,X
作者: 准提部林    時間: 2020-5-22 16:29

回復 3# leiru

=IF(COUNT(FIND("+"&A2&"+","+"&MID(E$1,5,199)&"+")),A2,"")

=iferror(LEFT(LOOKUP(1,-FIND("+"&A2&"+","+"&MID(E$1:E$2,5,199)&"+"),E:E),3),"")
作者: leiru    時間: 2020-5-22 18:36

回復 4# 准提部林


    謝謝

不好意思,請問B欄和C欄也要帶出XSV,XT3,如何改公式
作者: 准提部林    時間: 2020-5-22 19:37

回復 5# leiru


怎麼帶, 模擬結果看看~~
作者: leiru    時間: 2020-5-22 21:03

回復 6# 准提部林


    也要帶出的資料如黃色區塊

真心感謝您
作者: 准提部林    時間: 2020-5-23 09:58

本帖最後由 准提部林 於 2020-5-23 10:06 編輯

回復 7# leiru


B2/陣列:
=IF(COUNT(FIND("+"&A2&"+","+"&SUBSTITUTE(E$1:E$2,"=","+")&"+")),A2,"")

C2/一般:
=IFERROR(LEFT(LOOKUP(1,-FIND("+"&A2&"+","+"&SUBSTITUTE(E$1:E$2,"=","+")&"+"),E:E),3),"")

============================================
若將字串改成:
XSV+/+XSW+XSX+XSY+XSZ+XT0+XT1+XUX+XV0+XV1+XV2
XT3+/+XT4+XT5+XT6+XT7+XT8+XT9+XUY+XV3+XV4+XV5

=IF(COUNT(FIND("+"&A2&"+","+"&E$1:E$2&"+")),A2,"")
=IFERROR(LEFT(LOOKUP(1,-FIND("+"&A2&"+","+"&E$1:E$2&"+"),F:F),3),"")


============================================
作者: leiru    時間: 2020-5-24 13:37

回復 8# 准提部林


    謝謝
請問若表格模式倒過來,該如何設定公式,如附檔
問題:
A欄內的字串有符合D欄內的字串,則B欄的答案顯示出來,求B欄
作者: 准提部林    時間: 2020-5-24 13:57

回復 9# leiru


高版本的有合併字串函數, 我沒有!
低版本要用VBA
作者: leiru    時間: 2020-5-25 23:49

請問用VBA如何寫,想研究看,感謝您
作者: 准提部林    時間: 2020-5-26 14:00

回復 11# leiru

Sub TEST()
Dim R&, Arr, T$, TT$, TS, xD, i&
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([D1], [D65536].End(xlUp)(2))
For i = 2 To UBound(Arr)
    If Arr(i, 1) <> "" Then xD(Arr(i, 1) & "") = ""
Next i
Arr = Range([A2], [A65536].End(xlUp)(2))
For i = 1 To UBound(Arr)
    TT = "": T = Replace(Arr(i, 1), "=", "+")
    If T = "" Then GoTo 101
    For Each TS In Split(T, "+")
        If TS <> "" And xD.Exists(TS & "") Then TT = TT & "、" & TS
    Next
    Arr(i, 1) = Mid(TT, 2)
101: Next i
[B2].Resize(UBound(Arr)) = Arr
End Sub


==================================
作者: Andy2483    時間: 2023-5-31 11:22

回復 12# 准提部林

謝謝論壇,謝謝前輩
後學藉此帖學習前輩的方案,方案學習心得註解如下,請前輩再指導

執行前:
[attach]36478[/attach]

執行結果:
[attach]36479[/attach]


Option Explicit
Sub TEST()
Dim R&, Arr, T$, TT$, TS, xD, i&
'↑宣告變數
Set xD = CreateObject("Scripting.Dictionary")
'↑令xD變數是 字典
Arr = Range([D1], [D65536].End(xlUp)(2))
'↑令Arr變數是 二維陣列,以D欄儲存格值帶入陣列
For i = 2 To UBound(Arr)
   If Arr(i, 1) <> "" Then xD(Arr(i, 1) & "") = ""
Next i
'↑設順迴圈將陣列值當key,item是空的,納入xD字典裡
Arr = Range([A2], [A65536].End(xlUp)(2))
'↑令Arr陣列換裝A欄儲存格值(不含標題列)
For i = 1 To UBound(Arr)
'↑設順迴圈
    TT = "": T = Replace(Arr(i, 1), "=", "+")
    '↑令TT變數是 空白,令T變數是 陣列值置換 "=" 為 "+"
    If T = "" Then GoTo 101
    '↑如果T變數是空白!就跳到標示101位置繼續執行(空白不處理)
    For Each TS In Split(T, "+")
    '↑設逐項迴圈!令TS變數是 (T變數以"+"分割後的一維陣列)陣列值
        If TS <> "" And xD.Exists(TS & "") Then TT = TT & "、" & TS
        '↑如果TS變數不是空白,且TS變數不在xD字典裡?
        '令TS變數(字串)放在TT變數(字串)後方,以 "、" 間隔

    Next
    Arr(i, 1) = Mid(TT, 2)
    '↑令TT變數取第2字以後的字元寫入Arr陣列裡
101: Next i
[B2].Resize(UBound(Arr)) = Arr
'↑令Arr陣列值從[B2]開始寫入儲存格裡
End Sub
作者: Andy2483    時間: 2023-5-31 11:56

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教

Option Explicit
Sub TEST_1() '↑
Dim Brr, Y, i&, T$, TT$, K
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是 字典
Brr = Range([D1], [D65536].End(3))
'↑令Brr變數是 二維陣列,以D欄儲存格值帶入陣列
For i = 2 To UBound(Brr)
   T = Trim(Brr(i, 1)): If T <> "" Then Y(T) = i
Next
'↑設順迴圈將陣列值當key,item是i變數,納入Y字典裡
Brr = Range([A2], [A65536].End(3))
'↑令Brr陣列換裝A欄儲存格值(不含標題列)
For i = 1 To UBound(Brr)
'↑設順迴圈
   T = Replace(Trim(Brr(i, 1)), "+", "=")
   '↑令T變數是陣列值去除頭尾空白字元後,再置換"+" 為 "="
   If T = "" Then GoTo i01 Else: T = "=" & T & "="
   '↑如果T變數是空字元,就不處理跳到標示i01位置繼續執行,
   '否則就令T變數在前後各包夾一個"="符號的新字串

   For Each K In Y.keys
   '↑設逐項迴圈,令K變數是Y字典裡的一key
      If InStr(T, "=" & K & "=") Then TT = TT & "、" & K
      '↑如果T變數(字串)裡包含了 (K變數在前後各包夾一個"="符號)字串
   Next
   Brr(i, 1) = Mid(TT, 2): TT = ""
   '↑令TT變數的第2個字元開始的字串寫入陣列裡(覆蓋原陣列值)
i01: Next
[B2].Resize(UBound(Brr)) = Brr
'↑令Brr陣列值從[B2]開始寫入儲存格裡
Set Y = Nothing: Erase Brr
'↑令釋放變數
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)