Поиск символов латиницы в русском тексте

Одна из типовых ситуаций, с которой все мы однажды сталкиваемся: кто-то (возможно даже мы сами) при наборе текстовой информации в ячейку, случайно использовал английские буквы (латиницу) вместо русских (кириллицы). Допустить такую ошибку достаточно легко, особенно если учесть изощренное расположение некоторых символов в стандартной раскладке клавиатуры. Ну какому идиоту, скажите мне, пришло в голову помещать на одну клавишу две одинаковых по написанию буквы (английская "си" и русская "эс")? Да и с другими символами не лучше. Но, как говорится, "фарш невозможно провернуть назад" - текущая раскладка давно стала стандартом и никуда от этого не деться.

Использование символов латиницы в русском тексте порождает огромное количество проблем. От путаницы при банальной сортировке по алфавиту до некорректной консолидации данных при автоматическом объединении нескольких таблиц в одну.

Выискивать похожие по виду символы и проверять не являются ли они символами английской раскладки крайне муторно. Поэтому поищем более изящные варианты...

Способ 1. Шрифт без кириллицы

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

latin1.png

Способ 2. Функция IsLatin на VBA

Создадим пользовательскую функцию (назовем ее, например, IsLatin), которая будет проверять - присутствуют ли в заданной ячейке символы английского алфавита и выдавать в качестве результата логическое значение ИСТИНА или ЛОЖЬ.

Откройте редактор Visual Basic сочетанием клавиш ALT+F11 или в старых версиях Excel - через меню Сервис - Макрос - Редактор Visual Basic (Tools - Macro - Visual Basic Editor), вставьте новый модуль (меню Insert - Module) и скопируйте туда текст этой функции:

Public Function IsLatin(str As String)
    str = LCase(str)
    LatinAlphbet = "*[abcdefghijklmnopqrstuvwxyz]*"
    If str Like LatinAlphbet Then
        IsLatin = True
    Else
        IsLatin = False
    End If
End Function

Закройте редактор Visual Basic и вернитесь в Excel.

Теперь в Мастере функций в категории Определенные пользователем (User Defined) можно найти нашу функцию IsLatin и воспользоваться ей. Синтаксис функции следующий:

=IsLatin(A2)

где для примера А2 - это адрес ячейки, содержащей текст

Функция выдаст значение ИСТИНА (TRUE), если найдет в тексте А2 хотя бы один символ латиницы. В противном случае функция вернет значение ЛОЖЬ (FALSE):

latin2.png

Способ 3. Подсветка символов латиницы красным цветом шрифта

Откройте редактор Visual Basic сочетанием клавиш ALT+F11 или в старых версиях Excel - через меню Сервис - Макрос - Редактор Visual Basic (Tools - Macro - Visual Basic Editor), вставьте новый модуль (меню Insert - Module) и скопируйте туда текст этого макроса:

Sub ShowLatin()    
For Each c In Selection        
    For i = 1 To Len(c)            
        If (Asc(Mid(c, i, 1)) >= 65 And Asc(Mid(c, i, 1)) <= 90) Or _
               (Asc(Mid(c, i, 1)) >= 97 And Asc(Mid(c, i, 1)) <= 122) Then
                c.Characters(Start:=i, Length:=1).Font.ColorIndex = 3            
        End If        
    Next i
Next c
End Sub

Закройте редактор Visual Basic и вернитесь в Excel. Если теперь выделить интересующий диапазон ячеек (только не весь столбец или лист - а то считать до конца дня будет!) и запустить наш макрос с помощью сочетания клавиш ALT+F8 или через меню Сервис - Макрос - Макросы (Tools - Macro - Macros), то символы латиницы выделятся красным цветом шрифта:

latin3.png

Ссылки по теме


28.07.2013 19:12:22
35 тыс. просмотров и ни одного комментария. Или все понятно, или - ничего :)
MCH
17.09.2013 21:13:55
Function IsLatin(txt As String) As Boolean
    IsLatin = txt Like "*[A-Za-z]*"
End Function


Sub ShowLatin()
    Dim c As Range, i As Long
    For Each c In Selection
        For i = 1 To Len(c)
            If Mid$(c, i, 1) Like "[A-Za-z]" Then c.Characters(Start:=i, Length:=1).Font.ColorIndex = 3
    Next i, c
End Sub
21.09.2013 15:36:23
Браво! Очередное доказательство, что нет предела совершенству! :)
08.10.2013 16:27:56
...А если задача обратная, в ячейке с латиницей искать русские буквы, как код меняется, не могу сообразить...
Хотя вопрос снимаю, спс МСН!!!
09.10.2013 08:47:38
Очевидно:
Function IsRus(txt As String) As Boolean
    IsLatin = txt Like "*[А-Яа-я]*"
End Function
14.10.2014 10:03:52
Только для полной точности и универсальности не мешает ещё учесть, что буквы ё и Ё в таблице кодов стоят отдельно от всего алфавита и потому в последовательности [А-Яа-я] не входят :)
Поэтому, чтобы уж наверняка функция вылавливала кириллицу, нужно писать [А-Яа-яЁё]
28.07.2017 15:12:43
Очевидно:
Function IsRus(txt As String) As Boolean
IsLatin = txt Like "*[А-Яа-я]*"
End Function
Долой IsLatin!
Function IsRus(txt As String) As Boolean 
    IsRus = txt Like "*[А-Яа-я]*" 
End Function
 
10.04.2015 18:15:53
Способ 2. Функция IsLatin на VBA - шикарен!!!
Спасибо!
19.04.2015 13:08:51
Спасибо!) Функция IsLatin пригодилась.
30.06.2015 04:11:36
Здравствуйте, почему-то Способ 3 не работает (( Подсвечивает красным и кириллицу и латиницу.
30.06.2015 04:17:41
Взяла макрос из комментария - заработал. Спасибо
23.09.2015 13:32:39
Здравствуйте, коллеги! Как модернизировать функцию IsLatin , чтобы в результате получить позицию первого латинского символа в строке?
Гарнитура игровая ASUS ROG CerberusГарнитура игроваяASUS ROG Cerberus
Надо вот так разделить.
Спасибо заранее.
23.09.2015 18:13:03
Александр, для определения позиции первой английской буквы в строке можно использовать следующую формулу массива:
=ПОИСКПОЗ(1;(КОДСИМВ(ПРОПИСН(ПСТР(A1;СТРОКА(1:10);1)))>=65)*(КОДСИМВ(ПРОПИСН(ПСТР(A1;СТРОКА(1:10);1)))<=90);0)
Предполагается, что проверяемый текст у вас в А1.
Не забудьте после ввода нажать Ctrl+Shift+Enter, т.к. это формула массива.
24.09.2015 09:28:54
Красиво. Но не могу понять идею использования СТРОКА(1:10). При копировании формулы в столбце, работает некорректно (становится СТРОКА(2:11) итд ). Да и на моем примере лучше сработало СТРОКА(1:100), при СТРОКА(1:10) выдало ошибку #Н/Д. Спасибо.
24.09.2015 21:00:01
Да, вы правы, лучше так:
=ПОИСКПОЗ(1;(КОДСИМВ(ПРОПИСН(ПСТР(A1;СТРОКА($1:$100);1)))>=65)*(КОДСИМВ(ПРОПИСН(ПСТР(A1;СТРОКА($1:$100);1)))<=90);0)
25.09.2015 09:35:17
Большое спасибо.
oak
09.02.2016 11:28:48
Есть сервис, покажет цветом где какой символ http://cyr-lat.progresssite.pro/
02.02.2017 16:50:32
помогите плиз мне надо выделить в ячейке с русскими словами английские слова и в дальнейшем их удалить с помощью плекс
02.02.2017 17:07:04
Вам надо удалить целиком ячейки (строки) с английским текстом или именно английские символы, оставив остальное содержимое ячейки?
03.02.2017 06:24:48
второе, мне надо удалить именно англ символы, оставив остальное содержимое ячейки!
03.02.2017 09:15:57
Костя, для удаления латиницы можно использовать макрос подсветки красным, но чуть-чуть модернизированный:
Sub Delete_Latin()
    Dim c As Range, i As Long
    For Each c In Selection
        For i = Len(c) To 1 Step -1
            If Mid$(c, i, 1) Like "[A-Za-z]" Then c.Characters(Start:=i, Length:=1).Delete
        Next i
    Next c
End Sub

Выделяете диапазон ячеек и запускаете его - удалит все символы латиницы, остальное не тронет :)
03.02.2017 15:07:14
а в самом Плекс реализована эта идея ?
03.02.2017 18:57:10
Нет, но добавить стоит, наверное.
03.02.2017 23:00:15
  • Было б  очень удобно если б реализовали эту настройку. И наоборот удалить русские символы в англ слове.
20.04.2017 11:45:41
Добрый день.
Подскажите пожалуйста,  как с помощью способа № 3 выделить кириллицу?
22.04.2017 10:20:43
Как-то так:
Sub ShowLatin()
    Dim c As Range, i As Long
    For Each c In Selection
        For i = 1 To Len(c)
            If Mid$(c, i, 1) Like "[А-Яа-яЁё]" Then c.Characters(Start:=i, Length:=1).Font.ColorIndex = 3
    Next i, c
End Sub
13.06.2017 14:35:52
Помогите, пжл, с похожим вопросом. Нужно из ячейки выбрать русский текст и вернуть его в соседнюю ячейку. То есть из исходной информации убрать латиницу, цифры знаки и пробелы.
14.06.2017 19:22:35
Добрый вечер.
Подскажите пожалуйста, как в ячейке, в которой содержатся несколько слов на русском и на английском языках заменить в русских словах английские буквы на русские, а в английских словах русские буквы на английские.
27.06.2017 17:12:49
Здравствуйте! А как измениться макрос, если мы хотим заменить, к примеру, случайным образом английские буквы на похожие русские, или же наоборот?
Т.е. чтобы не все буквы менялись, а только некоторые из них :)
07.07.2017 10:35:29
Подскажите, пожалуйста, есть ли возможность отличить пробел русской и английской раскладок средствами экселя?