Attribute VB_Name = "mdl_stringZADE"
Option Compare Database


Option Explicit

'Функция нечеткого сравнения строк, смотрите применение в
'форме: Example 03
'
'метод предложен Кива Владимир vlak@glasnet.ru
'http://www.glasnet.ru/~vlak/similar/similar.html
'
'Программирование: Николай Малютин, malnik@mail.ru
'
'lngMaxLen - максимальная длина подстроки (достаточно 3-4)
'strStringMatching - сравниваемая строка
'strStringStandart - строка-образец
'

Private Type RetCount
    lngSubRows As Long
    lngCountLike As Long
End Type
Public Type UDK
    ul As String
    dom As String
    kv As String
End Type


Public Function IndistinctMatching _
(lngMaxLen As Long, _
strStringMatching As String, _
strStringStandart As String, lngCase As Long) As Long
Dim gret As RetCount
Dim tret As RetCount
Dim lngCurLen As Long   'текущая длина подстроки

    'если не передан какой-либо параметр, то выход
    If lngMaxLen = 0 Or Len(strStringMatching) = 0 Or Len(strStringStandart) = 0 Then
        IndistinctMatching = 0
        Exit Function
    End If
    
    gret.lngCountLike = 0
    gret.lngSubRows = 0
    For lngCurLen = 1 To lngMaxLen
        'Сравниваем строку A со строкой B
        tret = MatchingStrings(strStringMatching, strStringStandart, lngCurLen, lngCase)
        gret.lngCountLike = gret.lngCountLike + tret.lngCountLike
        gret.lngSubRows = gret.lngSubRows + tret.lngSubRows
        'Сравниваем строку B со строкой A
        tret = MatchingStrings(strStringStandart, strStringMatching, lngCurLen, lngCase)
        gret.lngCountLike = gret.lngCountLike + tret.lngCountLike
        gret.lngSubRows = gret.lngSubRows + tret.lngSubRows
    Next lngCurLen
    
    If gret.lngSubRows = 0 Then
        IndistinctMatching = 0
        Exit Function
    End If
    IndistinctMatching = (gret.lngCountLike / gret.lngSubRows) * 100
End Function

Private Function MatchingStrings _
(strA As String, strB As String, lngLen As Long, _
lngCase As Long) As RetCount
Dim tret As RetCount
Dim y As Long, z As Long
Dim strta As String
Dim strtb As String
    For z = 1 To Len(strA) - lngLen + 1
       strta = Mid(strA, z, lngLen)
       y = 1
       For y = 1 To Len(strB) - lngLen + 1
          strtb = Mid(strB, y, lngLen)
          If StrComp(strta, strtb, lngCase) = 0 Then
          tret.lngCountLike = tret.lngCountLike + 1
          Exit For
          End If
       Next y
    tret.lngSubRows = tret.lngSubRows + 1
    Next z
    MatchingStrings.lngCountLike = tret.lngCountLike
    MatchingStrings.lngSubRows = tret.lngSubRows
End Function


Public Sub test_sz()
Dim s As String
Dim s2 As String
Dim k As Long
Dim l As Long
Dim adresa As UDK
s = "ЛЕНИГРАДСКАЯ 11-4"
adresa = uldomkv(s)
Debug.Print adresa.ul, adresa.dom, adresa.kv
s2 = "Ленинградская"
k = 3
l = 1
If (IndistinctMatching(k, adresa.ul, s2, l)) > 65 Then
adresa.ul = s2
End If
Debug.Print adresa.ul, "dom." & adresa.dom, "kv." & adresa.kv
End Sub

Public Function uldomkv(inadr As String, Optional d As String = " ") As UDK
'разделим inadr
Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim i As Integer
Dim k1, k2 As Integer
'выделяем улицу до первого пробела
k1 = InStr(1, inadr, d)
k2 = InStr(k1 + 1, inadr, d)
With uldomkv
.ul = Mid(inadr, 1, k1)
.dom = RTrim(LTrim(Mid(inadr, k1 + 1, IIf(k2 = 0, Len(inadr), k2) - k1)))
If k2 > 0 Then
.kv = RTrim(LTrim(Mid(inadr, k2, Len(inadr))))
Else
.kv = ""
End If
End With
End Function

