Deprecated: str_replace(): Passing null to parameter #1 ($search) of type array|string is deprecated in /var/www/jsd/data/www/jsd.ru/plugins/system/admintools/src/Feature/CustomAdminFolder.php on line 83
TransliterateForURL - Транслитерация для URL
Skip to main content

TransliterateForURL - Транслитерация для URL

Макрос транслитерации выделенного диапазона с кириллицы на латиницу (из русских буковок получаются буржуйские) с адаптацией результата для использования в составе URL.

Да, я люблю изобретать велосипеды, но в данном случае моя любовь к бесполезным изобретениям тут ни при чём.

Знаю, что макросы подобные представленному здесь в изобилии представлены на просторах интернета и успешно используются многими пользователями, мной в частности. Не было цели придумать что-то принципиально новое, важно было получить свою легальную копию продукта, с немного специфичным уклоном, который можно распространять на своё усмотрение, не нарушая авторства.

Второй важной задачей было опробовать возможности ChatGPT в сфере написания скриптов для Экселя. Нейросеть со своей задачей прекрасно справилась, хоть и не с первого раза. После многократных корректировок я получил ровно то, что было нужно.

В-третьих, требовалась понятная инструкция к макросу, которую также любезно составил ChatGPT. 😊 Сам то я разберусь (точнее вспомню) как макросы к Экселю прилаживать, а вот для коллег нужна инструкция.

Ну и четвёртое: поскольку в VBA я мало что понимаю, то для меня важно, что каждый блок кода снабжен комментарием, поясняющим функции блока. Таким образом проще внести незначительные коррективы, если потребуется, даже не обладая глубокими познаниями в сфере.

Код макроса:


Sub TransliterateForURL()
    Dim cell As Range
    Dim cyrillicToLatin As Object
    Set cyrillicToLatin = CreateObject("Scripting.Dictionary")
    
    ' Задаем пары кириллических символов и их латинских эквивалентов
    cyrillicToLatin.Add "А", "A": cyrillicToLatin.Add "Б", "B": cyrillicToLatin.Add "В", "V"
    cyrillicToLatin.Add "Г", "G": cyrillicToLatin.Add "Д", "D": cyrillicToLatin.Add "Е", "E"
    cyrillicToLatin.Add "Ё", "E": cyrillicToLatin.Add "Ж", "ZH": cyrillicToLatin.Add "З", "Z"
    cyrillicToLatin.Add "И", "I": cyrillicToLatin.Add "Й", "I": cyrillicToLatin.Add "К", "K"
    cyrillicToLatin.Add "Л", "L": cyrillicToLatin.Add "М", "M": cyrillicToLatin.Add "Н", "N"
    cyrillicToLatin.Add "О", "O": cyrillicToLatin.Add "П", "P": cyrillicToLatin.Add "Р", "R"
    cyrillicToLatin.Add "С", "S": cyrillicToLatin.Add "Т", "T": cyrillicToLatin.Add "У", "U"
    cyrillicToLatin.Add "Ф", "F": cyrillicToLatin.Add "Х", "H": cyrillicToLatin.Add "Ц", "TS"
    cyrillicToLatin.Add "Ч", "CH": cyrillicToLatin.Add "Ш", "SH": cyrillicToLatin.Add "Щ", "SCH"
    cyrillicToLatin.Add "Ъ", "": cyrillicToLatin.Add "Ы", "Y": cyrillicToLatin.Add "Ь", ""
    cyrillicToLatin.Add "Э", "E": cyrillicToLatin.Add "Ю", "YU": cyrillicToLatin.Add "Я", "YA"
    
    ' Пары для строчных букв
    cyrillicToLatin.Add "а", "a": cyrillicToLatin.Add "б", "b": cyrillicToLatin.Add "в", "v"
    cyrillicToLatin.Add "г", "g": cyrillicToLatin.Add "д", "d": cyrillicToLatin.Add "е", "e"
    cyrillicToLatin.Add "ё", "e": cyrillicToLatin.Add "ж", "zh": cyrillicToLatin.Add "з", "z"
    cyrillicToLatin.Add "и", "i": cyrillicToLatin.Add "й", "i": cyrillicToLatin.Add "к", "k"
    cyrillicToLatin.Add "л", "l": cyrillicToLatin.Add "м", "m": cyrillicToLatin.Add "н", "n"
    cyrillicToLatin.Add "о", "o": cyrillicToLatin.Add "п", "p": cyrillicToLatin.Add "р", "r"
    cyrillicToLatin.Add "с", "s": cyrillicToLatin.Add "т", "t": cyrillicToLatin.Add "у", "u"
    cyrillicToLatin.Add "ф", "f": cyrillicToLatin.Add "х", "h": cyrillicToLatin.Add "ц", "ts"
    cyrillicToLatin.Add "ч", "ch": cyrillicToLatin.Add "ш", "sh": cyrillicToLatin.Add "щ", "sch"
    cyrillicToLatin.Add "ъ", "": cyrillicToLatin.Add "ы", "y": cyrillicToLatin.Add "ь", ""
    cyrillicToLatin.Add "э", "e": cyrillicToLatin.Add "ю", "yu": cyrillicToLatin.Add "я", "ya"
    
    ' Проходим по каждой ячейке в выделенном диапазоне
    For Each cell In Selection
        If Not IsEmpty(cell.Value) Then
            Dim text As String
            text = cell.Value
            Dim transliteratedText As String
            transliteratedText = ""
            
            ' Выполняем транслитерацию по символам
            For i = 1 To Len(text)
                Dim char As String
                char = Mid(text, i, 1)
                
                ' Проверяем, есть ли символ в словаре
                If cyrillicToLatin.exists(char) Then
                    transliteratedText = transliteratedText & cyrillicToLatin(char)
                Else
                    ' Заменяем пробелы на дефисы и добавляем только допустимые символы, включая дефисы
                    If char = " " Then
                        transliteratedText = transliteratedText & "-"
                    ElseIf char Like "[A-Za-z0-9-]" Then
                        transliteratedText = transliteratedText & char
                    ' Блок кода для сохранения подчёркиваний
                    ElseIf char = "_" Then
                        transliteratedText = transliteratedText & "_"  ' <<<<< Легко закомментировать эту строку
                    End If
                End If
            Next i
            
            ' Преобразуем в нижний регистр
            transliteratedText = LCase(transliteratedText)
            
            ' Убираем возможные повторяющиеся дефисы
            Do While InStr(transliteratedText, "--") > 0
                transliteratedText = Replace(transliteratedText, "--", "-")
            Loop
            
            ' Удаляем дефис в начале и конце строки, если он есть
            If Left(transliteratedText, 1) = "-" Then transliteratedText = Mid(transliteratedText, 2)
            If Right(transliteratedText, 1) = "-" Then transliteratedText = Left(transliteratedText, Len(transliteratedText) - 1)
            
            ' Устанавливаем результат в ячейку
            cell.Value = transliteratedText
        End If
    Next cell
End Sub

1. Назначение

Макрос TransliterateForURL предназначен для транслитерации кириллического текста в латиницу, с последующим преобразованием текста в формат, подходящий для использования в URL.

2. Описание работы макроса

Макрос автоматически преобразует выбранный диапазон ячеек, содержащий кириллический текст, в латиницу. При этом макрос заменяет кириллические символы на соответствующие латинские эквиваленты, заменяет пробелы на дефисы, а также удаляет лишние спецсимволы и дублирующиеся дефисы. Дополнительно макрос удаляет дефисы в начале и конце строки, если они появляются после преобразования.

3. Стандарты для использования в URL

Результат работы макроса соответствует стандартам URL:

  • Все символы преобразуются в нижний регистр.
  • Пробелы заменяются на дефисы (-).
  • Удаляются любые специальные символы, кроме букв, цифр, дефисов и, при необходимости, знака подчёркивания.
  • Лишние дефисы в начале и конце строки убираются автоматически.
  • Повторяющиеся дефисы заменяются на один.

4. Варианты применения

Этот макрос полезен для подготовки текста для:

  1. Создания URL – Транслитерированный текст подходит для URL, поскольку текст преобразуется в латиницу и соответствует всем необходимым стандартам.
  2. Формирования уникальных идентификаторов – Подходит для случаев, когда нужно создать понятные и читаемые идентификаторы на основе текста.
  3. Системного использования в базе данных – Макрос может помочь при формировании полей на латинице из данных на кириллице.

5. Инструкция по подключению и запуску макроса

Вариант 1: Быстрое применение макроса
  1. Откройте Excel и нажмите Alt + F11, чтобы открыть редактор VBA.
  2. В редакторе VBA выберите "Insert" > "Module" для создания нового модуля.
  3. Скопируйте код макроса TransliterateForURL и вставьте его в модуль.
  4. Закройте редактор VBA.
  5. В Excel выделите диапазон ячеек с текстом на кириллице.
  6. Нажмите Alt + F8, выберите макрос TransliterateForURL, затем нажмите «Run».
Вариант 2: Сохранение файла с макросом
  1. Следуйте шагам 1–4 из предыдущего варианта.
  2. Сохраните файл как Excel Macro-Enabled Workbook (Расширение: .xlsm), выбрав этот формат в меню «Сохранить как».
  3. Открыв файл в будущем, вы сможете использовать макрос, выделив нужный диапазон и запустив его через Alt + F8.

6. Инструкция по отключению сохранения знака подчёркивания

Макрос по умолчанию сохраняет знак подчёркивания (_), если он есть в исходном тексте. Чтобы отключить сохранение этого символа, выполните следующие шаги:

  1. Откройте редактор VBA (нажмите Alt + F11) и найдите модуль с макросом TransliterateForURL.
  2. В строке кода transliteratedText = transliteratedText & "_" добавьте символ комментария ' в начале строки, чтобы она выглядела так:
    'transliteratedText = transliteratedText & "_"
    

7. Похожие решения других авторов

Если нужно что-то немного другое, а не то, что тут или хочется посмотреть, как оно ещё бывает, то приведу короткий список программных решений, выполняющих транслитерацию.

  • Транслит – макрос на сайте «Планета Эксель». Автор сайта очень толковый чувак, уже много лет обращаюсь к его материалам для расширения своих знаний в Экселе.

  • Транслитерация в Excel, замена русских букв на английские – формула и макрос в окружении весьма познавательной статьи на сайте разработчика платной утилиты (набора инструментов) !SEMTools, которая стала для меня палочкой-выручалочкой во многих вопросах. Это не реклама (хотя, она, конечно же, но бескорыстная). Автор проекта тоже товарищ весьма мозговитый, полезные знания транслирует всякие.

  • Надстройка для транслитерации (кодирования) диапазона ячеек – бесплатная надстройка на сайте ExcelVBA. Не уверен, что сам её использовал, но какие-то полезности с этого сайта качал – работают, за что спасибо. Если честно, антивирус на них ругается, но мне думается, что это из-за специфики макросов.

  • Создано
    03 ноября 2024
  • Последняя правка
    03 ноября 2024