Транслит
Если Вам часто приходится переводить кириллицу в транслит (а попробуйте-ка сделать это для фамилии "Кржижановский", например), то эта функция - для Вас.
Откройте редактор Visual Basic (Alt+F11), вставьте через меню новый пустой программный модуль (Insert - Module) и скопируйте туда текст этой функции:
Function Translit(Txt As String) As String Dim Rus As Variant Rus = Array("а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", _ "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", _ "щ", "ъ", "ы", "ь", "э", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", _ "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _ "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я") Dim Eng As Variant Eng = Array("a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "j", _ "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", "JO", "ZH", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", _ "S", "T", "U", "F", "KH", "TS", "CH", "SH", "SCH", "''", "Y", "'", "E", "YU", "YA") For I = 1 To Len(Txt) с = Mid(Txt, I, 1) flag = 0 For J = 0 To 65 If Rus(J) = с Then outchr = Eng(J) flag = 1 Exit For End If Next J If flag Then outstr = outstr & outchr Else outstr = outstr & с Next I Translit = outstr End Function
Теперь на любом листе этой книги Вы можете использовать эту функцию, вставив ее через Мастер Функций:
-
в Excel 2003 и старше - через меню Вставка - Функция (Insert - Function)
-
в Excel 2007 и новее - через вкладку Вставка - Функция (Insert - Function)
из категории Определенные пользователем (User defined):
В этом макросе варианты замены русских букв английскими эквивалентами представлены согласно ГОСТ. Если для вашей задачи нужны другие версии (например, русская "я" должна выводиться как "ja", а не как "ya" и т.д.), то можно свободно подкорректировать это в теле макроса. Как легко догадаться, два первых массива Rus и Eng как раз и кодируют эти подстановки.
Для новых версий Excel 2007-2010 и т.д. не забудьте сохранить вашу книгу как файл с поддержкой макросов (Macro Enabled Workbook), т.е. в формате XLSM.
Ссылки по теме
Подскажите пожалуйста как сделать две функции в екселе
1я функция, что бы в одном из столбцов всегда писались только ПРОПИСНЫЕ БУКВЫ.(через формулу "ПРОПИСН" это делать не удобно)
2я функция. что бы в одном из столбцов, печать осуществлялась только на русском языке, если даже в данный момент стоит другой язык.
надеюсь на Вашу помощь, как на последнюю инстанцию
С Уважением "Чайник в екселе" Юрий.
Да работает, но в украинской транслитерации есть одно исключение:
Сочетание букв “зг” транслитерируется латиницей как “zgh”
это связано с тем что “ж” транслитерируется “zh” и если делать замену по буквам “з”-"z", “г”-"h" то получается "ж", а не "зг".
Я пробовал доработать Вашу функцию под украинский язык, все получается кроме выше описанного исключения. Можете помощь в решении этой задачи, заодно и в Вашу надстройку PLEX можно будет добавить новую функцию транслитерации с украинского на английский.
На ходил еще такое решение, но совместить его с Вашей формулой у меня не получается
Этот макрос будет перебирать ячейки в диапазоне А1:А100 и превращать их в транслит.
Вот, что я пробовала писать, не получилось.
Заранее огромнейшее спасибо.
Курсор с желтой подсветкой указывает на первую строчку скрипта. В чем может быть проблема?
Николай допустил небольшую опечатку.
Замените последнюю строку End Function на End Sub.
И еще тут строчки не хватает, которая будет "обнулять" накопление.
У меня в итоге вот что получилось:
что я делаю не правильно?
Вначале функция работала корректно, но через пару дней стала не находить какую-то библиотеку.
Помогите, пожалуйста.
Подскажите что необходимо прописать что бы при нажатии CommandButton текст на русском из TextBox переносился транслитом в заданную ячейку листа?
В модуль добавил текст функции из шапки.
Я самоучка и еще многого не понимаю и не знаю, строго не судите)
я прописал так - 'Заносим данные из TextBox26 транслитом.
ActiveSheet.Cells(lLastRow, "H";).Value = Module6.Translit(Me.TextBox26)
выдает ошибку в Модуле и подсвечивает символ "i" в строке For i = 1 To Len(Txt)
И если в TextBox будут текст + цифры, также выдает ошибку в строке If Rus(j) = с Then . Что необходимо поправить?
спасибо!
Разобрался.
Добавил в RUS , " ", "%"
Добавил в ENG , "-", ""
и изменил For J = 0 To 65 на 67
Возможно в данный макрос добавить аббревиатуры?
Например сделать транслитерацию ООО как Ltd?
Немного пришлось изменить функцию , все работает но не пойму почему вместо С (лат.) получается М (кир.) и дальше все со сдвигом.
Или может есть другой вариант решения такого вопроса.
Помогите новичку. Спасибо.
Function Translit(Txt As String) As String
Dim Eng As Variant
Eng = Array("q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", _
"]", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "z", "x", _
"x", "c", "v", "b", "n", "m", ",", ".", "Q", "W", "E", "R", "T", _
"Y", "U", "I", "O", "P", "[", "]", "A", "S", "D", "F", "G", "H", _
"J", "K", "L", ";", "'", "Z", "X", "C", "V", "B", "N", "M", ",", "."
Dim Rus As Variant
Rus = Array("й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ъ", _
"ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э", "я", "ч", "с", _
"м", "и", "т", "ь", "б", "ю", "Й", "Ц", "У", "К", "Е", "Н", "Г", _
"Ш", "Щ", "З", "Х", "Ъ", "Ф", "Ы", "В", "А", "П", "Р", "О", _
"Л", "Д", "Ж", "Э", "Я", "Ч", "С", "М", "И", "Т", "Ь", "Б", "Ю"
For I = 1 To Len(Txt)
с = Mid(Txt, I, 1)
flag = 0
For J = 0 To 64
If Eng(J) = с Then
outchr = Rus(J)
flag = 1
Exit For
End If
Next J
If flag Then outstr = outstr & outchr Else outstr = outstr & с
Next I
Translit = outstr
End Function
хотя русскийпакет уже скачала, но ситуация та же...
Заранее спасибо за ответ!
Тоже очень нужна такая функция, чтобы транслитерировать 59 тысяч строк.
И такая же проблема: функция работает, но трансформирует кириллицу в кириллицу и латиницу в латиницу, а вот кириллицу в латиницу не переводит. Возможно это как-то связано с настройками самого устройства/Windows, т.к. мое устройство изначально активировано не в РФ.
Спасибо заранее за ответ!
Исходный текст: ТБХ ПЕРФОРАТОР "Сан-Мастер" гранулированное / средство для прочистки труб! 500гр.
Результат: TBKH-PERFORATOR-San-Master-granulirovannoe--sredstvo-dlya-prochistki-trub-500gr
Макрос работает но, написан не профессионалом в VBA:
Function Translit(Txt As String) As String
Dim Rus As Variant
Dim Eng As Variant
Dim с As String
Dim outstr As String
Dim outchr As String
Dim flag As Integer
Dim J As Integer
Dim I As Integer
' Определяем русские и английские символы
Rus = Array("а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", _
"л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", _
"щ", "ъ", "ы", "ь", "э", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", _
"Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _
"С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я"
Eng = Array("a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "j", _
"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", "JO", "ZH", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", _
"S", "T", "U", "F", "KH", "TS", "CH", "SH", "SCH", "", "Y", "", "E", "YU", "YA"
' Проходим по каждому символу в тексте
For I = 1 To Len(Txt)
с = Mid(Txt, I, 1)
If с = "-" Then
If I = 1 Or I = Len(Txt) Then
' Если символ - в начале или конце текста, пропускаем его
GoTo ContinueLoop
ElseIf Mid(Txt, I + 1, 1) = "-" Then
' Если следующий символ тоже дефис, пропускаем его
I = I + 1
Else
outstr = outstr & с
End If
ElseIf с = "'" Or с = """" Or с = "/" Or InStr(".,:;!?()[]{}", с) > 0 Then
' Если символ входит в этот список, пропускаем его
GoTo ContinueLoop
ElseIf с = " " Then
' Если символ - пробел, ' или ", заменяем его на дефис
outstr = outstr & "-"
Else
flag = 0
' Сравниваем с русскими символами
For J = 0 To 65
If Rus(J) = с Then
outchr = Eng(J)
flag = 1
Exit For
End If
Next J
' Если символ найден, добавляем его в результат
If flag Then
outstr = outstr & outchr
Else
outstr = outstr & с
End If
End If
ContinueLoop:
Next I
' Удаляем дефис в конце текста
If Right(outstr, 1) = "-" Then
outstr = Left(outstr, Len(outstr) - 1)
End If
Translit = outstr
End Function