other:vb-make-fio-short
Сокращение ФИО на VB
Option Compare Text Public Function Инициалы(s As String, Optional Cлева As Boolean = False) Dim sv As Variant, sФ As String, sИ As String, sО As String, i As Long, k As Long Application.Volatile True If InStr(s, ".") > 0 Or Len(Trim$(s)) = 0 Then Инициалы = s 'Инициалы заданы явно или пустая строка Exit Function End If 'Нормализация входной строки s = Replace(Application.Trim(s), Chr(30), "-") s = Replace(Replace(s, " -", "-"), "- ", "-") s = Replace(Replace(s, "' ", "'"), " '", "'") ' О 'Генри Александр; О' Генри Александр; Н' Гомо; Д' Тревиль sv = Split(s) sИ = vbNullString: sО = vbNullString: sФ = vbNullString i = UBound(sv) If i < 1 Then Инициалы = s: Exit Function Select Case sv(i) Case "оглы", "кызы", "заде" 'бей, бек, заде, зуль, ибн, кызы, оглы, оль, паша, уль, хан, шах, эд, эль i = i - 1 sО = UCase(Left$(sv(i), 1)) & "." i = i - 1 Case "паша", "хан", "шах", "шейх" i = i - 1 Case Else Select Case Right$(sv(i), 3) Case "вич", "вна" If i >= 2 Then 'Стандартное окончание русских отчеств sО = СropWord(sv(i)) Else 'Имя типа Босан Славич sИ = СropWord(sv(i)): sФ = sv(0) End If i = i - 1 Case Else k = InStr(sv(i), "-") If k > 0 Then Select Case Mid$(sv(i), k + 1) Case "оглы", "кызы", "заде", "угли", "уулы", "оол" 'Вариант насаба «-оглы» и «-заде» типа Махмуд-оглы sО = UCase(Left$(sv(i), 1)) & "." i = i - 1 If i = 0 Then sИ = sО sО = vbNullString End If End Select ElseIf i > 2 Then Select Case sv(i - 1) Case "ибн", "бен", "бин" sО = UCase(Left$(sv(i), 1)) & "." ' Усерталь Алишер бен Сулейман i = i - 2 End Select Else ' Бен Эдуард sИ = UCase(Left$(sv(i), 1)) If Len(sv(i)) > 1 Then sИ = sИ & "." i = i - 1 End If End Select End Select Select Case sv(0) Case "де", "дел", "дос", "cент", "ван", "фон", "цу" If i >= 2 Then sФ = sv(0) & " " & StrConv(sv(1), vbProperCase) sИ = СropWord(sv(2)) Else 'Де Николай If Len(sИ) > 0 Then sФ = sv(0) & " " & StrConv(sv(1), vbProperCase) Else sФ = StrConv(sv(0), vbProperCase): sИ = СropWord(sv(1)) End If End If Case Else If Len(sФ) = 0 Then 'Ещё не определили фамилию sФ = StrConv(sv(0), vbProperCase) If Len(sИ) = 0 Then sИ = СropWord(sv(1)) End If End Select If Слева Then Инициалы = sИ & sО & " " & sФ Else Инициалы = sФ & " " & sИ & sО End Function Public Function СropWord(s As Variant) As String If Len(s) = 1 Then СropWord = s Else ss$ = UCase(Left$(s, 1)) & ".": k = InStr(s, "-") If k > 0 Then ss$ = ss$ & "-" & Mid$(s, k + 1, 1) & "." СropWord = ss$ End If End Function
other/vb-make-fio-short.txt · Последнее изменение: 2017/03/23 21:59 — 127.0.0.1