Макрос для excel фио

Результат работы VBA-функции Инициалы

Функция получает в качестве параметра текстовую строку с виде «Фамилия имя отчество», и обрезает имя и отчество, оставляя лишь инициалы — в виде «Фамилия И. О.»

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

Автор функции: Андрей Энтелис

Описание особенностей функции — на форуме: programmersforum.ru/showpost.php?p=757147&postcount=6

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

Кроме того, разные органы (в разное время) придерживались (-ются) разных взглядов на то как в том или ином случае должны выглядеть инициалы.
Одно дело документы УФМС — другое, регистраторы ЦБ, третье — оформление коммерческих документов.
Так, часть служб требует что бы 2-3 сложные короткие имена Юго-Восточной Азии не сокращались. А часть нет.

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

У многих возможно возникает вопрос: А откуда берётся весь этот зоопарк и зачем это всё нужно? Как правило, все эти Доны Педро — иностранные граждане получающие Российский паспорт на основании ранее выданных вне юрисдикции РФ документов. Ситуации правовые бывают разные. И достаточно часто в новый Российский паспорт пишется вариант транслитерации на кириллицу с языка носителя.
Российские паспорта с -оглы и -кызы выдаются сейчас в Татарстане. Мне встретился клиент которого по паспорту 2007 г. звали Мустафа Олег оглы…

Option Compare Text
 
Public Function Инициалы(s As String, Optional ToLeft 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 ToLeft 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
  • 57130 просмотров

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

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

Здравствуйте!

Очень часто приходится иметь дело с преобразованием Фамилий Имен и Отчеств в Фамилию и инициалы. Использую следующую формулу:

ЛЕВСИМВ(A2;НАЙТИ(СИМВОЛ(32);A2))&ЕСЛИ(ДЛСТР(A2)-ДЛСТР(ПОДСТАВИТЬ(A2;СИМВОЛ(32);»»))=1;ПСТР(A2;НАЙТИ(СИМВОЛ(32);A2)+1;1);ПСТР(A2;НАЙТИ(СИМВОЛ(32);A2)+1;1)&».»&ПСТР(A2;НАЙТИ(СИМВОЛ(32);A2;НАЙТИ(СИМВОЛ(32);A2)+1)+1;1))&».»

Теперь вопрос:

Можно ли вместо формулы делать это преобразование макросом? Без необходимости создания нового столбца с формулой, преобразования формул в значения, удаления исходного столбца и т.д. и т.п.

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

P.S.: Недавно кажется нашел подходящий для этого дела макрос с функцией filtr_FIO, но в ячейках где нет Отчества, он почему-то не работает. Файл с макросом прилагаю, может получится его использовать для решения вышеуказанной задачи.

Помогите, пожалуйста…

dmr12345

0 / 0 / 0

Регистрация: 15.03.2016

Сообщений: 105

1

23.05.2016, 12:14. Показов 5536. Ответов 9

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Помогите сделать макрос, вот макрос в единичной разбивке ФИО, а нужно допустим большой диапазон ячеек

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub РазделениеФИО()
    ФИО = Cells(3, 2)
    ПервыйПробел = InStr(ФИО, " ")
    ВторойПробел = InStr(ПервыйПробел + 1, ФИО, " ")
    Фамилия = Left(ФИО, ПервыйПробел - 1)
    Имя = Mid(ФИО, ПервыйПробел + 1, ВторойПробел - ПервыйПробел - 1)
    Отчество = Mid(ФИО, ВторойПробел + 1)
    
    Cells(3, 3) = Фамилия
    Cells(3, 4) = Имя
    Cells(3, 5) = Отчество
    
   
End Sub



0



toiai

3217 / 966 / 223

Регистрация: 29.05.2010

Сообщений: 2,085

23.05.2016, 12:25

2

Допустим в ячейке (1,2) находится значение ФИО, тогда

Visual Basic
1
Cells(2,2).resize(1,3)=split(cells(1,2))

Теперь вставь в цикл…



0



0 / 0 / 0

Регистрация: 15.03.2016

Сообщений: 105

23.05.2016, 13:15

 [ТС]

3

Можно подробнее с полным кодом, если кол-во Фио всегда разное



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

23.05.2016, 14:37

4

Цитата
Сообщение от dmr12345
Посмотреть сообщение

если кол-во Фио всегда разное

тогда можно делать например так:

Visual Basic
1
Columns(1).TextToColumns Space:=True

Это полный код, для всего первого столбца.



0



SegaPhantom

2 / 2 / 1

Регистрация: 27.01.2015

Сообщений: 7

24.06.2016, 11:50

5

Пример требуемого кода:
(впрочем, Trim можно и опустить, в моем коде он присутствует, из-за необходимости обработки некорректных данных, скопированных из Word)

Visual Basic
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
' процедура деления строки Фамилия_Имя_Отчество на составляющие
Sub Разделение_ФИО()
    EndRow = Sheets(1).Cells(Rows.Count, 2).End(xlUp).Row
    For n = 2 To EndRow
        If Len(Trim(Sheets(1).Cells(n, 2))) <= 1 Then
            Sheets(2).Cells(n, 2) = Trim(Sheets(1).Cells(n, 2))
            Sheets(2).Cells(n, 3) = ""
            Sheets(2).Cells(n, 4) = ""
        Else
            Str1 = Trim(Sheets(1).Cells(n, 2))
            Pos1 = InStr(1, Str1, " ")
            Pos2 = InStr(Pos1 + 1, Str1, " ")
            strFamily = Trim(Left(Str1, Pos1))
            If Pos2 = 0 Then
                strSurname = "" ' есть люди не имеющие отчества :)
            Else
                strSurname = Trim(Right(Str1, Len(Str1) - Pos2))
            End If
            strName = Trim(Right(Left(Str1, Len(Str1) - Len(strSurname)), Len(Str1) - Len(strFamily) - Len(strSurname) - 1))
            
            Sheets(2).Cells(n, 2) = strFamily
            Sheets(2).Cells(n, 3) = strName
            Sheets(2).Cells(n, 4) = strSurname
        End If
    Next n
    
End Sub



0



Svsh2015

132 / 108 / 22

Регистрация: 23.06.2015

Сообщений: 339

24.06.2016, 14:00

6

добрый день,еще вариант макроса,кнопки example и очистка

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub example()
    Dim z, z1, i&, j&: z = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
    ReDim z1(1 To UBound(z), 1 To 3)
  With CreateObject("VBScript.RegExp"): .Global = True: .IgnoreCase = True
    .Pattern = "(?:[^а-яё]|^)[а-яё]+(?=[^а-яё]|$)"
    For i = 1 To UBound(z)
      For j = 0 To 2
        z1(i, j + 1) = .Execute(z(i, 1))(j)
     Next j, i
 End With
   Range("B1").Resize(UBound(z1), 3).Value = z1
End Sub

Вложения

Тип файла: xls example_24_06_2016_cbr_fio1.xls (44.5 Кб, 24 просмотров)



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

24.06.2016, 15:06

7

Svsh2015, код

Visual Basic
1
2
3
Sub tt()
Columns(1).TextToColumns Space:=True
End Sub

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



0



132 / 108 / 22

Регистрация: 23.06.2015

Сообщений: 339

24.06.2016, 15:33

8

добрый день,Hugo121,Ваш код смотрел также,как и всех участников обсуждения.Не нашел файл-примера создателя темы(как ему надо данные на выходе).



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

24.06.2016, 15:35

9

Ну так ясно дело — что без примера коды писать…
Может у dmr12345 там вообще нет ни одного обычного пробела, сплошь неразрывные… Ктож знает калификацию dmr12345 …



0



Svsh2015

132 / 108 / 22

Регистрация: 23.06.2015

Сообщений: 339

24.06.2016, 17:13

10

добавил,вариант с кнопкой example1,может так больше подойдет создателю темы,судя по его коду

Visual Basic
1
2
3
4
5
6
7
8
9
 Sub example1()
    Dim z, z1, i&, j&: z = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
    ReDim z1(1 To UBound(z), 1 To 3)
    For i = 1 To UBound(z)
      For j = 0 To 2
        z1(i, j + 1) = Split(z(i, 1))(j)
     Next j, i
   Range("B1").Resize(UBound(z1), 3).Value = z1
End Sub

Вложения

Тип файла: xls example_24_06_2016_cbr_fio2.xls (45.5 Кб, 37 просмотров)



0



Фамилия и инициалы из ФИО макросом

bosika

Дата: Среда, 30.01.2019, 20:32 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 95


Репутация:

0

±

Замечаний:
0% ±


Excel 2010, 2013, 2016

Очередной раз прошу помощи у ГУРУ. Есть некая база данных сотрудников в Excel. В столбцах В-D Фамилия, имя и отчество соответственно в 3-х ячейках. В столбце Е — формулой фамилия и инициалы и при установки курсора в ячейку столбце Е в строке формулы, отображается формула. Возможно ли макросом выводить данные в столбец Е. Заранее спасибо за помощь.

К сообщению приложен файл:

___.xlsx
(9.7 Kb)


Начинающий. Много и долго не пинать. Больно однако.

 

Ответить

Pelena

Дата: Среда, 30.01.2019, 21:18 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

А какова цель? Если просто избавиться от формулы, то Копировать-Вставить как значения не подойдёт?


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Karataev

Дата: Среда, 30.01.2019, 22:20 |
Сообщение № 3

Группа: Проверенные

Ранг: Старожил

Сообщений: 1330


Репутация:

528

±

Замечаний:
0% ±


Excel


Киви-кошелек: 9166309108

 

Ответить

bosika

Дата: Четверг, 31.01.2019, 06:37 |
Сообщение № 4

Группа: Пользователи

Ранг: Участник

Сообщений: 95


Репутация:

0

±

Замечаний:
0% ±


Excel 2010, 2013, 2016

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


Начинающий. Много и долго не пинать. Больно однако.

Сообщение отредактировал bosikaЧетверг, 31.01.2019, 12:20

 

Ответить

bosika

Дата: Четверг, 31.01.2019, 06:52 |
Сообщение № 5

Группа: Пользователи

Ранг: Участник

Сообщений: 95


Репутация:

0

±

Замечаний:
0% ±


Excel 2010, 2013, 2016

Karataev, Спасибо большое , ругается на строчку
[vba]

Код

lr = Cells(Rows.Count, «B»).End(xlUp).row

[/vba]


Начинающий. Много и долго не пинать. Больно однако.

Сообщение отредактировал bosikaЧетверг, 31.01.2019, 12:21

 

Ответить

bosika

Дата: Четверг, 31.01.2019, 06:55 |
Сообщение № 6

Группа: Пользователи

Ранг: Участник

Сообщений: 95


Репутация:

0

±

Замечаний:
0% ±


Excel 2010, 2013, 2016

Karataev, Может библиотеку нужно какую то подключить?


Начинающий. Много и долго не пинать. Больно однако.

 

Ответить

Pelena

Дата: Четверг, 31.01.2019, 09:05 |
Сообщение № 7

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

при выполнении макроса вместо фамилий вставляется #ссылка

вот я и говорю, что надо просто вставлять как значения.

И оформите код тегами с помощью кнопки # в режиме правки поста


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

bosika

Дата: Четверг, 31.01.2019, 09:14 |
Сообщение № 8

Группа: Пользователи

Ранг: Участник

Сообщений: 95


Репутация:

0

±

Замечаний:
0% ±


Excel 2010, 2013, 2016

Karataev, не могу в личку Вам сообщение отправить.
Я файл делал дома оф. 2016, сегодня сделал на работе аналогичный в оф. 2013, прописал код и выдал ошибку. Выделил строку желтым, 1004 еще ошибка. Руками набирал, не копировал, т.к. на работе на компе нет интернета (работа такая).


Начинающий. Много и долго не пинать. Больно однако.

 

Ответить

bosika

Дата: Четверг, 31.01.2019, 11:03 |
Сообщение № 9

Группа: Пользователи

Ранг: Участник

Сообщений: 95


Репутация:

0

±

Замечаний:
0% ±


Excel 2010, 2013, 2016

Pelena, да, чтоб на другой лист разносилось макросом значением из ячейки, а не формулой.


Начинающий. Много и долго не пинать. Больно однако.

 

Ответить

bosika

Дата: Четверг, 31.01.2019, 11:16 |
Сообщение № 10

Группа: Пользователи

Ранг: Участник

Сообщений: 95


Репутация:

0

±

Замечаний:
0% ±


Excel 2010, 2013, 2016

Karataev, Спасибо большое. Заработало!

Админов прошу закрыть тему.


Начинающий. Много и долго не пинать. Больно однако.

 

Ответить

Евген1313

Дата: Пятница, 01.10.2021, 07:27 |
Сообщение № 11

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Здравствуйте, уважаемые форумчане! Есть макрос сокращения фамилии, имени и отчества в фамилию и инициалы, однако если вызывать макрос кнопкой с другого листа, то значения не вставляются в исходную таблицу. Подскажите, пожалуйста, что необходимо исправить?

 

Ответить

Pelena

Дата: Пятница, 01.10.2021, 07:43 |
Сообщение № 12

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Как-то так

К сообщению приложен файл:

7339336.xlsm
(21.7 Kb)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Евген1313

Дата: Воскресенье, 03.10.2021, 09:53 |
Сообщение № 13

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Pelena, спасибо!

 

Ответить

С помощью регулярок (надо подключить библиотеку к проекту, чтобы работало):
Tools – References…
☑ Microsoft VBScript Regular Expression
Код:

Public Function getShortName(strText As Variant) As String
    Dim myRegExp As New RegExp
    Dim matches As MatchCollection

    myRegExp.Global = True
    myRegExp.IgnoreCase = True
    myRegExp.Pattern = "(S+)s+(S)S*s+(S)S*"
    Set matches = myRegExp.Execute(strText)
    
    getShortName = matches(0).SubMatches(0) & " " & matches(0).SubMatches(1) & "." & matches(0).SubMatches(2) & "."
End Function

Можно через Split(), даже покороче получится код, хотя на двойных пробелах споткнётся.

Function getShortName(strText As String) As String
    Dim a
    a = Split(strText, " ")    
    getShortName = a(0) & " " & Left(a(1), 1) & "." & Left(a(2), 1) & "."
End Function

А можно вообще формулой сделать — отталкивайтесь от поиска текста(пробелов)

Понравилась статья? Поделить с друзьями:
  • Макрос для excel транслит
  • Макрос для excel текущей даты
  • Макрос для excel сумма прописью с копейками
  • Макрос для excel сообщение
  • Макрос для excel скрыть столбец