Поиск символов латиницы в русском тексте
Одна из типовых ситуаций, с которой все мы однажды сталкиваемся: кто-то (возможно даже мы сами) при наборе текстовой информации в ячейку, случайно использовал английские буквы (латиницу) вместо русских (кириллицы). Допустить такую ошибку достаточно легко, особенно если учесть изощренное расположение некоторых символов в стандартной раскладке клавиатуры. Ну какому идиоту, скажите мне, пришло в голову помещать на одну клавишу две одинаковых по написанию буквы (английская "си" и русская "эс")? Да и с другими символами не лучше. Но, как говорится, "фарш невозможно провернуть назад" - текущая раскладка давно стала стандартом и никуда от этого не деться.
Использование символов латиницы в русском тексте порождает огромное количество проблем. От путаницы при банальной сортировке по алфавиту до некорректной консолидации данных при автоматическом объединении нескольких таблиц в одну.
Выискивать похожие по виду символы и проверять не являются ли они символами английской раскладки крайне муторно. Поэтому поищем более изящные варианты...
Способ 1. Шрифт без кириллицы
Выделите диапазон ячеек с проверяемым текстом и временно установите для него любой шрифт не содержащий кириллицу, например Albertus или любой аналогичный (находится методом тыка). Внешний вид символов кириллицы и латиницы станет отличаться и можно будет легко визуально локализовать некорректные символы:
Способ 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):
Способ 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), то символы латиницы выделятся красным цветом шрифта:
Ссылки по теме
- Подсветка латиницы с помощью надстройки PLEX
- Что такое макросы, куда вставлять код макроса, как их использовать
Хотя вопрос снимаю, спс МСН!!!
Поэтому, чтобы уж наверняка функция вылавливала кириллицу, нужно писать [А-Яа-яЁё]
Function IsRus(txt As String) As Boolean
IsLatin = txt Like "*[А-Яа-я]*"
End Function
Пример:
S27 - не нужно выделять
UTP - нужно выделить.
Спасибо!
Спасибо заранее.
=ПОИСКПОЗ(1;(КОДСИМВ(ПРОПИСН(ПСТР(A1;СТРОКА(1:10);1)))>=65)*(КОДСИМВ(ПРОПИСН(ПСТР(A1;СТРОКА(1:10);1)))<=90);0)
Предполагается, что проверяемый текст у вас в А1.
Не забудьте после ввода нажать Ctrl+Shift+Enter, т.к. это формула массива.
=ПОИСКПОЗ(1;(КОДСИМВ(ПРОПИСН(ПСТР(A1;СТРОКА($1:$100);1)))>=65)*(КОДСИМВ(ПРОПИСН(ПСТР(A1;СТРОКА($1:$100);1)))<=90);0)
Выделяете диапазон ячеек и запускаете его - удалит все символы латиницы, остальное не тронет
Подскажите пожалуйста, как с помощью способа № 3 выделить кириллицу?
Подскажите пожалуйста, как в ячейке, в которой содержатся несколько слов на русском и на английском языках заменить в русских словах английские буквы на русские, а в английских словах русские буквы на английские.
Т.е. чтобы не все буквы менялись, а только некоторые из них
UPDATE:
Разобрался)
Function IsLatin(txt As String) As Boolean
IsLatin = txt Like "*[A-Za-z][А-Яа-яЁё]*" Or txt Like "*[А-Яа-яЁё][A-Za-z]*"
End Function
Главная - Условное форматирование - Создать правило - Использовать формулу для определения форматируемых ячеек
и ввести
Спасибо за ответ! А в код макроса эти шаги можно как-то зашить? Чтобы на выходе мы могли просто выделить проверяемый диапазон, применить макрос и все было сразу подсвечено.
4|3|穆库扎尼干红葡萄酒 Symbol of Georgia-"Mukuzani" red dry|鲜葡萄酿造|12%VOL|佐餐酒|2017|格鲁吉亚 GEORGIA|科瓦雷利酒窖有限公司 KVARELI CELLAR LTD|萨别拉维 Saperavi|0.75L*12瓶/箱
Их бы теперь привести к единому стандарту. Поскольку данные тянутся при помощи Power Query, имеет смысл менять их при помощи PQ.
Очевидный вариант - замена при помощи вспомогательного списка сопоставлений. Таких вариантов несколько.
А есть ещё какие-то варианты?