VBA Macro/VBA Excel

[엑셀] 유사 단어의 일치도(%) 산출 매크로

루아흐뉴마 2018. 1. 13. 04:48
반응형

S Y N O P S I S #유사한 단어의 일치도(%) 산출하기

  • 유사한 단어의 일치도(%)를 산출한다. 구체적으로 두 단어 사이의 최대 연속 부분의 일치도를 산출하는 매크로이다.
  • 예컨대 "기계자동차공학부"와 "자동차공학과"를 비교했을 때,
  • (전자를 기준으로) 전체 8개 글자 중에서 5개 글자가 일치하므로 5/8 = 62.5%가 일치하는 셈이다.
  • 연속된 글자일 경우에만 산출한다. 불연속 글자의 경우는 일부 코드의 수정이 필요하다.
  • 예시는 전문대학 공학계열 학과 리스트 중에서 찾는 단어(GoalText)의 일치도를 산출한다.
  • 예시 영상에서 100% 일치인데 40%로 나오는 건 괄호와 숫자가 있기 때문.


VBA Code


Option Explicit
Sub max_common_text()
Dim lastRow As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim varString() As String
Dim myString As String
Dim dp(500, 500) As Long
Dim myMax As Long

With ActiveSheet.UsedRange
    lastRow = .Row + .Rows.Count - 1
End With

myString = Cells(2, 3)                       '시트 2행 3열에 있는 단어를 변수로 활용, 필요시 변경
ReDim Preserve varString(1 To lastRow - 1)   '전체 크기-1만큼 배열 초기화

For i = 1 To lastRow - 1
    varString(i) = Cells(i + 1, "A")         'A열의 문자열을 배열변수에 할당
Next i

For k = 1 To UBound(varString)
dp(1, 0) = 0
dp(0, 1) = 0
myMax = 0                                   '최댓값을 0으로 초기화
For i = 1 To Len(myString)
    For j = 1 To Len(myString) - i + 1
        dp(i, j) = WorksheetFunction.Max(Len(varString(k)) - Len(Replace(varString(k), Mid(myString, i, j), "", , j)), dp(i, j - 1))
        If myMax <= dp(i, j) Then        'dp가 큰 경우 최대값 갱신
            myMax = dp(i, j)
        End If
    Next j
Next i

ActiveSheet.Cells(k + 1, "B") = Format(myMax / Len(varString(k)), "0.0%")
Next k

'dp(i, j) = i번째 글자부터 j개의 연속된 글자가 겹치는 최대 부분 개수
'dp(i, j) = max(i번째 글자부터 j개의 연속된 글자가 겹치는 개수, i번째 글자에서 j-1번째 글자까지 겹치는 개수)

End Sub



매크로 실행 동영상



 Copyright (2018) Ruahneuma. All Rights Reserved.


반응형