Board logo

標題: [發問] 請問各位大神,有關 textjoin 根據條件合併後,並刪除重複值 [打印本頁]

作者: edmondsforum    時間: 2020-6-23 00:00     標題: 請問各位大神,有關 textjoin 根據條件合併後,並刪除重複值

請問各位大神,
我想寫一個能根據我的條件,來合併相關文字,並把有重複的文字,排除。
如下圖所示
[attach]32196[/attach]

我G3=TEXTJOIN(";",TRUE,REPT($C$2:$C$30,$B$2:$B$30=F3))   然後ctrl+shit+enter 根據 F3 去找到第1週的文字 然後就會合併成  :開工拜拜;基礎開挖;基礎開挖;一樓地坪施作

我希望能判斷把重複刪除之,變成:開工拜拜;基礎開挖;一樓地坪施作

我有爬文有能寫:=TEXTJOIN(";",TRUE,IF(B$2:$B$30=F3;MATCH($C$2:$C$30;$C$2:$C$30;0)=(ROW($C$2:$C$30)-ROW($C$1));$C$2:$C$30;"");"")) 再搭配 ctrl+shit+enter
我是按到他的邏輯寫的(原文在這https://stackoverflow.com/questions/55607951/removing-duplicate-values-in-textjoin-and-if-function) 但一直錯誤...就算把;改成,也沒用

後來參照https://techcommunity.microsoft.com/t5/excel/removing-duplicates-when-using-textjoin/m-p/188950
還是一樣寫不出來...........

不知道我哪裡卡住了 拜託各位大神了!感恩

供參考
[attach]32198[/attach]
作者: quickfixer    時間: 2020-6-23 05:01

本帖最後由 quickfixer 於 2020-6-23 05:15 編輯

我找到這篇教學,跟你一樣的格式,我照著做ok喔
https://dhexcel1.wordpress.com/2017/04/04/multiple-lookup-values-in-a-single-cell-withwithout-duplicates-using-only-excel-formulas-by-david-hager/
[attach]32199[/attach]
[attach]32200[/attach]

arange=紀錄!$B$2:$B$30
brange=紀錄!$C$2:$C$30
some_array=SMALL(IF(arange=紀錄!$F3,ROW(brange)-1,""), ROW(INDIRECT("1:"&COUNT(IF(arange=紀錄!$F3,ROW(brange),"")))))
carray=INDEX(brange,N(IF(1,some_array)))
countarray=COUNTA(carray)
rowarray=ROW(INDIRECT("1:"&countArray))

g3=TEXTJOIN(";",,IF(MATCH(carray,carray,0)=rowarray,carray,""))
(ctrl+shift+enter)
作者: edmondsforum    時間: 2020-6-23 08:47

回復 2# quickfixer
謝謝大大妳的分享,但我忘了述說一件事,如果我把部分內容都為空白,他會顯示#N/A..怎麼辦呢
[attach]32201[/attach]
作者: quickfixer    時間: 2020-6-23 10:07

本帖最後由 quickfixer 於 2020-6-23 10:10 編輯

回復 3# edmondsforum

#N/A 就用ifna處理就好了
=TEXTJOIN(";",,IFNA(IF(MATCH(carray,carray,0)=rowarray,carray,""),""))
(ctrl+shift+enter)

[attach]32202[/attach]
作者: edmondsforum    時間: 2020-6-23 10:53

回復 4# quickfixer

再度謝謝大大提供方法,但因考量符號因素和未來 some_array=SMALL(IF(arange=紀錄!$F3,ROW(brange)-1,""), ROW(INDIRECT("1:"&COUNT(IF(arange=紀錄!$F3,ROW(brange),"")))))
這個  紀錄!$F3   會根據工作表: 例如  第1週!F3    /   第2週!F3  ....依此類推
可能要創造100個名稱....
所以剛剛有找到另一個方式,只可惜沒辦法 讓其他週同時出現一樣的文字罷了...
G3 =TEXTJOIN(":",TRUE,IF(($B$2:$B$30=F3)*($C$2:$C$30<>""),IF(MATCH($C$2:$C$30,$C$2:$C$30,0)=(ROW($C$2:$C$30)-MIN(ROW($C$2:$C$30))+1),$C$2:$C$30,""),""))
[attach]32203[/attach]

目前是希望能讓第3週 能跑出 相同的文字  

解決了空白和重複,卻造成其他週重複跑不出來 哈哈
再拜託各位大大協助了

[attach]32204[/attach]
作者: edmondsforum    時間: 2020-6-23 11:05

回復 5# edmondsforum
補充說明:G3=TEXTJOIN(":",TRUE,IF(($B$2:$B$30=F3)*($C$2:$C$30<>""),IF(MATCH($C$2:$C$30,$C$2:$C$30,0)=(ROW($C$2:$C$30)-ROW($C$1)),$C$2:$C$30,""),"")) 也會有同樣效果,
但就是會把相同文字排除..就算其他週也一樣~"~
作者: quickfixer    時間: 2020-6-23 11:18

回復 5# edmondsforum

[attach]32205[/attach]
   
用建立複本,excel定義名稱會自動做新的
作者: edmondsforum    時間: 2020-6-23 11:25

回復 7# quickfixer
原來如此啊!!還以為要自己建立好耶 不然我有100多個 會嚇死人 哈哈
另外你所體及的ifna 有什麼方式讓多餘符號刪除呢
;基礎開挖;;一樓地坪施作    變成     基礎開挖;一樓地坪施作   這樣
作者: edmondsforum    時間: 2020-6-23 11:39

真的感謝 quickfixer 大大提供的資訊,終於特別創造出來啦!!!
G3 = =TEXTJOIN(", ", TRUE, IFNA(IF(MATCH($C$2:$C$30, IF((F3=$B$2:$B$30)*($C$2:$C$30<>""), $C$2:$C$30, ""), 0)=MATCH(ROW($C$2:$C$30), ROW($C$2:$C$30)), $C$2:$C$30, ""),""))
這樣一來可以讓同條件下,相同的合併起來,而且空白的也會排除!!!


參考:https://www.get-digital-help.com/excel-udf-lookup-and-return-multiple-values-concatenated-into-one-cell/#searchdel
作者: 准提部林    時間: 2020-6-23 14:11

office版本沒有TEXTJOIN, 手寫試下:
陣列公式
=TEXTJOIN(":",TRUE,IF(ISNUMBER(0/(C$2:C$99<>"")/(MATCH(F3&C$2:C$99,B$2:B$99&C$2:C$99,)=ROW($2:$99)-1)),C$2:C$99,""))
作者: edmondsforum    時間: 2020-6-23 21:42

回復 10# 准提部林
感謝准大提供的方式!!
作者: hcm19522    時間: 2020-6-24 18:12

https://blog.xuite.net/hcm19522/twblog/589199759
作者: zz5151353    時間: 2021-9-8 15:19

G3 陣列公式下拉
  1. =TEXTJOIN(":",TRUE,IF(($B$2:$B$30=F3)*($C$2:$C$30<>"")*MATCH($B$2:$B$30&$C$2:$C$30&"<>",$B$2:$B$30&$C$2:$C$30&"<>",)=ROW($1:$29),$C$2:$C$30,""))
複製代碼
365  , F3 公式
  1. =UNIQUE(B2:B30)
複製代碼
365 ,  G3 公式下拉
  1. =TEXTJOIN(":",TRUE,UNIQUE(FILTER($C$2:$C$30,($C$2:$C$30<>"")*($B$2:$B$30=F3))),"")
複製代碼

作者: Andy2483    時間: 2023-12-1 09:46

本帖最後由 Andy2483 於 2023-12-1 15:56 編輯

謝謝論壇,謝謝各位前輩
後學藉此帖練習VBA,學習方案如下,請各位前輩指教
執行前:
[attach]37091[/attach]

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

Option Explicit
Sub TEST()
Dim Brr, Crr, i&, R&, N&, T$, T1$
'↑宣告變數
Brr = Range([C1], [B65536].End(xlUp))
'↑令Brr變數是裝入儲存格值的二維陣列
ReDim Crr(1 To 1000, 1 To 2)
'↑宣告Crr變數是二維空陣列,宣告其所引號範圍
For i = 2 To UBound(Brr)
'↑設順迴圈!i從2 到 Brr陣列縱向最大列號
   R = Val(Brr(i, 1)): T1 = Trim(Brr(i, 2))
   '↑令R變數是 迴圈列1欄陣列值轉成的數值(週數)
   '令T1變數是 迴圈列2欄陣列值去除前後空白字元後的新字串(內容)

   If R = 0 Or T1 = "" Then GoTo i01 Else Crr(R, 1) = R
   '↑如果序號或內容是空的 !就跳過,否則令結果陣列Crr第1欄週數列寫入週數
   If InStr(T & "/", "/" & T1 & "/") Then GoTo i01 Else N = IIf(N < R, R, N)
   '↑如果串接內容的字串裡有這 T1變數內容!就跳過,
   '否則令N變數記錄結果陣列需要用多少列

   Crr(R, 2) = IIf(Crr(R, 2) = "", T1, Crr(R, 2) & ":" & T1)
   '↑令結果陣列Crr第2欄內容列寫入沒有重複的內容
   T = T & "/" & T1
   '↑令T變數累串接T1變數(內容)
i01: Next
[H:I].ClearContents
'↑令舊的結果儲存格資料清除內容
If N = 0 Then Exit Sub
'↑如果N變數是0(沒有符合的資料)!就結束程式執行
[H3].Resize(N, 2) = Crr
'↑令所需要的結果儲存格區域寫入Crr陣列值
End Sub




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