# Макрос склонения ФИО на русском и украинском языках ``` ' НОВАЯ ВЕРСИЯ ФУНКЦИИ СКЛОНЕНИЯ - дательный падеж '============================================================================================================================== ' Module : modNew ' Author : Palant ' Professional application development for Microsoft Office ' Based on Author : EducatedFool from 07.01.2013 | ' http://ExcelVBA.ru/ ICQ: 5836318 Skype: ExcelVBA.ru ' http://palikhov.wordpress.com e-mail: anton.palikhov@outlook.com '============================================================================================================================== Option Compare Text ' эта строка нужна обязательно! (сравнение без учёта регистра) Function DativeCase(sSurname$, Optional sName$, Optional sPatronymic$) As String ' Функция формирует дательный падеж из ФИО ' Параметры: sSurname - фамилия, sName - имя, sPatronymic - отчество ' © 2021 Palant, © 2013 Educated Fool Application.Volatile True ' автопересчёт формулы на листе sSurname$ = Replace(sSurname$, " - ", "-"): sSurname$ = Replace(Replace(sSurname$, " -", "-"), "- ", "-") On Error Resume Next If sName$ = "" And sPatronymic$ = "" Then arr = Split(Application.Trim(sSurname$)) sSurname$ = arr(0): sName$ = arr(1): sPatronymic$ = Replace(arr(2), ".", "") End If ' пол теперь определяется иначе: что заканчивается на "вна" или "кизи" - то женщины, остальные - мужчины. Dim bMaleSex As Boolean: ' bMaleSex = (Right(sPatronymic, 1) = "ч" Or Right(sPatronymic, 4) = "огли") bMaleSex = Not (Right(sPatronymic, 2) = "на" Or Right(sPatronymic, 4) = "кизи") If Len(sSurname) > 0 Then ' Фамилия arrSurname = Split(sSurname, "-") For i = LBound(arrSurname) To UBound(arrSurname) ' перебираем все части фамилий, содержащих дефис sRes = "": sSurnamePart = arrSurname(i) If bMaleSex Then ' мужские фамилии Select Case Right(sSurnamePart, 1) Case "и", "ы", "у", "э", "е", "ю": sRes = sSurnamePart Case "ь", "й": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ю" Case "я", "а", "і": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "і" Case "о": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "о" Case Else: sRes = sSurnamePart & "у" End Select Select Case Right(sSurnamePart, 2) Case "ой": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ому" End Select Select Case Right(sSurnamePart, 3) Case "аха": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ці" Case "оха": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "сі" Case "чок": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "чок" Case "єць": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "йцю" Case "ньо": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "ню" Case "нок": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "нок" Case "ика": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "иці" End Select Select Case Right(sSurnamePart, 3) ' добавлено, для редких фамилий Case "ець": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "цю" Case "кий": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "кому" If LCase(sSurnamePart) Like "*[уеыаоэяиюё]ец" Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "цу" Case "зе", "их": sRes = sSurnamePart Case "ий", "ой": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ому" If Len(sSurnamePart) <= 4 Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ю" Case "уй": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ую" ' Case "ха": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "хові" End Select Select Case Right(sSurnamePart, 4) Case "вець": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "ецю" Case "бідь": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 3) & "едю" End Select Else ' женские фамилии Select Case Right(sSurnamePart, 1) Case "о", "е", "и", "у", "ю", "б", "в", "г", "д", "ж", "з", "к", "л", "м", "н", "п", _ "р", "с", "т", "ф", "х", "ц", "ч", "ш", "щ", "ь", "й": sRes = sSurnamePart Case "я": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ій" Case "є": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "є" Case Else: sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ій" End Select Select Case Right(sSurnamePart, 2) ' добавлено, для редких фамилий Case "ха", "ла", "ее": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "е" ' Case "ой": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ой" ' Case "ая": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ой" End Select End If ' не склоняются мужские и женские фамилии, оканчивающиеся на -о, -е, -э, -и, -у, -ю, ' а также на -а с предшествующей гласной If LCase(sSurnamePart) Like "*[уеыаоэяиюё]а" Then sRes = sSurnamePart arrSurname(i) = sRes Next DativeCase = Join(arrSurname, "-") & " " ' соединяем части склоняемой фамилии обратно в одну строку End If If Len(sName) > 0 Then ' Имя NameException$ = GetDativeException(sName) If Len(NameException$) Then ' для имен-исключений DativeCase = DativeCase & NameException$ Else ' имя не найдено в списке исключений If bMaleSex Then Select Case Right(sName, 1) Case "й", "ь": DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "ю" Case "я", "а": DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "і" Case "і": DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "і" Case "о": DativeCase = DativeCase & sName Case Else: DativeCase = DativeCase & sName & "у" End Select Else Select Case Right(sName, 1) Case "а", "я" If Mid(sName, Len(sName) - 1, 1) = "и" Then DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "и" Else DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "і" End If Case "ь": DativeCase = DativeCase & Mid(sName, 1, Len(sName) - 1) & "и" Case Else: DativeCase = DativeCase & sName End Select End If End If DativeCase = DativeCase & " " End If If Len(sPatronymic) > 0 Then ' Отчество If Right(sPatronymic, 4) = "огли" Or Right(sPatronymic, 4) = "кизи" Then DativeCase = DativeCase & sPatronymic Else If bMaleSex Then DativeCase = DativeCase & sPatronymic & "у" Else DativeCase = DativeCase & Mid(sPatronymic, 1, Len(sPatronymic) - 1) & "і" End If End If End If DativeCase = Replace(DativeCase, "-", "- ") DativeCase = StrConv(DativeCase, vbProperCase) DativeCase = Replace(DativeCase, "- ", "-") End Function Function GetDativeException(ByVal txt$) As String ' склонение имён-исключений Select Case txt$ Case "Павло": GetDativeException = "Павлу" Case "Лев": GetDativeException = "Льву" Case "Петро": GetDativeException = "Петру" Case "Михайло": GetDativeException = "Михайлу" Case "Марія": GetDativeException = "Марії" Case "Зоя": GetDativeException = "Зої" Case "Ігор": GetDativeException = "Ігорю" Case "Олеся": GetDativeException = "Олесі" Case "Дмитро": GetDativeException = "Дмитру" Case "Валерія": GetDativeException = "Валерії" Case "Любов": GetDativeException = "Любові" Case "Ольга": GetDativeException = "Ользі" ' без изменения (не склоняются) - перечисляем через запятую Case "Али", "Бали": GetDativeException = txt$ End Select End Function ``` ###### tags: `WORK, DATA`