Vba excel склонение по падежам

Пользовательская функция (UDF) для перевода ФИО (фамилии, имя, отчества) в дательный падеж.

Эту функцию можно использовать как в коде программы, так и как формулу в ячейках листа Excel
(см. пример в прикреплённом файле)

PS: Функцию написал не я — нашел на просторах интернета несколько примеров кода, и переработал код для уменьшения количества ошибок при склонении.
Тестировал склонение на списке разнообразных ФИО (см. первый столбец в прикреплённом файле), и заведомо корректных результатах склонения (третий столбец)

Конечно, код не идеальный, — всегда можно найти ФИО, которые будут склоняться неверно.
Но, в целом, удалось добиться весьма неплохого результата (по сравнению с прежней версией кода, и другими аналогичными функциями)

Если вы используете функции склонения для формирования документов,
обратите внимание на специализированную надстройку FillDocuments,

которая позволит вам одним нажатием кнопки создать документы Word и Excel по шаблонам, а также выполнить рассылку писем.

В указанную надстройку включены самые последние версии функций склонения.

Пример использования:

Sub ПереводФИОвДательныйПадеж()
    ' если фамилия, имя и отчество - в одной переменной (или ячейке)
    FIO$ = "Сидоров Иван Скотиныч"
    ДательныйПадеж$ = DativeCase(FIO$)
    Debug.Print ДательныйПадеж$    ' результат: Сидорову Ивану Скотинычу

    ' если фамилия, имя и отчество - в разных переменных (или ячейках)
    Кому$ = DativeCase("Андреева", "Ольга", "Федоровна")
    Debug.Print Кому$    ' результат: Андреевой Ольге Федоровне
End Sub

Код функции DativeCase (новая версия, от 29 января 2013 года):

Option Compare Text    ' эта строка нужна обязательно! (сравнение без учёта регистра)

Function DativeCase(sSurname$, Optional sName$, Optional sPatronymic$) As String
    ' Функция формирует дательный падеж из ФИО
    ' Параметры: sSurname - фамилия, sName - имя, sPatronymic - отчество
    ' © 2013 EducatedFool

    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) & "е"
                        If UBound(arrSurname) > 0 And i = 0 Then sRes = sSurnamePart
                    Case Else: sRes = sSurnamePart & "у"
                End Select
 
                Select Case Right(sSurnamePart, 2)    ' добавлено, для редких фамилий
                    Case "ец": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "цу"
                        If LCase(sSurnamePart) Like "*[уеыаоэяиюё]ец" Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "цу"
                        If LCase(sSurnamePart) Like "*[!уеыаоэяиюё][!уеыаоэяиюё]ец" Then sRes = sSurnamePart & "у"
                    Case "зе", "их", "ых": sRes = sSurnamePart
                    Case "ый": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ому"
                    Case "ий", "ой": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ому"
                        If Len(sSurnamePart) <= 4 Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ю"
                        If Right(sSurnamePart, 3) = "чий" Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ему"
                    Case "уй": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ую"
                End Select
 
            Else    ' женские фамилии
                Select Case Right(sSurnamePart, 1)
                    Case "о", "е", "э", "и", "ы", "у", "ю", "б", "в", "г", "д", "ж", "з", "к", "л", "м", "н", "п", _
                         "р", "с", "т", "ф", "х", "ц", "ч", "ш", "щ", "ь", "й": sRes = sSurnamePart
                    Case "я": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ой"
                    Case Else: sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ой"
                End Select
 
                Select Case Right(sSurnamePart, 2)    ' добавлено, для редких фамилий
                    Case "ха", "ла", "ее": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "е"
                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 & 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 = txt$
    End Select
End Function
  • 102951 просмотр

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

ГЛАВНАЯ

ТРЕНИНГИ

   Быстрый старт
   Расширенный Excel
   Мастер Формул
   Прогнозирование
   Визуализация
   Макросы на VBA

КНИГИ

   Готовые решения
   Мастер Формул
   Скульптор данных

ВИДЕОУРОКИ

ПРИЕМЫ

   Бизнес-анализ
   Выпадающие списки
   Даты и время
   Диаграммы
   Диапазоны
   Дубликаты
   Защита данных
   Интернет, email
   Книги, листы
   Макросы
   Сводные таблицы
   Текст
   Форматирование
   Функции
   Всякое
PLEX

   Коротко
   Подробно
   Версии
   Вопрос-Ответ
   Скачать
   Купить

ПРОЕКТЫ

ОНЛАЙН-КУРСЫ

ФОРУМ

   Excel
   Работа
   PLEX

© Николай Павлов, Planetaexcel, 2006-2022
info@planetaexcel.ru


Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.

Техническая поддержка сайта

ООО «Планета Эксел»

ИНН 7735603520


ОГРН 1147746834949
        ИП Павлов Николай Владимирович
        ИНН 633015842586
        ОГРНИП 310633031600071 

Содержание

  1. Vba excel склонение фио по падежам
  2. Область применения:
  3. Примеры использования:
  4. Что реализовано:
  5. Как подключить?
  6. Как использовать?
  7. Ситуации, когда работа функции может быть некорректной:
  8. Склонение фамилии, имени и отчества

Vba excel склонение фио по падежам

Функция позволяет выводить фамилию, имя и отчество, заданные в именительном падеже, в форме любого другого падежа.

Область применения:

Функцию удобно использовать для автоматизации формирования документов в MS Excel (или облегчения создания их вручную), где ФИО необходимо указывать не в именительном падеже: различного рода договоры, кассовые ордера, квитанции, акты сверок, приказы, протоколы, доверенности и т.д.

Функция также незаменима, если средствами автоматизации реализовано формирование перечисленных выше документов в приложении MS Word на основании данных, находящихся в таблицах MS Excel.

Примеры использования:

  • в договоре: «в лице руководителя Баранова Петра Вячеславовича«
  • в кассовых ордерах: «выдано Гнатюку Павлу Васильевичу«, «получено от Гриценко Ирины Сергеевны«
  • в доверенности: «доверяю управление траспортным средством Смирницкому Виталию Валерьевичу«
  • в приказе: «назначить на должность Степашову Ольгу Николаевну«
  • в протоколе: «доклад подготовлен Дворжецким Никитой Ивановичем«

Что реализовано:

  • корректно склоняются фамилии со всеми распространенными на территории стран СНГ окончаниями «-ов», «-ев», «-ин», «-ян(ц)», «-ский(-цкий)», «-ской(-цкой)», «-ый», «-ых», «-их», «-ец», «-нко», «-ук», «-юк», «-ич», «-ия» и др.: Павлов, Зиновьев, Гагарин, Петросян, Высоцкий, Трубецкой, Цой, Задорожный, Садовничий, Седых, Долгих, Сосковец, Нестеренко, Гончарук, Данилюк, Рабинович, Данелия, Кваша, Врубель, Козак, Казачок и т.д., а также соответствующие женские фамилии
  • учитываются отличия в склонении мужских и женских фамилий: Ткачу Виктору и Ткач Светлане, Козовцу Антону и Козовец Екатерине
  • корректно обрабатываются составные фамилии: например, Мамин-Сибиряк, Салтыков-Щедрин, Немирович-Данченко, Лебедев-Кумач
  • не склоняются иноязычные фамилии: Галуа, Моруа, Дефо, Дали, Безе, Верди, Гарсиа, Хэмингуэй и пр.
  • успешно обрабатываются отчества с частицами «-оглы», «-кызы», «ибн»: Мамедов Полад Муртуза оглы -> Мамедовым Поладом Муртуза оглы, Гассан Абдурахман ибн Хаттаб -> Гассаном Абдурахманом ибн Хаттабом, Абу Али ибн Сина -> Абу Али ибн Синой
  • автоматически по отчеству определяется пол (мужской/женский) и исходя из этого выбираются соответствующие правила склонения
  • для ситуаций, когда пол автоматически определить затруднительно (отчество иностранное или отсутствует), можно указать пол в качестве параметра функции
  • возможен вывод в сокращенном виде «фамилия + инициалы»: Полозову Н. А., Васильевой А. К., Дворжецкому Е. Е.
  • возможность использования как в виде надстройки (можно использовать во всех файлах на данном рабочем месте), так и в виде кода, внедренного в файл (функция будет работать в данном файле на любом рабочем месте — удобно, если файл, например, отправляется контрагенту)
  • открытый программный код — при желании можно изучать алгоритм либо модифицировать

Как подключить?

Программа представляет собой один файл с названием bdgFIOPropisyu.bas. Для того, чтобы использовать ее в том или ином файле, функцию нужно импортировать в этот файл. Для этого необходимо:

  1. открыть файл MS Excel, в котором требуется использовать функцию
  2. войти в редактор VBA по нажатию горячей клавиши «Alt + F11» или через меню:
  3. в главном меню редактора VBA выбрать пункт «File» -> «Import file. «:
  4. в появившемся окне выбора файла выбрать файл bdgFIOPropisyu.bas и нажать кнопку «Открыть»:
    В результате этих действий в проводнике проекта в левой части экрана появится ветвь «Modules» (если ее еще не было), раскрыв которою можно увидеть строку bdgFIOPropisyu. А дважды кликнув по этой строке справа можно увидеть текст самой функции ФИОВПадеже:

Все, программный код импортирован и его можно использовать.

Как использовать?

  1. выделите курсором ячейку, в которой хотите поместить результат функции
  2. нажмите на пиктограмму «Вставить функцию» на панели формул:
  3. в появившемся окне Мастера функций выберите категорию «Определенные пользователем», затем в списке выделите название функции «ФИОВПадеже» и нажмите кнопку «ОК»:
  4. и далее в окне Аргументы функций заполните поля: в полях Фамилия, Имя и Отчество укажите ссылки на ячейки с соответствующими значениями, а в поле Падеж укажите число от 1 до 6 (номер падежа от именительного до предложного) и нажмите кнопку «ОК»:

    В результате в выделенной ячейке отобразится результат вычисления функции.

Вот еще несколько примеров ее использования:

Ситуации, когда работа функции может быть некорректной:

Несмотря на то, что ситуаций, когда работа функции может быть неудовлетворительной, ниже перечислено немало, вероятность столкновения с таким ФИО в практической работе достаточно мала, т.к. в 99,9% случаев фамилии, встречающиеся на территории России, склоняются по общим правилам.
Кроме того, следует заметить, что другие алгоритмы и программы также не могут гарантировать корректность результата в 100% случаев — русский язык слишком велик и могуч, чтобы быть описанным набором логических правил (смотрите ниже про влияние положения ударения в слове, происхождения фамилии, про зависимость написания женской формы фамилии от написания мужской формы и т.д.).

  • По правилам русского языка склонение мужских и женских иноязычных фамилий, оканчивающихся на «-а» и «-я», зависит от места ударения в слове и происхождения фамилии.
    Все фамилии, кончающиеся на неударное «-а» после согласных, склоняются: Сенека -> Сенеки, Петрарка -> Петрарки, Сметана -> Сметаны, Куросава -> Куросавы, Глинка -> Глинки, Окуджава -> Окуджавы и др. Склонение фамилий с ударным «-а» на конце зависит от ее происхождения: не склоняются фамилии французского происхождения: Дюмá, Дегá, Фермá, Петипá и т.д., фамилии иного происхождения (из славянских и восточных языков) склоняются: Митта -> Митты, Кваша -> Кваши, Сковорода -> Сковороды, Кочерга -> Кочерги, Хамза -> Хамзы и др.
    Аналогично, французские по происхождению фамилии с ударным «-я» на конце несклоняемы: Золя, Труайя . Все прочие фамилии на «-я» склоняемы: Головня -> Головни, Данелия -> Данилии, Берия -> Берии, Гойя -> Гойи .
    Поскольку программно определить положения ударения и происхождение фамилии невозможно, в алгоритме программы принято допущение, что все подобные фамилии склоняются по общим правилам. Поэтому французские фамилии с ударением на окончании обрабатываются программой некорректно: Дюма -> Дюмы, Золя -> Золи, Петипа -> Петипы .
  • Мужские фамилии, оканчивающиеся на «-ий», «-ый», «-ой», склоняются как прилагательные Горький -> Горького, Блаженный -> Блаженного, Броневой -> Броневого . Исключения составляют случаи, когда фамилия с таким окончанием — нарицательное существительное ( Козодой, Водопой, Гений, Сценарий ) либо иноязычна по происхождению ( Цой, Цхой, Чой ). Так как программно не определить, является ли фамилия подобным исключением, условно принято, что все фамилии с окончаниями «-ий», «-ый», «-ой» склоняются как прилагательные. В подавляющем большинстве случаяв это верно, однако в исключительных случаях с фамилиями-существительными результат функции будет ошибочным: Козодой Яков -> Козодого Якова, Гений Стефан -> Генего Стефана .
    Однако, в виде исключения в алгоритме учтено склонение фамилий с данными окончаниями и длиной менее 5 букв (преимущественно корейских по происхождению): Цой Виктор -> Цоя Виктора .
  • В ряде случаев корректное склонение женской фамилии, оканчивающейся на «-ина», «-ова», возможно только, если известно склонение соответствующей ей мужской фамилии: Жемчужина Людмила, Малина Светлана могут склоняться как в обычной форме: Жемчужина Людмила -> Жемчужиной Людмилы, Малина Светлана -> Малиной Светланы (если соответствующими мужскими фамилиями являются, например, Жемчужин Борис и Малин Олег), так и в форме существительного: Жемчужина Людмила -> Жемчужины Людмилы, Малина Светлана -> Малины Светланы (если мужские формы фамилии, например, Жемчужина Борис и Малина Олег).
    Учесть подобные нюансы в алгоритме невозможно, поэтому все женские фамилии функцией обрабатываются по единым правилам (как прилагательные), что в отдельных случаях может приводить к неверным результатам.
  • Похожая ситуация обстоит с мужскими и женскими фамилиями, оканчивающимися на «-ов(а)», «-ев(а)», «-ин(а)», которые омонимичны нарицательным существительным: Боров, Лев, Филин, Барин, Корова, Сова, Картина, Перина, Старина и т.д. ). Ни по каким формальным признакам программно установить идентичность фамилии и существительного нет возможности, поэтому склонение подобных фамилии по единым общим правилам приводит к некорректным результатам вида: Лев Павел -> Левым Павлом, Филин Сергей -> Филиным Сергеем, Корова Ксения -> Коровой Ксении, Сова Ольга -> Совой Ольги, Картина Алла -> Картиной Аллы .
  • Мужские фамилии, оканчивающиеся на мягкий знак, склоняются: Врубель Михаил -> Врубеля Михаила, Гоголь Николай -> Гоголя Николая и т.д. Однако при склонении окончания таких фамилий зависят от того, существительными какого рода — мужского, женского или среднего — они являются.
    Алгоритмически определить род существительного не представляется возможным, поэтому в тех случаях, когда мужская фамилия является существительным женского или среднего рода, функция будет работать некорректно: Сталь Иван -> Сталя Ивана, Полынь Виктор -> Полыня Виктора .
  • Образование творительного падежа фамилий, оканчивающихся на «-жа», «-ца», «-ча», «-ша», «-ща», зависит от ударения в слове: если это окончание является безударным, то при склонении оно меняется на «-ей»: Капица Петр -> Капицей Петром, Туча Федор -> Тучей Федором ; если же окончание удареное, оно заменяется на «-ой»: Кваша Игорь -> Квашой Игорем, Свеча Иван -> Свечой Иваном . Аналогичная ситуация с фамилиями, оканчивающимися на «-ец»: без ударения окончание меняется на «-ем»: Палец Виктор -> Пальцем Виктором ; под ударением — на «-ом»: Сосковец Олег -> Сосковцом Олегом .
    Как было сказано выше, определить положения ударения в слове программно нельзя, поэтому в алгоритме программы принято допущение, что в словах, оканчивающихся на «-жа», «-ца», «-ча», «-ша», «-ща», окончание безударное (таких слов больше), то есть творительный падеж всегда образуется окончанием «-ей». Напротив, в словах, оканчивающихся на «ец», принято, что окончание находится под ударением, то есть склонение будет с окончанием «-ом». Соответственно, в остальных случаях будут наблюдаться ошибки вида: Квашей Игорем, Свечей Иваном, Пальцом Виктором .
  • Согласно правилам русского языка первая часть двойной русской фамилии склоняется, если она сама по себе может употребляться как фамилия: творчество Мамина-Сибиряка, рассказ Салтыкова-Щедрина, опера Римского-Корсакова и т.д. В противном случае она не изменяется: картина Ван-Дейка, похождения Дон-Жуана, оруженосец Дон-Кихота и др. Так, например, в фамилии Семёнов-Тян-Шанский склоняется первая часть, но не вторая: труды Семёнова-Тян-Шанского .
    Опять же, определить, является ли составная часть фамилии самостоятельной, алгоритмически возможности нет, поэтому для работы принято допущение, что все части составной фамилии следует склонять (в большинстве случаев это так), что в ряде ситуаций приводит к ошибкам: Вана-Дейка, Дона-Кихота, Семёнова-Тяна-Шанского .
  • Иностранные фамилии, оканчивающиеся на «-ов» и «-ин» в творительном падеже меняют окончание на «-ом»: Бенджамином Франклином, Чарльзом Дарвином, Чарли Чаплином, Александром Грином . «Русские» же фамилии с аналогичными окончаниями заканчиваются на «-ым»: Ивановым, Гагариным, Фонвизиным и т.д. Несмотря на то, что перечисленные выше фамилии ( Франклин, Дарвин, Чаплин, Грин ) в виде исключений учтены в алгоритме, есть небольшая вероятность, что встретится какая-либо другая аналогичная иностранная фамилия — в таком случае результат функции будет некорректен.

Правила склонения фамилий и имен использованы в соответствии с разделами 13.1 и 13.2 работы Н. А. Еськовой «Трудности словоизменения существительных. Учебно-методические материалы к практическим занятиям по курсу «Язык современной печати» (Госкомитет печати СССР. Всесоюзный институт повышения квалификации работников печати. М., 1990).

Источник

Склонение фамилии, имени и отчества

Трюк, который мы рассмотрим в данном разделе, удобно применять при работе со списками ФИО. С его помощью можно быстро переводить требуемые ФИО в родительный или дательный падеж. Чтобы достичь подобного эффекта, следует воспользоваться макросом, код которого приведен в листинге 3.82 (данный код записывается в стандартном модуле).

Листинг 3.82. Склонение ФИО

Public Sub PossessiveCase()

‘ Склоняем ФИО в родительный падеж

Dim strName1 As String, strName2 As String, strName3 As

strName1 = dhGetName(ActiveCell, 1) ‘ Выделяем имя

strName2 = dhGetName(ActiveCell, 2) ‘ Выделяем фамилию

strName3 = dhGetName(ActiveCell, 3) ‘ Выделяем отчество

‘ Если в ячейке менее трех слов – закрытие процедуры

If strName1 = «» Or strName2 = «» Or strName3 = «» Then Exit

Cells(ActiveCell.Row, ActiveCell.Column) = dhPossessive( _

strName1, strName2, strName3)

Public Sub DativeCase()

Dim strName1 As String, strName2 As String, strName3 As

strName1 = dhGetName(ActiveCell, 1)

strName2 = dhGetName(ActiveCell, 2)

strName3 = dhGetName(ActiveCell, 3)

‘ Если в ячейке менее трех слов – закрытие процедуры

If Len(strName1) = 0 Or Len(strName2) = 0 Or Len(strName3) = 0 _

Cells(ActiveCell.Row, ActiveCell.Column) = dhDative( _

strName1, strName2, strName3)

Function dhPossessive(strName1 As String, strName2 As String, _

strName3 As String) As String

Dim fMan As Boolean

‘ Определяем, мужские ФИО или женские

fMan = (Right(strName3, 1) = «ч»)

‘ Склонение фамилии в родительный падеж

If Len(strName1) > 0 Then

‘ Склонение мужской фамилии

Select Case Right(strName1, 1)

dhPossess ive = strName1

dhPossessive = Mid(strName1, 1, Len(strName1) – 2) + «ого»

dhPossessive = strName1 + «а»

‘ Склонение женской фамилии

Select Case Right(strName1, 1)

Case «о», «и», «б», «в», «г», «д», «ж», «з», «к», «л», _

dhPossessive = Mid(strName1, 1, Len(strName1) – 2) & «ой»

dhPossessive = Mid(strName1, 1, Len(strName1) – 1) & «ой»

‘ Склонение имени в родительный падеж

If Len(strName2) > 0 Then

‘ Склонение мужского имени

Select Case Right(strName2, 1)

dhPossessive = dhPossessive & Mid(strName2, _

1, Len(strName2) – 1) & «я»

dhPossessive = dhPossessive & strName2 & «а»

‘ Склонение женского имени

Select Case Right(strName2, 1)

Select Case Mid(strName2, Len(strName2) – 1, 1)

dhPossessive = dhPossessive & Mid( _

strName2, 1, Len(strName2) – 1) & «и»

dhPossessive = dhPossessive & Mid(strName2, _

1, Len(strName2) – 1) & «ы»

If Mid(strName2, Len(strName2) – 1, 1) = «и» Then

dhPossessive = dhPossessive & Mid(strName2, _

1, Len(strName2) – 1) & «и»

dhPossessive = dhPossessive & Mid(strName2, _

1, Len(strName2) – 1) & «и»

dhPossessive = dhPossessive & Mid(strName2, _

1, Len(strName2) – 1) & «и»

dhPossessive = dhPossessive & strName2

‘ Склонение отчества в родительный падеж

If Len(strName3) > 0 Then

dhPossessive = dhPossessive & strName3 & «а»

dhPossessive = dhPossessive & Mid(strName3, 1, _

Len(strName3) – 1) & «ы»

Function dhDative(strName1 As String, strName2 As String, _

strName3 As String) As String

Dim fMan As Boolean

‘ Определяем, мужские ФИО или женские

fMan = (Right(strName3, 1) = «ч»)

‘ Склонение фамилии в дательный падеж

If Len(strName1) > 0 Then

‘ Склонение мужской фамилии

Select Case Right(strName1, 1)

dhDative = Mid(strName1, 1, Len(strName1) – 2) + «ому»

dhDative = strName1 + «у»

‘ Склонение женской фамилии

Select Case Right(strName1, 1)

dhDative = Mid(strName1, 1, Len(strName1) – 2)

dhDative = Mid(strName1, 1, Len(strName1) – 1)

‘ Склонение имени в дательный падеж

If Len(strName2) > 0 Then

‘Склонение мужского имени

Select Case Right(strName2, 1)

dhDative = dhDative & Mid(strName2, 1, _

Len(strName2) – 1) & «ю»

dhDative = dhDative & strName2 & «у»

‘ Склонение женского имени

Select Case Right(strName2, 1)

If Mid(strName2, Len(strName2) – 1, 1) = «и» Then

dhDative = dhDative & Mid(strName2, 1, _

Len(strName2) – 1) & «и»

dhDative = dhDative & Mid(strName2, 1, _

Len(strName2) – 1) & «е»

dhDative = dhDative & Mid(strName2, 1, _

Len(strName2) – 1) & «и»

dhDative = dhDative & strName2

‘ Склонение отчества в дательный падеж

If Len(strName3) > 0 Then

dhDative = dhDative & strName3 & «у»

dhDative = dhDative & Mid(strName3, 1, Len(strName3)

Function dhGetName(strString As String, intNum As Integer)

‘ Функция возвращает слово с номером intNum во входной строке _

Dim strTemp As String

Dim intWord As Integer

Dim intSpace As Integer

‘ Удаление пробелов по краям строки

‘ Просмотр строки (до слова с нужным номером)

For intWord = 1 To intNum – 1

‘ Поиск следующего пробела

If intSpace = 0 Then

‘ Строка strTemp теперь начинается со слова с номером

strTemp = Trim(Right(strTemp, Len(strTemp) – intSpace))

‘ Выделение нужного слова (по пробелу после него)

If intSpace = 0 Then

dhGetName = Trim(Left(strTemp, intSpace))

Чтобы ФИО отобразились в родительном падеже, следует установить курсор в ячейку с этими ФИО и запустить макрос PossessiveCase; в дательном падеже – макрос DativeCase (после написания кода эти макросы будут доступны в окне выбора макросов).

Внимание!

Для реализации трюка необходимо соблюдать условие – ячейка должна содержать не менее трех слов. В противном случае операция выполнена не будет.

Следует учитывать, что в ячейке сначала должна следовать фамилия, за ней – имя, и затем – отчество.

Данный макрос не всегда способен корректно обрабатывать сложные имена и фамилии.

Источник

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
Function PreditiveCase(sSurname$, Optional sName$, Optional sPatronymic$) As String
    ' Функция формирует предложный падеж из ФИО
    ' Параметры: sSurname - фамилия, sName - имя, sPatronymic - отчество
    ' © 2013 EducatedFool
   
    ' пол теперь определяется иначе:   что заканчивается на "вна" или "кызы" - то женщины, остальные - мужчины.
    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) - 2) & "им"
                    Case "ь": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ем"
                    Case "я": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ей"
                    Case "а": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ой"
                        If UBound(arrSurname) > 0 And i = 0 Then sRes = sSurnamePart
                    Case Else: sRes = sSurnamePart & "ым"
                End Select
 
                Select Case Right(sSurnamePart, 2)    ' добавлено, для редких фамилий
                    Case "ец":  sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "цем"
                        If LCase(sSurnamePart) Like "*[уеыаоэяиюё]ец" Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "цем"
                        If LCase(sSurnamePart) Like "*[!уеыаоэяиюё][!уеыаоэяиюё]ец" Then sRes = sSurnamePart & "ем"
                    Case "зе", "их", "ых": sRes = sSurnamePart
                    Case "ий", "ой": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "им"
                        If Len(sSurnamePart) <= 4 Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "я"
                        If Right(sSurnamePart, 3) = "чий" Then sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "им"
                    Case "уй": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "уем"
                Case "ич": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "чем"
 
     
           End Select
 
            Else    ' женские фамилии
                Select Case Right(sSurnamePart, 1)
                    Case "о", "е", "э", "и", "ы", "у", "ю", "б", "в", "г", "д", "ж", "з", "к", "л", "м", "н", "п", _
                         "р", "с", "т", "ф", "х", "ц", "ч", "ш", "щ", "ь", "й": sRes = sSurnamePart
                    Case "а": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ой"
                    Case "я": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "ей"
                    Case Else: sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 1) & "ой"
                End Select
 
                Select Case Right(sSurnamePart, 2)    ' добавлено, для редких фамилий
                    Case "ха": sRes = Mid(sSurnamePart, 1, Len(sSurnamePart) - 2) & "хой"
                    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
        PreditiveCase = Join(arrSurname, "-") & " "    ' соединяем части склоняемой фамилии обратно в одну строку
    End If
 
    If Len(sName) > 0 Then    '   Имя
        NameException$ = GetPreditiveException(sName)
        If Len(NameException$) Then    ' для имен-исключений
            PreditiveCase = PreditiveCase & NameException$
        Else    ' имя не найдено в списке исключений
            If bMaleSex Then
                Select Case Right(sName, 1)
                    Case "й", "ь": PreditiveCase = PreditiveCase & Mid(sName, 1, Len(sName) - 1) & "ем"
                    Case "а": PreditiveCase = PreditiveCase & Mid(sName, 1, Len(sName) - 1) & "ой"
                    Case "я": PreditiveCase = PreditiveCase & Mid(sName, 1, Len(sName) - 1) & "ем"
                    Case "о": PreditiveCase = PreditiveCase & sName
                    Case Else: PreditiveCase = PreditiveCase & sName & "ом"
                End Select
            Else
                Select Case Right(sName, 1)
                    Case "а": PreditiveCase = PreditiveCase & Mid(sName, 1, Len(sName) - 1) & "ой"
                    Case "я": PreditiveCase = PreditiveCase & Mid(sName, 1, Len(sName) - 1) & "ей"
                    Case Else: PreditiveCase = PreditiveCase & sName
                End Select
            End If
        End If
        PreditiveCase = PreditiveCase & " "
    End If
 
    If Len(sPatronymic) > 0 Then    '   Отчество
        If Right(sPatronymic, 4) = "оглы" Or Right(sPatronymic, 4) = "кызы" Then
            PreditiveCase = PreditiveCase & sPatronymic
        Else
            If bMaleSex Then
                PreditiveCase = PreditiveCase & sPatronymic & "ем"
            Else
                PreditiveCase = PreditiveCase & Mid(sPatronymic, 1, Len(sPatronymic) - 1) & "ой"
            End If
        End If
    End If
    PreditiveCase = Replace(PreditiveCase, "-", "- ")
    PreditiveCase = StrConv(PreditiveCase, vbProperCase)
    PreditiveCase = Replace(PreditiveCase, "- ", "-")
End Function
 
Function GetPreditiveException(ByVal txt$) As String    ' склонение имён-исключений
    Select Case txt$
        Case "Павел": GetPreditiveException = "Павлом"
        Case "Лев": GetPreditiveException = "Львом"
        Case "Пётр": GetPreditiveException = "Петра"
        Case "Любовь": GetPreditiveException = "Любовью"
 
            ' без изменения (не склоняются) - перечисляем через запятую
        Case "Али","Гиви","Бали","Бари": GetPreditiveException = txt$
    End Select
End Function
  • Перевод в именительный падеж в Excel
  • Перевод из начальной формы в другие падежи
  • Макросы склонения по падежам в Excel
    • Склонение существительных
    • Склонение прилагательных
    • Склонение чисел (имен числительных)
  • Склонение ФИО в Excel
    • Склонение ФИО в родительный падеж
    • Склонение ФИО в дательный падеж
    • Склонение ФИО в винительный падеж
    • Остальные падежи
  • Просклонять фразы целиком
    • Склонение списка услуг (пример)
    • Склонение должностей в Excel (пример)

Реализовать изменение падежей в экселе — одна из самых сложных задач для разработки, поскольку в русском языке масса правил склонения, окончаний, чередующихся гласных и прочих исключений из общих правил.

Обычная формула, которая сможет автоматически поменять падеж любого слова, попросту отсутствует, поскольку ограничения формул по длине просто не позволят учесть в ней все нюансы. Невозможно не то что сделать одну формулу для всех падежей, даже если вы гений Excel, вам не удастся сделать даже формулу для родительного падежа.

Тем более сложно представить себе бесплатное решение. Я разрабатывал алгоритм в своей надстройке с нуля и самостоятельно, опираясь на разные открытые источники данных по морфологии русского языка, и разработка заняла несколько месяцев, после чего я всё еще периодически произвожу улучшения своего алгоритма и исправление ошибок.

Надстройка !SEMTools может похвастать несколькими особенностями, выделяющими её на фоне других решений по морфологии в Excel. Например, она позволяет переводить слова в именительный падеж, а также изменять число и падеж составных фраз, не ломая их смысл.

Что ж, расскажу подробнее.

Перевод слов в Excel в именительный падеж — часть процесса лемматизации. Лемматизация в Excel также поддерживается моей надстройкой, но здесь речь не о ней, а об обратном процессе — склонении начальной формы в остальные.

Перевод из начальной формы в другие падежи

Периодически специалистам, чья деятельность связана с написанием большого количества текстов — SEO/PPC специалистам, контент-менеджерам, администраторам баз данных и каталогов, копирайтерам и т.д. — бывает нужна возможность просклонять слова по падежам.

Мечта таких специалистов (знаю, т.к. выполнял похожие задачи) — поменять падеж ФИО, ключевых слов или товарных позиций прямо в Excel с помощью простых функций или процедур.

И надстройка !SEMTools дает такую возможность!

Надстройка совместима с Excel 2010, 2013, 2016, 2019, 2021 и Excel 365 на ОС Windows.

Процедуры можно потестировать в бесплатной версии, но присутствует ограничение — обрабатываются только часть исходных данных, треть данных заменяется дисклеймером «Доступно в полной версии».

Макросы склонения по падежам в Excel

Полная версия надстройки обрабатывает 100% данных. Процедуры можно вызывать с помощью меню «Изменить слова» в группе «ИЗМЕНИТЬ».

процедуры склонения по падежам в надстройке для Excel !SEMTools

Для корректной работы слова должны быть в начальной форме — именительном падеже.

Посмотрите видео демонстрацию работы процедур ниже:

ВАЖНО: процедуры склонения не знают, какие части речи им дали на вход, и смотрят только на окончания, склоняя все слова в ячейке как существительные или прилагательные в именительном падеже. Исключение – процедуры склонения фраз.

Склонение существительных

Число Доступные словоформы для склонения
Единственное Единственное число: родительный, дательный, винительный, творительный, предложный
Множественное число: именительный, родительный, дательный, винительный, творительный, предложный
Множественное Родительный, дательный, винительный, творительный, предложный — любой вариант

Объяснение к таблице ниже: если исходная словоформа в именительном падеже множественного числа, из нее можно произвести только падежи множественного. Чтобы получить словоформы единственного числа, потребуется сначала преобразовать слова в их леммы (именительный падеж единственного числа) с помощью процедуры лемматизации. И уже после этого склонять в любые другие.

Очень хочется довести функционал до совершенства, но склонение существительных практически не поддается простой алгоритмизации – есть десятки правил и сотни исключений из них.

Склонение прилагательных

Аналогично склонению существительных, надстройка может генерировать любые словоформы для леммы

Форма Отвечает на вопрос Доступные словоформы для склонения
Лемма (единственное число, именительный падеж, мужской род) Какой? Все остальные из 36 словоформ, кроме исходной:
3 рода (мужской, женский, средний) *
2 числа (единственное, множественное) *
6 падежей (именительный, родительный, дательный, винительный, творительный, предложный)
Именительный падеж, женский род Какая? 11 падежей женского рода:
Единственное число: родительный, дательный, винительный, творительный, предложный
Множественное число: именительный, родительный, дательный, винительный, творительный, предложный
Именительный падеж, средний род Какое? 11 падежей среднего рода:
Единственное число: родительный, дательный, винительный, творительный, предложный
Множественное число: именительный, родительный, дательный, винительный, творительный, предложный

Склонение чисел (имен числительных)

Числительные при склонении меняют не только окончания, но и меняются в середине. Алгоритм разработки решения, которое учитывало бы все вариации, довольно сложен и пестрит множеством условий. Надстройка решает и эту задачу. Особенно здорово функции выглядят в сочетании с функционалом число прописью, смотрите пример:

На примере ниже показано склонение обычных числительных. Используется макрос склонения существительных в единственном числе. При этом, если числительные созвучны с прилагательными (например, «тридцать четвёртая»), нужно использовать макросы склонения прилагательных.

число прописью и склонение чисел

Склонение числительных в Excel

Склонение ФИО в Excel

Склонение ФИО отличается от обычного склонения слов по падежам и имеет ряд особенностей:

  • Склонение фамилий зависит от рода имени-отчества — армянские фамилии и фамилии, созвучные с нарицательными существительными, не склоняются для женщин (Абрамян Аревик Альбертовны);
  • При этом они склоняются для мужчин (Хачатуряна Артура Сергеевича);
  • Фамилии склоняются как прилагательные, но в некоторых падежах — иначе
  • Есть ряд исключений в склонении женских имен, например, Любовь — Любови (а не Любви);
  • Есть огромное количество несклоняемых мужских и женских имен, заканчивающихся на те же сочетания букв, что и склоняемые (Эрик склоняется, Аревик — нет);
  • И даже есть имена (например, Адель), являющиеся одновременно и мужскими и женскими, и склоняющиеся по-разному в зависимости от этого.

Реализовать функцию или макрос, которые бы идеально обрабатывали эти кейсы, невероятно сложно. Но все эти проблемы были решены при разработке специальных макросов склонения фамилий-имен-отчеств в !SEMTools.

Корректность работы была проверена на базе в 350.000 ФИО. Для корректной работы список ФИО должен содержать как фамилии, так имена и отчества в их полных формах в именительном падеже. Ниже примеры использования:

Склонение ФИО в родительный падеж

Когда нужно написать в шапке документа, от кого он, когда известна только начальная форма. Пример ниже:

Склонение ФИО в родительном падеже

Склонение ФИО в родительном падеже

Склонение ФИО в дательный падеж

Частая история, когда нужно кому-нибудь что-нибудь выплатить. Полезная сопутствующая функция — сумма прописью с копейками в Excel.

Склонение ФИО в дательном падеже

Склонение ФИО в дательном падеже

Склонение ФИО в винительный падеж

Данная функция понадобится, когда нужно кого-нибудь наградить, перевести в другой отдел или назначить на новую должность.

Склонение ФИО в винительном падеже

Склонение ФИО в винительном падеже

Остальные падежи

Перевод ФИО из именительного в творительный и предложный падежи происходят абсолютно по тому же сценарию:

  • выделяем список,
  • выбираем нужный падеж,
  • получаем результат. Просто и быстро.

Просклонять фразы целиком

Эта новая опция появилась совсем недавно, и по праву делает !SEMTools лучшим решением для склонения слов по падежам, доступным на текущий момент. Ниже основные особенности инструмента, которые позволяют так сказать:

  • Склоняются по падежам и числам все слова фразы — прилагательные, существительные, местоимения и т.д.;
  • Род существительных и прилагательных сохраняется;
  • Слова склоняются в любом регистре и регистр слов сохраняется (3 варианта – нижний, первая буква заглавная, верхний);
  • Надстройка понимает контекст, в котором находится слово, и выбирает, склонять ли его в зависимости от этого (просклоняет «дверной проём», но не будет склонять «с дверной ручкой»);
  • Аббревиатуры не склоняются, за некоторыми общеизвестными исключениями.

Есть еще ряд технических тонкостей, но в итоге все вышеперечисленное позволяет идеально склонять тысячи уникальных фраз без необходимости серьезных правок после.

Кому в первую очередь подойдет инструмент? Конечно же, вебмастерам и копирайтерам.

Склонение списка услуг (пример)

Списки товаров или услуг зачастую состоят далеко не из одного слова, и быстро склонять их для использования в текстах — сэкономить десятки часов времени на наполнение сайта полезным и при этом читабельным контентом. Смотрите пример со склонением услуг автосервиса:

Склонение списка услуг по падежам

Склонение списка услуг по падежам в Excel в пару кликов

Склонение должностей в Excel (пример)

Будет полезно офисным сотрудникам (делопроизводителям, бухгалтерам и др.). Здесь инструмент пригодится для склонения должностей, званий, специальностей и т.д. Смотрите пример со склонением всех ВУС (военно-учетных специальностей):

Хотите попробовать, как будет обработан ваш список фраз?
Установите !SEMTools и попробуйте воспользоваться функционалом!

Понравилась статья? Поделить с друзьями:
  • Vba excel скачивание файлов
  • Vba excel скачать бесплатно с активатором
  • Vba excel системная дата
  • Vba excel символы справа
  • Vba excel символы подстановки