Возникла давеча необходимость перегнать в Excel'е ряд строк в транслит. Функции такой в Excel'е конечно же нет.
Яндекс выдал ряд простых формул, но там не учитывался регистр символов. А регистр был нужен.
Пришлось писать самому.
Итак, под катом много кода для реализации транслита в Microsoft Excel и несколько примеров с криншотами на тему как вставить функцию в личную книгу макросов.
Часть первая. Код функции
- Public Function Translit(ByVal txt As String) As String
- iRussianLower$ = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
- iTranslit = Array("", _
- "a", "b", "v", _
- "g", "d", "e", _
- "yo", "zh", "z", _
- "i", "i", "k", _
- "l", "m", "n", _
- "o", "p", "r", _
- "s", "t", "u", _
- "f", "kh", "c", _
- "ch", "sh", "zch", _
- "''", "'y", "'", _
- "eh", "yu", "ya")
- Dim result$, char$, newChar$, charIndex%, nextChar$, lastChar$
- For i% = 1 To Len(txt)
- char = Mid(txt, i, 1)
- charIndex = InStr(1, iRussianLower, char, vbTextCompare)
- If (charIndex >= 1) Then
- newChar = iTranslit(charIndex)
- Else
- newChar = char
- End If
- ' если текущий символ прописной
- If (Asc(char) >= 132 And Asc(char) <= 223) Then
- ' если это первый символ
- If i = 1 Then
- ' если последующий прописной
- nextChar = Mid(txt, i + 1, 1)
- If (Asc(nextChar) >= 132 And Asc(nextChar) <= 223) Then
- result = result & StrConv(newChar, vbUpperCase)
- ' если последующий строчный
- ElseIf (Asc(nextChar) >= 224 And Asc(nextChar) <= 255) Then
- result = result & StrConv(newChar, vbProperCase)
- End If
- ' если это не первый и не последний символ
- ElseIf i > 1 And i <> Len(txt) Then
- nextChar = Mid(txt, i + 1, 1)
- lastChar = Mid(txt, i - 1, 1)
- ' если околостоящие прописные
- If ((Asc(lastChar) >= 132 And Asc(lastChar) <= 223)) _
- Or (Asc(nextChar) >= 132 And Asc(nextChar) <= 223) Then
- result = result & StrConv(newChar, vbUpperCase)
- ' иначе
- Else
- result = result & StrConv(newChar, vbProperCase)
- End If
- Else
- lastChar = Mid(txt, i - 1, 1)
- ' если предыдущий символ прописной
- If (Asc(lastChar) >= 132 And Asc(lastChar) <= 223) Then
- result = result & StrConv(newChar, vbProperCase)
- ' иначе
- Else
- result = result & StrConv(newChar, vbUpperCase)
- End If
- End If
- ' если текущий символ строчный
- ElseIf (Asc(char) >= 224 And Asc(char) <= 255) Then
- result = result & iTranslit(charIndex)
- ' если текущий символ не буква русского алфавита
- Else
- result = result & char
- End If
- Next i
- Translit$ = result
- End Function
Вот такая "нехитрая" формула позволяет получать такие строки:
Если вам не нравится порядок перевода (какие символы должны подставляться вместо "Ч", "Щ" и т.д.), то вы можете сами настроить перевод. Вам всего лишь надо заменить нужные символы в массиве iTranslit. Символы замены в нем располагаются по порядку русского алфавита.
Но сама формула вам ничего не даст. Ее необходимо поместить в Excel, чтобы ею можно было пользоваться.
Часть вторая. Внедрение функции в Excel
Вариант №1. Поместить функцию в конкретный файл
1) Заходим в редактор Visual Basic (Alt+F11)
2) Слева в обозревателе проектов найдите нужный файл и добавьте к нему Модуль
3) После добавления откроется чистый лист модуля. Скопируйте туда код.
4) Теперь функция будет доступна внутри вашего файла
Какие минусы у этого варианта размещения: функция будет работать только в этом файле. Использовать ее в других файлах не получится.
ЗЫ: Если у вас MS Office 2007, то не забудьте присохранении выбрать тип файла с поддержкой макросов.
Вариант №2. Поместить функцию в личную книгу макросов
Этот вариант предпочтительней, т.к. помещенную в личную книгу макросов функцию можно будет использовать в любом файле Excel на вашем компьютере.
1) Сначала надо создать личную книгу макросов. Для этого необходимо записать простенький макрос, Excel сам создаст книгу по требованию
2) Заходим в редактор Visual Basic (Alt+F11)
3) Слева в обозревателе проектов найдите PERSONAL.XLSB и дважды кликните по имеющемуся у него модулю Module1
4) Замените ненужный нам код макроса на код функции
5) Сохраните изменения, кдикнув по кнопке сохранения в меню. Теперь функция будет доступна вам из любого файла Excel на вашем компьютере
6) Функцию можно использовать, набрав в ячейке ее имя, указав перед ним личную книгу макросов
7) Еще проще эту функцию найти через вставку функции, выбрав в качестве категории пункт "Определенные пользователем"
Популярность: 3%
Связанные записи
Распечатать запись







Спасибо большое! очень помогла программа!
[...] Эту функцию можно добавить в нужную книгу или в личную книгу макросов (во втором случае вы сможете ее использовать во всех книгах Excel). Как вставить функцию в личную книгу макросов можете узнать здесь. [...]
Сижу перебиваю в транслит ручками огромный массив и думаю «неужели никто еще не придумал UDF для такой распространенной темы»
и ваш блог первым выпадает в яндексе 
Спасибо! сэкономит мне кучу времени!
Функция работает немного не корректно если все слово (исходное) написано большими буквами и последняя буква транслитерируется не в одну а в две латинские буквы. Результат: в латинице все буквы большие а последняя маленькая.
Пример транслитерации украинского названия города Запорожье: ЗАПОРІЖЖЯ – ZAPORІZHZHYa. Как видим, последняя буква Я переходит в две буквы Ya хотя правильно было бы YA.
Спасибо. Огромное спасибо за статью «Внедрение функции в Excel». Неделю мучился – теперь я счастлив ))
Еще ошибка: Если строка начинается заглавной буквой, а за ней следует пробел, функция совсем отбрасывает первую букву. «В долине» -> » doline»
Чтобы работало, можно 30ю строчку
If (Asc(nextChar) >= 132 And Asc(nextChar) = 132 And Asc(nextChar) <= 223) Or Asc(nextChar) = 32 Then
Public Function ToTranslit$(iStr$)
iRussian = Array(»", _
«ЪЕ», «ЪЁ», «ЪИ», «ЪЮ», «ЪЯ», _
«ЬЕ», «ЬЁ», «ЬИ», «ЬЮ», «ЬЯ», _
«ъе», «ъё», «ъи», «ъю», «ъя», _
«ье», «ьё», «ьи», «ью», «ья», _
_
«А», «Б», «В», «Г», «Д», «Е», _
«Ё», «Ж», «З», «И», «Й», «К», _
«Л», «М», «Н», «О», «П», «Р», _
«С», «Т», «У», «Ф», «Х», «Ц», _
«Ч», «Ш», «Щ», «Ъ», «Ы», «Ь», _
«Э», «Ю», «Я», _
_
«а», «б», «в», «г», «д», «е», _
«ё», «ж», «з», «и», «й», «к», _
«л», «м», «н», «о», «п», «р», _
«с», «т», «у», «ф», «х», «ц», _
«ч», «ш», «щ», «ъ», «ы», «ь», _
«э», «ю», «я»)
iTranslit = Array(»", _
«Ye», «Yo», «Yi», «Yu», «Ya», _
«Iye», «Iyo», «Iyi», «Iyu», «Iya», _
«ye», «yo», «yi», «yu», «ya», _
«iye», «iyo», «iyi», «iyu», «iya», _
_
«A», «B», «V», «G», «D», «E», _
«E», «Zh», «Z», «I», «Y», «K», _
«L», «M», «N», «O», «P», «R», _
«S», «T», «U», «F», «Kh», «Ts», _
«Ch», «Sh», «Sch», «‘», «Y», «», _
«E», «Yu», «Ya», _
_
«a», «b», «v», «g», «d», «e», _
«e», «zh», «z», «i», «y», «k», _
«l», «m», «n», «o», «p», «r», _
«s», «t», «u», «f», «kh», «ts», _
«ch», «sh», «sch», «‘», «y», «», _
«e», «yu», «ya»)
For iCount% = 1 To 86
iStr$ = Replace(iStr$, iRussian(iCount%), iTranslit(iCount%), , , vbBinaryCompare)
Next
ToTranslit$ = iStr$
End Function
Нижайше благодарю, супер-прога!!!!
Спасибо! Работает как надо. Еще бы знать как заставить формулу менять пробел на нижнее подчеркивание, было бы вовсе чудесно.
Супер!!! Спасибо
А что нужно сделать чтобы при сочетании «ый»
перед «й» ставился пробел?
Ещё раз спасибо
в целом по скрипту из «Части первой» мне подход понравился, пришлось только допилить баги:
- ошибка транслитерации если исходная строка состоит только из одной заглавной кириллической буквы;
- некорректная работа при скрипта при если исходный текст имеет форму: [] – отсутствует транслитерация первого символа.
В остальном браво и огромное спасибо, мне как человеку незнакомому с VB, этот скрипт очень помог.