Lọc ký tự trùng trong chuỗi

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

tranthanh2200

Thành viên hoạt động
Tham gia
12/1/18
Bài viết
150
Được thích
32
Donate (Momo)
Donate
Giới tính
Nam
Chào các bác trên diễn đàn: Mình có 1 file gồm nhiều dòng.
Mình đang dùng excel 365, liệu có hàm nào tách được dữ liệu như hình không a.
Vì chưa tìm được hàm nào nên mình đăng trong mục lập trình.
Nhờ các bác xem giúp hoặc viết code giúp a. Thanks all
ThanksCapture.PNG
 

File đính kèm

  • Lọc ký tự trùng.xlsx
    8.9 KB · Đọc: 11
Chào các bác trên diễn đàn: Mình có 1 file gồm nhiều dòng.
Mình đang dùng excel 365, liệu có hàm nào tách được dữ liệu như hình không a.
Vì chưa tìm được hàm nào nên mình đăng trong mục lập trình.
Nhờ các bác xem giúp hoặc viết code giúp a. Thanks all
ThanksView attachment 291583
Chêm mấy từ Tây bồi thế này thì chắc chờ hỗ trợ hơi lâu đây.
 
Upvote 0
Có 1 phần tử trùng hay có thể có nhiều phần tử trùng hở thớt?
 
Upvote 0
Chào các bác trên diễn đàn: Mình có 1 file gồm nhiều dòng.
Mình đang dùng excel 365, liệu có hàm nào tách được dữ liệu như hình không a.
Vì chưa tìm được hàm nào nên mình đăng trong mục lập trình.
Nhờ các bác xem giúp hoặc viết code giúp a. Thanks all
ThanksView attachment 291583
Bạn xem công thức này có đúng không nhé

Bạn có 365 thì dùng

E3=INDEX(TEXTSPLIT(B3,";"),MATCH(MIN(IFERROR(SEARCH(TEXTSPLIT(B3,";"),C3),"")),IFERROR(SEARCH(TEXTSPLIT(B3,";"),C3),""),0))

Cách trên sẽ không đúng với trường hợp có nhiều ký tự trùng

Còn nếu bạn không có 365 thì cách làm dài hơn chút, bạn tham khảo file
 

File đính kèm

  • Lọc ký tự trùng.xlsx
    10.7 KB · Đọc: 9
Upvote 0
có thể có nhiều phần tử trùng bác maika ạ
Bài đã được tự động gộp:


Chuỗi đó có thể có tới 40 phần tử và có thể trung nhiều phần tử bác a
Nếu tôi hiểu đúng thì phải gọi là lấy ra các phần tử có mặt trong cả 2 chuỗi.

Với code trong file, giả thiết của tôi là trong 1 tập hợp không có 2 phần tử giống nhau
 

File đính kèm

  • Lọc ký tự trùng_tranthanh2200.xlsm
    17 KB · Đọc: 19
Lần chỉnh sửa cuối:
Upvote 0
Chào các bác trên diễn đàn: Mình có 1 file gồm nhiều dòng.
Mình đang dùng excel 365, liệu có hàm nào tách được dữ liệu như hình không a.
Vì chưa tìm được hàm nào nên mình đăng trong mục lập trình.
Nhờ các bác xem giúp hoặc viết code giúp a. Thanks all

Bạn có thể dùng UDF

Mã:
Public Function LocTrung(ByVal Str1 As String, ByVal Str2 As String) As String
Dim v As Variant, tmp As String
Str2 = ";" & Str2 & ";"
For Each v In Split(Str1, ";")
    If InStr(1, Str2, ";" & v & ";") > 0 Then tmp = tmp & "; " & v
Next v
If Len(tmp) > 0 Then LocTrung = VBA.Mid(tmp, 3)
End Function

Trong D3, nhập công thức:

=LocTrung(B3,C3)

.
 
Upvote 0
Góp vui 1 cách, không biết kết quả đúng ý thớt không.
Code này nó tính trùng cả trong 1 ô.
PHP:
Sub GPE()
    Dim Dic As Object, Lr&, Arr(), k
    Dim Res(), i&, j%, a, key, Txt$, t
    Set Dic = CreateObject("Scripting.Dictionary")
    With Sheets("Sheet1")
        Lr = .Range("B" & Rows.Count).End(xlUp).Row
        Arr = .Range("B3:C" & Lr).Value
        ReDim Res(1 To UBound(Arr), 1 To 1)
        For i = 1 To UBound(Arr)
            For j = 1 To UBound(Arr, 2)
                For a = LBound(Split(Arr(i, j), ";")) To _
                UBound(Split(Arr(i, j), ";"))
                    key = Split(Arr(i, j), ";")(a)
                    If Not Dic.exists(key) Then
                        Dic.Add (key), ""
                    Else
                        t = t + 1
                        If t > 1 Then
                            Res(i, 1) = Res(i, 1) & ";" & key
                        Else
                            Res(i, 1) = key
                        End If
                    End If
                Next a
            Next j
            t = 0:           Dic.RemoveAll
        Next i
        .Range("D3:D" & Lr).ClearContents
        .Range("D3").Resize(i - 1, 1).Value = Res
    End With
    MsgBox "Done"
    Set Dic = Nothing
End Sub
 

File đính kèm

  • Lọc ký tự trùng.xlsb
    18.7 KB · Đọc: 11
Upvote 0
Bạn xem công thức này có đúng không nhé

Bạn có 365 thì dùng

E3=INDEX(TEXTSPLIT(B3,";"),MATCH(MIN(IFERROR(SEARCH(TEXTSPLIT(B3,";"),C3),"")),IFERROR(SEARCH(TEXTSPLIT(B3,";"),C3),""),0))

Cách trên sẽ không đúng với trường hợp có nhiều ký tự trùng

Còn nếu bạn không có 365 thì cách làm dài hơn chút, bạn tham khảo file
Xin cảm ơn bạn đã giúp đỡ. Chuỗi của mình có nhiều phần tử trùng. Mình sẽ lưu lại học hỏi thêm a
Bài đã được tự động gộp:

Xin cảm ơn 3 bác: Maica, phoucam, thóc SAMA. Em đã test thử và thấy cả 3 code đều hay a.
Bài đã được tự động gộp:
 
Lần chỉnh sửa cuối:
Upvote 0
@tranthanh2200
Một cách tận dụng biểu thức chính quy với hàm DupText , bạn tham khảo thêm.

JavaScript:
Function DupText(ByVal Text1$, ByVal Text2$, Optional separator = ";", Optional ignoreCase = True) As String
  With CreateObject("VBScript.RegExp")
    .Global = 1: .ignoreCase = ignoreCase
    .Pattern = "[" & separator & "]$|[" & separator & "]{2,}": If .test(Text2) Then Text2 = .Replace(Text2, "")
    .Pattern = "([\\\[\].\{\}\(\)\?\+\|\*])|([" & separator & "]$)": If .test(Text2) Then Text2 = .Replace(Text2, "\$1")
    .Pattern = "\b" & Replace(Text2, separator, "(?=[" & separator & "]|$|\b)|\b") & "(?=[" & separator & "]|$|\b)"
    Dim ms, m, s$: Set ms = .Execute(Text1)
    If ms.Count Then For Each m In ms: DupText = DupText & s & m: s = separator: Next
  End With
End Function
 
Upvote 0
Chào các bác trên diễn đàn: Mình có 1 file gồm nhiều dòng.
Mình đang dùng excel 365, liệu có hàm nào tách được dữ liệu như hình không a.
Vì chưa tìm được hàm nào nên mình đăng trong mục lập trình.
Nhờ các bác xem giúp hoặc viết code giúp a. Thanks all
ThanksView attachment 291583
Bạn thử nhé: ...
Mã:
=TEXTJOIN(";";1;IFERROR(IF(MATCH(TEXTSPLIT(B3;";");TEXTSPLIT(C3;";");0);TEXTSPLIT(B3;";");"");""))
Hoặc
Mã:
=TEXTJOIN(";";1;IF(ISERROR(MATCH(TEXTSPLIT(B3;";");TEXTSPLIT(C3;";");0));"";TEXTSPLIT(B3;";")))
 
Upvote 0
Bạn dùng E365 thì dùng công thức này
Mã:
=MAP(B3:B7,C3:C7,LAMBDA(a,b,LET(t,TEXTSPLIT(a,,";"),ARRAYTOTEXT(UNIQUE(FILTER(t,ISNUMBER(MATCH(t,TEXTSPLIT(b,,";"),0))))))))
Hoặc dùng power query
Mã:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Added Custom" = Table.AddColumn(Source, "Result", each Text.Combine(List.Distinct(List.Intersect({Text.Split([Cột 1],";"),Text.Split([Cột 2],";")})),", "))[Result]
in
    #"Added Custom"
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom