Hàm loại bỏ trùng trong một ô

Liên hệ QC

nvh611

Thành viên thường trực
Tham gia
20/5/17
Bài viết
228
Được thích
42
Chào các bạn
nhờ các bạn giúp hàm loại bỏ trùng trong một ô như file đính kèm
Xin trân thành cảm ơn các bạn!
 

File đính kèm

  • Loại bỏ trùng trong 1 ô.xlsb
    7.6 KB · Đọc: 22
Chào các bạn
nhờ các bạn giúp hàm loại bỏ trùng trong một ô như file đính kèm
Xin trân thành cảm ơn các bạn!
Anh tham khảo link này nhe
 
Thử:
Mã:
Public Function HamLoaiBoTrung(s As String) As String
Dim t As String
Dim i As Long
For i = 1 To Len(s)
  If InStr(t, Mid(s, i, 1)) = 0 Then t = t & Mid(s, i, 1)
Next
    HamLoaiBoTrung = t
End Function
 
Thử:
Mã:
Public Function HamLoaiBoTrung(s As String) As String
Dim t As String
Dim i As Long
For i = 1 To Len(s)
  If InStr(t, Mid(s, i, 1)) = 0 Then t = t & Mid(s, i, 1)
Next
    HamLoaiBoTrung = t
End Function
Thử làm phương pháp không cần cộng chuỗi (không dùng toán tử &)
 
Bài này có nhiều cách giải, dùng vòng lặp chỉ cần chạy đúng số lượng dữ liệu duy nhất, dùng cộng chuỗi hay không cộng chuỗi đều được
 
Mã:
Public Function HamLoaiBoTrung(s As String) As String
Dim i As Long
For i = 1 To Len(s)
  If InStr(i + 1, s, Mid(s, i, 1)) > i Then Mid(s, i, 1) = " "
Next
    HamLoaiBoTrung = Replace(s, " ", "")
End Function
 
Cải tiến thêm chút nữa, dùng kỹ thuật dồn ký tự:

Public Function HamLoaiBoTrung(ByVal s As String) As String
Dim i As Integer, chep As Integer
For i = 1 To Len(s)
If InStr(s, Mid(s, i, 1)) > chep Then ' nằm ngoài vùng ký tự được dồn, tức là ký tự mới
chep = chep + 1
Mid(s, chep, 1) = Mid(s, i, 1)
End If
Next
HamLoaiBoTrung = Left(s, chep)
End Function
 
Một cách viết số vòng chạy bằng số phần tử duy nhất:
Mã:
Public Function Loai(Cll)
    Dim A, Kq
    Do While Len(Cll) > 0
        A = Left(Cll, 1)
        Cll = Replace(Cll, A, "")
        Kq = Kq & A
    Loop
    Loai = Kq
End Function
Thân
 
Quậy chút, vì mang vào hộp "Hàm và công thức" :)

Untitled2.png

Mã:
F3=IFERROR(INDEX(MID($B3,COLUMN($A:$Z),1),MATCH(,INDEX(COUNTIF($E3:E3,MID($B3,COLUMN($A:$Z),1)),),)),"")
Enter, fill qua phải. Xong ghép lại bằng &.

Thân
 

File đính kèm

  • Loại bỏ trùng trong 1 ô.xlsb
    8.4 KB · Đọc: 11
Chào các bạn
nhờ các bạn giúp hàm loại bỏ trùng trong một ô như file đính kèm
Xin trân thành cảm ơn các bạn!
Góp vui văn nghệ
Nếu chuỗi không có các ký tự đặc biệt như ă, â, ê, ô, ơ, ư, đ thì có thể dùng thử hàm này
Mã:
Function Loai(Chuoi)
Dim Mang(48 To 122)
Dim i, j, t
For i = 1 To Len(Chuoi)
    t = Mid(Chuoi, i, 1)
    j = CLng(Asc(t))
    If Mang(j) = "" Then
        Mang(j) = 1
        Loai = Loai & t
    End If
Next i
End Function
 
Góp vui văn nghệ
Nếu chuỗi không có các ký tự đặc biệt như ă, â, ê, ô, ơ, ư, đ thì có thể dùng thử hàm này
Mã:
Function Loai(Chuoi)
Dim Mang(48 To 122)
Dim i, j, t
For i = 1 To Len(Chuoi)
    t = Mid(Chuoi, i, 1)
    j = CLng(Asc(t))
    If Mang(j) = "" Then
        Mang(j) = 1
        Loai = Loai & t
    End If
Next i
End Function
Dim Mang(0 To 255) As Boolean ' chẳng lý do gì phải giới hạn nó trong vòng alphanumeric cả
...
If Not Mang(i) Then
Mang(i) =True
(con số từ 0 đến 255 thìu duyngf Byte chứ tại sao lại phải Long?)

Chú: theo lý thuyết, kỹ thuật dùng lọc theo index (dùng mảng chỉ số) rất hiệu quả khi chuỗi dài. Gặp chuỗi ngắn thì cách nào cũng được. Phép cộng chuỗi (&) là phép tính tốn nhiều năng lượng.
 
@nvh611
Theo gợi ý của bài 11, sửa lại code cho phù hơp, không phải tránh các ký tự đặc biệt như bài trước
Mã:
Function Loai(Chuoi)
Dim Mang(0 To 500) As Boolean
Dim i, j, t
For i = 1 To Len(Chuoi)
    t = Mid(Chuoi, i, 1)
    j = CLng(AscW(t))
    If Not Mang(j) Then
        Mang(j) = True
        Loai = Loai & t
    End If
Next i
End Function

@VetMini
Cám ơn bác! Hàm Asc chuyển thành AscW thì đạt hẳn bác ah
 
Web KT
Back
Top Bottom