Функция получает в качестве параметра текстовую строку с виде «Фамилия имя отчество», и обрезает имя и отчество, оставляя лишь инициалы — в виде «Фамилия И. О.» Данную функцию можно использовать как UDF (определённые пользователем функции) в ячейках листа Excel. Автор функции: Андрей Энтелис Описание особенностей функции — на форуме: programmersforum.ru/showpost.php?p=757147&postcount=6
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
Не получается применить макрос? Не удаётся изменить код под свои нужды? Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать. |
Здравствуйте!
Очень часто приходится иметь дело с преобразованием Фамилий Имен и Отчеств в Фамилию и инициалы. Использую следующую формулу:
ЛЕВСИМВ(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 Метки нет (Все метки)
Помогите сделать макрос, вот макрос в единичной разбивке ФИО, а нужно допустим большой диапазон ячеек
0 |
toiai 3217 / 966 / 223 Регистрация: 29.05.2010 Сообщений: 2,085 |
||||
23.05.2016, 12:25 |
2 |
|||
Допустим в ячейке (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 |
|||
если кол-во Фио всегда разное тогда можно делать например так:
Это полный код, для всего первого столбца.
0 |
SegaPhantom 2 / 2 / 1 Регистрация: 27.01.2015 Сообщений: 7 |
||||
24.06.2016, 11:50 |
5 |
|||
Пример требуемого кода:
0 |
Svsh2015 132 / 108 / 22 Регистрация: 23.06.2015 Сообщений: 339 |
||||||
24.06.2016, 14:00 |
6 |
|||||
добрый день,еще вариант макроса,кнопки example и очистка
Вложения
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
24.06.2016, 15:06 |
7 |
|||
Svsh2015, код
делает почти тоже самое, только по месту, а не рядом.
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 |
Ну так ясно дело — что без примера коды писать…
0 |
Svsh2015 132 / 108 / 22 Регистрация: 23.06.2015 Сообщений: 339 |
||||||
24.06.2016, 17:13 |
10 |
|||||
добавил,вариант с кнопкой example1,может так больше подойдет создателю темы,судя по его коду
Вложения
0 |
Фамилия и инициалы из ФИО макросом |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
С помощью регулярок (надо подключить библиотеку к проекту, чтобы работало):
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
А можно вообще формулой сделать — отталкивайтесь от поиска текста(пробелов)