Function Translit(ByVal txt As String) As String iRussian$ = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя" iTranslit = Array("", "a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "jj", "k", _ "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "ch", _ "sh", "zch", "''", "'y", "'", "eh", "ju", "ja") For iCount% = 1 To 33 txt = Replace(txt, Mid(iRussian$, iCount%, 1), iTranslit(iCount%), , , vbTextCompare) Next Translit$ = txt End Function
Sub ПримерИспользованияФункцииTranslit() txt = "проверка работы транслита" newtxt = Translit(txt) ' результат = строка "proverka rabot'y translita" MsgBox "Строка """ & txt & """" & vbNewLine & "преобразована в строку """ _ & newtxt & """", vbInformation, "Результат обработки" End Sub
Надстройку для транслитерации выделенного диапазона ячеек,
а также расширенную версию функции транслитерации, можно скачать в этой статье
(добавлено в связи с просьбой выполнить обратную транслитерацию)
К сожалению, процесс обратной транслитерации весьма затруднён (я бы даже сказал, что в общем случае невозможно сделать такую функцию, которая преобразовывала бы строку после транслитерации к исходному виду).
Попытаюсь объяснить, почему так происходит:
Допустим, в качестве исходной строки у нас будет текст "щзч схш жзх"
Sub ПримерИспользованияФункцииTranslit() txt = "щзч схш жзх" newtxt = Translit(txt) Debug.Print newtxt ' результат = строка "zchzch shsh zhzh" MsgBox "Строка """ & txt & """" & vbNewLine & "преобразована в строку """ _ & newtxt & """", vbInformation, "Результат обработки" End Sub
И что же мы видим на выходе?
А вот что: "zchzch shsh zhzh"
Достаточно похожие сочетания букв, не правда ли?
И как теперь макросу определить, что означает сочетание "zch sh zh" - "щ сх ж" или "зч ш ж"?
Или, может, "зч сх зх"? Все варианты для макроса ведь равнозначны...
А сочетание "zhzh" следует перевести как "зхзх" или как "жж"?
То же самое касается некоторых других буквосочетаний.
Специально проверил транслитерацию подобных сочетаний на популярном сервисе http://www.translit.ru/
Результат - при обратном переводе на русский исходная строка изменилась: схш жзх --> shsh zhzh --> шш жж
Вывод: учитывая возможное количество неопределённостей, проще обратную транслитерацию выполнять вручную.
Другой вариант функции:
Function Translit(ByVal txt As String) As String ' с учётом регистра символов txtRussian$ = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя" arrTranslit = Array("", "a", "b", "v", "g", "d", "e", "e", "zh", "z", "i", "y", "k", _ "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "kh", "ts", "tch", _ "sh", "sch", "", "y", "", "e", "yu", "ya") For iCount% = 1 To 33 txt$ = Replace(txt$, Mid(txtRussian$, iCount%, 1), arrTranslit(iCount%), , , vbBinaryCompare) ' строчные txt$ = Replace(txt$, UCase(Mid(txtRussian$, iCount%, 1)), UCase(arrTranslit(iCount%)), , , vbBinaryCompare) ' прописные Next Translit$ = txt$ End Function
Результат работы (другой набор символов для замены, учитывается регистр)
Исходная строка: "А-Б-В-Г-Д-Е-Ё-Ж-З-И-Й-К-Л-М-Н-О-П-Р-С-Т-У-Ф-Х-Ц-Ч-Ш-Щ-Ъ-Ы-Ь-Э-Ю-Я"
Итоговая строка: "A-B-V-G-D-E-E-ZH-Z-I-Y-K-L-M-N-O-P-R-S-T-U-F-KH-TS-TCH-SH-SCH--Y--E-YU-YA"
Комментарии
https://disk.yandex.ru/d/51SSaYtvq7044g вот файлом в блокноте
https://youtu.be/OuuTRw2xtBo - по этому видео делал у меня все получилось
Если поможет дайте знать) буду рад!
Вот транслит из английского на русский
Function Translit(Txt As String) As String
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")
Dim Rus As Variant
Rus = Array("а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", _
"л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", _
"щ", "ъ", "ы", "ь", "э", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", _
"Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _
"С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я")
For I = 1 To Len(Txt)
с = Mid(Txt, I, 1)
flag = 0
For J = 0 To 65
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
Спасибо Вам Добрые люди! Не пришлось изобретать велосипед. Всё работает на отлично!
можно. с любого языка на любой язык.
в статье есть ссылка на надстройку для транслитерации, - там вы можете сами настроить, какие буквы на какие заменять
(буквы могут быть из любых алфавитов)
а как можно Excel-e транслитеровать текст из армянского языка на английский
Язык VBA не учил, не работал на нём, поэтому хотел бы узнать мнение специалиста о степени пригодности VBA для создания транслитератора, работающего по правилам систем транслитерации translit1 и translit2 (http://translit1.com/).
Замените vbTextCompare на vbBinaryCompare - и всё заработает
Function Translit(ByVal txt As String) As String
iRussian$ = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
iTranslit = Array("", "a", "b", "v", "g", "d", "e", "e", "zh", "z", "i", "y", "k", _
"l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "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", "H", "Ts", "Ch", "Sh", "Sch", "", "Y", "", "E", "Yu", "Ya")
For iCount% = 1 To 66
txt = Replace(txt, Mid(iRussian$, iCount%, 1), iTranslit(iCount%), , , vbTextCompare)
Next
Translit$ = txt
End Function
Пытался сделать Регистр по другому, ибо перевод в составные большие буквы не устраивает. Ибо имеем вместо "Ч" - "CH", а требуется "Ch"
НО! Не смотря на расширенный массив, всё равно всё переводит в мелкий шрифт.
Подозреваю что нужно писать проверку, но как это делается не знаю.
Удобно делать транслитерацию с помощью Punto Switcher, у него есть такая функция, можно назначить сочетание клавиш, например Ctrl+Alt+T и транслитерировать любой выделенный текст (в Экселе в т.ч.) нажав ее.
Почему же нельзя обратно? Если в начале прогнать на проверку (хотябы основных) сочетания латинских букв и заменить их кириллицей, то оставшиеся символы можно будет прогнать вашим скриптом.
О, разобрался почему регистр не учитывался в access (в ворде все работало)! :)
вот так теперь учитывается:
txt = Replace(txt, Mid(iRussian$, iCount%, 1), iTranslit(iCount%), , , vbBinaryCompare)
txt = Replace(txt, UCase(Mid(iRussian$, iCount%, 1)), UCase(iTranslit(iCount%)), , , vbBinaryCompare)
Ну так а вы указали в макросе, что надо преобразовывать текст ячейки?
Попробуйте добавить ниже такие макросы:
и теперь пробуйте, что вы там делали.
PS: Можете использовать функцию транслита как формулу в ячейке.
К примеру, в ячейке A1 у вас расположен исходный текст.
В ячейке справа напишите формулу =Translit(A1)
и увидите аналогичный результат.
Не могу запустить ни один из Ваших макросов.
Win7x64 Office2010x64
В настройках EXCEL
Параметры макросов - Включить все макросы
Доверять доступ к объектной модели проектаVBA
(перезагрузку делал - всего)
Порядок запуска макроса:
1. Копирую с сайта код
2. EXCEL (Alt+F11), Insert > Module, (Ctrl+V), (Ctrl+S), (Alt+Q)-выход
3. EXCEL в формате *.xls
4. Выделяю ячейку с Русским языком (A1)
5. (Alt+F8)-макросы, "ПримерИспользованияФункцииTranslit" > выполнить
6. Показывает
7. Строка "Проверка Работы ТРАНСЛИТА"
Преобразована в строку "Proverka Rabot'y TRANSLITA"
Подскажите что не так? Почему не переводит ячейку?
Странно - почему то все равно в нижний регистр все приводит..
Это оказывается учтено!
Великолепный макрос!!!
А можно сделать, чтобы если в строке содержатся латинские буквы, они бы не преобразовывались.
Да запросто - теперь и регистр учитывается:
Здорово! Хотелось бы еще учет больших-маленьких букв
Отправить комментарий