Tìm kiếm addin hoặc tool hoặc công thức tương tự addin fuzzy lookup

Liên hệ QC

taitubj93

Thành viên mới
Tham gia
28/11/10
Bài viết
3
Được thích
0
Chào các anh chị, e thường xuyên phải đối chiếu các danh mục thuốc, vật tư mà tên các đối tượng ko hoàn toàn giống nhau, nên ko thể dùng vlookup được, có cái addon của microsoft khá hay là fuzzy lookup https://www.microsoft.com/en-us/download/details.aspx?id=15011Capture.PNG


Nhưng addin này thường hay bị găp lỗi ko cài được Load Behavior: Not loaded. A runtime error occurred during the loading of the COM Add-in, nhất là khi cài lại máy.
Vậy e hỏi nhờ ace tư vấn giúp e xem có giải pháp nào thay thế được ko. E cảm ơn nhiều!
 
Bạn mô tả nhu cầu khi sử dụng add-in này nhé?
 
Bạn mô tả nhu cầu khi sử dụng add-in này nhé?
Chỉ đơn giản là mình muốn so sánh hai danh mục mà ko hoàn toàn giống nhau y hệt, mà ko dùng vlookup được, vì vậy có cái addin này giúp m tự lọc ra hai cái list đối chiếu như hình bên, với Similarity là độ giống nhau.
Nếu similarity bằng 1 thì coi như là giống nhau tuyệt đối, còn similarity nhỏ hơn 1 thì tương đối và từ đó m khớp được hai danh mục với nhau
 
Chỉ đơn giản là mình muốn so sánh hai danh mục mà ko hoàn toàn giống nhau y hệt, mà ko dùng vlookup được, vì vậy có cái addin này giúp m tự lọc ra hai cái list đối chiếu như hình bên, với Similarity là độ giống nhau.
Nếu similarity bằng 1 thì coi như là giống nhau tuyệt đối, còn similarity nhỏ hơn 1 thì tương đối và từ đó m khớp được hai danh mục với nhau

Bạn thử add-in A-Tools với hàm BS_SQL xem?
Nếu có thể bạn gửi file data và nếu cụ thể yêu cầu có thể sẽ được giải quyết.
 
Vấn đề có thể mục đích của người hỏi không phải máy móc như vậy? Vì một mục đích cụ thể có thể có hướng giải quyết khác nhau.
Mục đích đây bạn:
Chỉ đơn giản là mình muốn so sánh hai danh mục mà ko hoàn toàn giống nhau y hệt, mà ko dùng vlookup được, vì vậy có cái addin này giúp m tự lọc ra hai cái list đối chiếu như hình bên, với Similarity là độ giống nhau.
Nếu similarity bằng 1 thì coi như là giống nhau tuyệt đối, còn similarity nhỏ hơn 1 thì tương đối và từ đó m khớp được hai danh mục với nhau
 
Chào các anh chị, e thường xuyên phải đối chiếu các danh mục thuốc, vật tư mà tên các đối tượng ko hoàn toàn giống nhau, nên ko thể dùng vlookup được, có cái addon của microsoft khá hay là fuzzy lookup https://www.microsoft.com/en-us/download/details.aspx?id=15011View attachment 203480


Nhưng addin này thường hay bị găp lỗi ko cài được Load Behavior: Not loaded. A runtime error occurred during the loading of the COM Add-in, nhất là khi cài lại máy.
Vậy e hỏi nhờ ace tư vấn giúp e xem có giải pháp nào thay thế được ko. E cảm ơn nhiều!
Có từ khóa "fuzzy lookup" là tự tìm đúng hướng rồi, bạn tìm nhờ google là được
 
Khá là lâu, không biết có ai nghiên cứu đến chủ đề này ? hay đã phát triển tương tự, thì cho em xin với.
 
Khá là lâu, không biết có ai nghiên cứu đến chủ đề này ? hay đã phát triển tương tự, thì cho em xin với.
Theo bài trích dẫn ở trên hoặc sử dụng các hàm sau để tìm kiếm ( tham khảo trên internet)
Mã:
'Implements functions to rate how similar two strings are on
'a scale of 0.0 (completely dissimilar) to 1.0 (exactly similar)
'Source:   http://www.catalysoft.com/articles/StrikeAMatch.html
'Author: Bob Chatham, bob.chatham at gmail.com
'9/12/2010

Option Explicit

Public Function stringSimilarity(str1 As String, str2 As String) As Variant
'Simple version of the algorithm that computes the similiarity metric
'between two strings.
'NOTE: This verision is not efficient to use if you're comparing one string
'with a range of other values as it will needlessly calculate the pairs for the
'first string over an over again; use the array-optimized version for this case.

    Dim sPairs1 As Collection
    Dim sPairs2 As Collection

    Set sPairs1 = New Collection
    Set sPairs2 = New Collection

    WordLetterPairs str1, sPairs1
    WordLetterPairs str2, sPairs2

    stringSimilarity = SimilarityMetric(sPairs1, sPairs2)

    Set sPairs1 = Nothing
    Set sPairs2 = Nothing

End Function

Public Function strSimA(str1 As Variant, rRng As Range) As Variant
'Return an array of string similarity indexes for str1 vs every string in input range rRng
    Dim sPairs1 As Collection
    Dim sPairs2 As Collection
    Dim arrOut As Variant
    Dim l As Long, j As Long

    Set sPairs1 = New Collection

    WordLetterPairs CStr(str1), sPairs1

    l = rRng.Count
    ReDim arrOut(1 To l)
    For j = 1 To l
        Set sPairs2 = New Collection
        WordLetterPairs CStr(rRng(j)), sPairs2
        arrOut(j) = SimilarityMetric(sPairs1, sPairs2)
        Set sPairs2 = Nothing
    Next j

    strSimA = Application.Transpose(arrOut)

End Function

Public Function strSimLookup(str1 As Variant, rRng As Range, Optional returnType) As Variant
'Return either the best match or the index of the best match
'depending on returnTYype parameter) between str1 and strings in rRng)
' returnType = 0 or omitted: returns the best matching string
' returnType = 1           : returns the index of the best matching string
' returnType = 2           : returns the similarity metric

    Dim sPairs1 As Collection
    Dim sPairs2 As Collection
    Dim metric, bestMetric As Double
    Dim i, iBest As Long
    Const RETURN_STRING As Integer = 0
    Const RETURN_INDEX As Integer = 1
    Const RETURN_METRIC As Integer = 2

    If IsMissing(returnType) Then returnType = RETURN_STRING

    Set sPairs1 = New Collection

    WordLetterPairs CStr(str1), sPairs1

    bestMetric = -1
    iBest = -1

    For i = 1 To rRng.Count
        Set sPairs2 = New Collection
        WordLetterPairs CStr(rRng(i)), sPairs2
        metric = SimilarityMetric(sPairs1, sPairs2)
        If metric > bestMetric Then
            bestMetric = metric
            iBest = i
        End If
        Set sPairs2 = Nothing
    Next i

    If iBest = -1 Then
        strSimLookup = CVErr(xlErrValue)
        Exit Function
    End If

    Select Case returnType
    Case RETURN_STRING
        strSimLookup = CStr(rRng(iBest))
    Case RETURN_INDEX
        strSimLookup = iBest
    Case Else
        strSimLookup = bestMetric
    End Select

End Function

Public Function strSim(str1 As String, str2 As String) As Variant
    Dim ilen, iLen1, ilen2 As Integer

    iLen1 = Len(str1)
    ilen2 = Len(str2)

    If iLen1 >= ilen2 Then ilen = ilen2 Else ilen = iLen1

    strSim = stringSimilarity(Left(str1, ilen), Left(str2, ilen))

End Function

Sub WordLetterPairs(str As String, pairColl As Collection)
'Tokenize str into words, then add all letter pairs to pairColl

    Dim Words() As String
    Dim word, nPairs, pair As Integer

    Words = Split(str)

    If UBound(Words) < 0 Then
        Set pairColl = Nothing
        Exit Sub
    End If

    For word = 0 To UBound(Words)
        nPairs = Len(Words(word)) - 1
        If nPairs > 0 Then
            For pair = 1 To nPairs
                pairColl.Add Mid(Words(word), pair, 2)
            Next pair
        End If
    Next word

End Sub

Private Function SimilarityMetric(sPairs1 As Collection, sPairs2 As Collection) As Variant
'Helper function to calculate similarity metric given two collections of letter pairs.
'This function is designed to allow the pair collections to be set up separately as needed.
'NOTE: sPairs2 collection will be altered as pairs are removed; copy the collection
'if this is not the desired behavior.
'Also assumes that collections will be deallocated somewhere else

    Dim Intersect As Double
    Dim Union As Double
    Dim i, j As Long

    If sPairs1.Count = 0 Or sPairs2.Count = 0 Then
        SimilarityMetric = CVErr(xlErrNA)
        Exit Function
    End If

    Union = sPairs1.Count + sPairs2.Count
    Intersect = 0

    For i = 1 To sPairs1.Count
        For j = 1 To sPairs2.Count
            If StrComp(sPairs1(i), sPairs2(j)) = 0 Then
                Intersect = Intersect + 1
                sPairs2.Remove j
                Exit For
            End If
        Next j
    Next i

    SimilarityMetric = (2 * Intersect) / Union

End Function
Hoặc hàm này tại trang
Mã:
'Name function and arguments
Function SearchChars(lookup_value As String, tbl_array As Range) As String
'Declare variables and types
Dim i As Integer, str As String, Value As String
Dim a As Integer, b As Integer, cell As Variant
'Iterste through each cell
For Each cell In tbl_array
  'Save cell value to variable
  str = cell
  'Iterate through characters
  For i = 1 To Len(lookup_value)
    'Same character?
    If InStr(cell, Mid(lookup_value, i, 1)) > 0 Then
      'Add 1 to number in array
      a = a + 1
      'Remove evaluated character from cell and contine with remaning characters
      cell = Mid(cell, 1, InStr(cell, Mid(lookup_value, i, 1)) - 1) & Mid(cell, InStr(cell, Mid(lookup_value, i, 1)) + 1, 9999)
    End If
  'Next character
  Next i

a = a - Len(cell)
'Save value if there are more matching characters than before 
If a > b Then
  b = a
  Value = str
End If

a = 0
Next cell
'Return value with the most matching characters
SearchChars = Value
End Function
 
Theo bài trích dẫn ở trên hoặc sử dụng các hàm sau để tìm kiếm ( tham khảo trên internet)
Cảm ơn bạn nhiều nhé.
Đang dùng cái stringSimilarity thấy cũng phù hợp với ý mình.
 
Nhờ bạn hướng dẫn cách sử dụng. Xin cảm ơn, mình không biết dùng hàm đó như nào
Cũng là Function thôi, nên
PHP:
Public Function stringSimilarity(str1 As String, str2 As String) As Variant
thì dùng so sánh 2 cụm như
PHP:
stringSimilarity("Hello","Hallo")
kết quả sẽ trả về % giống nhau của 2 từ này.
 
Cũng là Function thôi, nên
PHP:
Public Function stringSimilarity(str1 As String, str2 As String) As Variant
thì dùng so sánh 2 cụm như
PHP:
stringSimilarity("Hello","Hallo")
kết quả sẽ trả về % giống nhau của 2 từ này.
Mình có danh sách 1 khoảng 100 tên KH, danh sách 2 khoảng 1000 KH mình muốn tìm 100 KH đó trong 1000 KH kia nằm ở đâu có làm đc không bạn, mình thử strSimLookup cũng ko đc
 
Mình có danh sách 1 khoảng 100 tên KH, danh sách 2 khoảng 1000 KH mình muốn tìm 100 KH đó trong 1000 KH kia nằm ở đâu có làm đc không bạn, mình thử strSimLookup cũng ko đc
Vậy thì chắc không cần dùng tới đao to búa lớn vậy. Thử cách này xem:
1. Xử lý dữ liệu 1 chút bằng cách sau:
+ Dùng lệnh TRIM để dọn bớt những dấu cách thừa trong tên
+ UPCASE toàn bộ phần tên (có một số add in trên diễn đàn cho phép định dạng tên hàng loạt). Có thể viết hoa các chữ cái đầu của tên.
Hết bước này, bạn check tạm "bằng mắt" xem dữ liệu ổn chưa ? Nếu như dữ liệu cũng tương đối thì bước 2 :)
2. Dùng Conditional Formating để nó tự đánh dấu các dữ liệu trùng là hay nhất
Bạn tham khảo thử cách làm bên dưới.
1618308245295.png
Có gì thì bạn upload dữ liệu lên diễn đàn, nhiều anh em giúp đỡ sẽ dễ hơn.
-----------------
Nói thêm về Fuzzy thì nó chỉ dùng để so sánh 2 cụm (2 chuỗi, 2 từ) với nhau, để xem mức độ tương quan giữa chúng.
Nó không có mục đích giống như bạn đang làm. Hoặc nếu có thì chỉ dùng để đánh giá nguồn dữ liệu (danh sách 1 - danh sách 2).
Nếu cố áp dụng thì cũng được, nhưng nó cũng không phải là cách làm hay nếu dữ liệu 2 nguồn bị sai lệch nhiều.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom