Lọc trùng trong 1 ô

Liên hệ QC

hoalv1985

Thành viên hoạt động
Tham gia
27/11/17
Bài viết
130
Được thích
20
Giới tính
Nam
Em nhờ các anh/ chị trong diễn đàn giúp em bài toán này với ạ. Em sử dụng hàm ( giống hàm vlookup) trả về nhiều giá trị ( ở cột b sheets(" kiem tra"). Nhưng khi sử dụng hàm đó thì trả về kết quả trùng trong 1 ô. Em muốn chỉ lấy giá trị khác nhau thôi ạ. Kết quả mong muốn em để ví dụ ở cột C ạ. Em cảm ơn Anh/ chị nhiều ạ!
 

File đính kèm

  • tro giup.xlsm
    71.4 KB · Đọc: 26
Em nhờ các anh/ chị trong diễn đàn giúp em bài toán này với ạ. Em sử dụng hàm ( giống hàm vlookup) trả về nhiều giá trị ( ở cột b sheets(" kiem tra"). Nhưng khi sử dụng hàm đó thì trả về kết quả trùng trong 1 ô. Em muốn chỉ lấy giá trị khác nhau thôi ạ. Kết quả mong muốn em để ví dụ ở cột C ạ. Em cảm ơn Anh/ chị nhiều ạ!
Thử thêm như sau:
PHP:
Function HyVlookUp(lookup_value, lookup_range As Range, index_col As Long) As String
    Dim x As Range, temp As String
    Dim result As String

    For Each x In lookup_range
        If x.Value = lookup_value Then
            temp = x.Offset(0, index_col - 1).Value
            If InStr(1, result & ",", "," & temp & ",") = 0 Then result = result & "," & temp
        End If
    Next
    If Len(result) > 0 Then HyVlookUp = VBA.Mid(result, 2)
End Function

UDF này xử lý chậm vì làm việc trên range.

.
 
Thử thêm như sau:
PHP:
Function HyVlookUp(lookup_value, lookup_range As Range, index_col As Long) As String
    Dim x As Range, temp As String
    Dim result As String

    For Each x In lookup_range
        If x.Value = lookup_value Then
            temp = x.Offset(0, index_col - 1).Value
            If InStr(1, result & ",", "," & temp & ",") = 0 Then result = result & "," & temp
        End If
    Next
    If Len(result) > 0 Then HyVlookUp = VBA.Mid(result, 2)
End Function

UDF này xử lý chậm vì làm việc trên range.

.
Em cảm ơn anh/ chị nhiều ạ. Chúc anh/ chị tuần làm việc vui vẻ và hạnh phúc ạ!
 
Em nhờ các anh/ chị trong diễn đàn giúp em bài toán này với ạ. Em sử dụng hàm ( giống hàm vlookup) trả về nhiều giá trị ( ở cột b sheets(" kiem tra"). Nhưng khi sử dụng hàm đó thì trả về kết quả trùng trong 1 ô. Em muốn chỉ lấy giá trị khác nhau thôi ạ. Kết quả mong muốn em để ví dụ ở cột C ạ. Em cảm ơn Anh/ chị nhiều ạ!
Mã:
Sub ABC()
Dim Dic As Object, i&
Set Dic = CreateObject("Scripting.dictionary")
With Sheet1
    arr = .Range("B2:B45").Value
    ReDim res(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arr)
        t = Split(arr(i, 1), ",")
        For ii = 0 To UBound(t)
            If Dic.exists(t(ii)) = False Then
                Dic.Add t(ii), ""
            End If
        Next
        For Each Key In Dic.keys
                tt = tt & "," & Key
        Next
        res(i, 1) = tt
        tt = "": Dic.RemoveAll
    Next
    .Range("C2").Resize(UBound(arr)).Value = res
End With
End Sub
Dùng tạm code này coi thế nào
 
Mã:
Sub ABC()
Dim Dic As Object, i&
Set Dic = CreateObject("Scripting.dictionary")
With Sheet1
    arr = .Range("B2:B45").Value
    ReDim res(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arr)
        t = Split(arr(i, 1), ",")
        For ii = 0 To UBound(t)
            If Dic.exists(t(ii)) = False Then
                Dic.Add t(ii), ""
            End If
        Next
        For Each Key In Dic.keys
                tt = tt & "," & Key
        Next
        res(i, 1) = tt
        tt = "": Dic.RemoveAll
    Next
    .Range("C2").Resize(UBound(arr)).Value = res
End With
End Sub
Dùng tạm code này coi thế nào
Dạ anh, code này trả về kết quả có dấu , trước tiên a à.
 
Thử thêm như sau:
PHP:
Function HyVlookUp(lookup_value, lookup_range As Range, index_col As Long) As String
    Dim x As Range, temp As String
    Dim result As String

    For Each x In lookup_range
        If x.Value = lookup_value Then
            temp = x.Offset(0, index_col - 1).Value
            If InStr(1, result & ",", "," & temp & ",") = 0 Then result = result & "," & temp
        End If
    Next
    If Len(result) > 0 Then HyVlookUp = VBA.Mid(result, 2)
End Function

UDF này xử lý chậm vì làm việc trên range.
Chậm do phải chạy For Each nhiều lần, mỗi lần chạy trên 6 cột ;)
Bài đã được tự động gộp:

Mã:
Sub ABC()
Dim Dic As Object, i&
Set Dic = CreateObject("Scripting.dictionary")
With Sheet1
    arr = .Range("B2:B45").Value
    ReDim res(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arr)
        t = Split(arr(i, 1), ",")
        For ii = 0 To UBound(t)
            If Dic.exists(t(ii)) = False Then
                Dic.Add t(ii), ""
            End If
        Next
        For Each Key In Dic.keys
                tt = tt & "," & Key
        Next
        res(i, 1) = tt
        tt = "": Dic.RemoveAll
    Next
    .Range("C2").Resize(UBound(arr)).Value = res
End With
End Sub
Dùng tạm code này coi thế nào
arr = .Range("B2:B45").Value
Cột B không có chỉ có dữ liệu cột A cần gán kết quả res vào cột B:)
 
Lần chỉnh sửa cuối:
Tuy nhiên nếu cần phải đi tuần tự cả range thì dùng hàm Find-FindNext căn bản của VBA hiệu quả hơn.
Code này giữ nguyên gốc theo code cũ của tác giả. Trường hợp này có sẵn code JoinTextJoinIf của Lão Ẹc ẹc rồi. Hahaha...


.
 
Code này giữ nguyên gốc theo code cũ của tác giả. Trường hợp này có sẵn code JoinTextJoinIf của Lão Ẹc ẹc rồi. Hahaha...


.
Hàm khá đa dụng nhưng tốc độ vẫn còn chậm lắm lắm ... nên viết lại cho từng trường hợp nhằm tăng tốc như xe đua F1 :)
 
Hàm khá đa dụng nhưng tốc độ vẫn còn chậm lắm lắm ... nên viết lại cho từng trường hợp nhằm tăng tốc như xe đua F1 :)
Người chủ code đã rời diễn đàn lâu ròi cho nên tôi tránh phê bình nhiều. Tuy nhiên, vì bạn nhắc cho nên tôi có những lời về cách quản lý code sau đây:

Loại hàm làm nhiều công việc thế này người ta chia thành nhiều hàm. Mỗi hàm chuyên về phần của nó, và có thể gọi các hàm con chung nếu trùng code. Hàm chuyên thì publicv, hàm con chia code thì private.
Sau đó nếu muốn tổng quát thì viết một hàm tổng, tự xét trường hợp một gọi hàm chuyên. Chứ viết một hàm từ a đến z mà không chú thích đầy đủ thì người ngoài lười đọc code lắm.
 
Web KT
Back
Top Bottom