Страницы: 1 2 След.
RSS
Найти латинские буквы в столбцах таблицы и заменить на соответствующие им русские
 
Всем привет!  
Помогите, пожалуйста, как программно реализовать такую задачку.  
Есть таблица, в столбцах которой присутствуют имена и номера с буквенным вложением, визуально всё хорошо, но есть проблема, в некоторых данных вместо русской буквы встречается английская и визуально это не отличишь.  
 
Соответствие букв:  
E, T, O, P, o, p, a,A, H, K, k, X,x, C, c, B, M - это английские буквы, которые схожи с русскими.  
 
Как быть? Нужно проверить файл и провести замену этих букв на русские автоматически
 
http://www.planetaexcel.ru/forum.php/?thread_id=9841
 
Я тут для себя как-то ваял.
 
AndreyK, покажите кусочек.
 
я чуть-чуть подправил, но не работает замена. Что делать?  
 
В файле слова написаны из смеси русских и английских слов, нужно, чтобы все буквы были русскими.  
 
Мария - первые три буквы английские  
Саша - первые две буквы английские  
 
нужно исправить, чтобы все русские буквы были.
 
{quote}{login=AndreyK}{date=30.09.2010 09:16}{thema=}{post}я чуть-чуть подправил, но не работает замена. Что делать?  
 
В файле слова написаны из смеси русских и английских слов, нужно, чтобы все буквы были русскими.  
 
Мария - первые три буквы английские  
Саша - первые две буквы английские  
 
нужно исправить, чтобы все русские буквы были.{/post}{/quote}  
 
У Саши последняя буква английская.
 
Для начала, нужно создать таблицу соответствия схожих английских и русских букв. А там дело техники.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Если вот так написать, то программа заменит буквы только в том случае, если они идут подряд, то есть Мария - если первые три буквы латинские, если же в этом слове будут только первая и третья латинские, то не заменит. НЕ пойму, что нужно исправить, чтобы заменялись в любом случае?  
 
 
Option Explicit  
 
Sub ChangeEngRus()  
 
Dim c As Object  
Dim n As Integer, i As Integer, posChar As Integer  
Dim ToRusLang As Boolean  
Dim LineChars(1) As String * 72  
Dim Ch As String * 1  
Dim TempSelection As String  
LineChars(0) = "CcEeTOopPAaHKkXxBM"  
LineChars(1) = "СсЕеТОорРАаНКкХхВМ"  
For Each c In Selection.Cells  
TempSelection = c.Value  
ToRusLang = True  
For i = 1 To Len(TempSelection)  
Ch = Mid(TempSelection, i, 1)  
If ToRusLang Then n = 0 Else n = 1  
posChar = InStr(LineChars(n), Ch)  
If posChar = 0 Then  
n = Abs(n - 1)  
posChar = InStr(LineChars(n), Ch)  
End If  
If posChar <> 0 Then  
Select Case n  
Case 0  
ToRusLang = True  
Case 1  
ToRusLang = False  
End Select  
Mid(TempSelection, i, 1) = Mid(LineChars(Abs(n - 1)), posChar, 1)  
End If  
Next  
c.Value = TempSelection  
Next c  
End Sub
 
А почему не подходит пример транслитерации из "Приемов"?
 
потому что нужно обработать сразу весь выделенные диапазон, а транслитерации русские заменяют на английские, английские на русские, просто все меняется местами.
 
Ну, тогда вот, например:  
 
Sub RUS_Chr()  
  Dim LATChr$: LATChr = "CcEeTOopPAaHKkXxBM"  
  Dim RUSChr$: RUSChr = "СсЕеТОорРАаНКкХхВМ"  
  Dim i%, iCell As Range  
  For Each iCell In Intersect(Selection, ActiveSheet.UsedRange)  
     For i = 1 To Len(LATChr)  
        With iCell  
           If .Value Like "*" & Mid(LATChr, i, 1) & "*" Then  
              .Value = Replace(.Value, Mid(LATChr, i, 1), Mid(RUSChr, i, 1))  
           End If  
        End With  
     Next i  
  Next iCell  
End Sub
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Sub test()  
'Лист1 таблица соответствий 1 колонка англ, 2 русские  
'Range("A1:B10") выберите свой диапазон  
Dim strR As String  
Dim strRt As String  
Llastrow = Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row  
For i = 1 To Llastrow  
strR = Sheets("Лист1").Cells(i, 1)  
strRt = Sheets("Лист1").Cells(i, 2)  
   Range("A1:B10").Replace What:=strR, Replacement:=strRt, LookAt:=xlPart, _  
       SearchOrder:=xlByRows, MatchCase:=True  
       Next i  
End Sub  
попробуйте и так
Спасибо
 
{quote}{login=}{date=30.09.2010 10:56}{thema=}{post}потому что нужно обработать сразу весь выделенные диапазон, а транслитерации русские заменяют на английские, английские на русские, просто все меняется местами.{/post}{/quote}  
Ну так просто исключите ненужное.
 
К стати, чтобы проверить работу макроса, удобно в конце его перед Exit Sub временно вставить вызов такого макроса, раскрашивающего буквы:  
Sub Color_RUS_LAT()   ' Выделяет русские символы в Selection ЗЕЛЁНЫМ, латинские - КРАСНЫМ  
  If TypeName(Selection) <> "Range" Then Exit Sub  
  Dim iCell As Range, rRange As Range, i%, ASCII%, iColor%  
  On Error GoTo eXXit  
  Set rRange = Intersect(Selection, ActiveSheet.UsedRange)  
  If rRange Is Nothing Then Exit Sub  
  Application.ScreenUpdating = False  
  For Each iCell In rRange  
     For i = 1 To Len(iCell)  
        ASCII = Asc(Mid(iCell, i, 1))  
        If (ASCII >= 192 And ASCII <= 255) Then iColor = 10   'цвет символов РУС  
        If (ASCII >= 65 And ASCII <= 90) Or (ASCII >= 97 And ASCII <= 122) Then iColor = 3   'цвет символов LAT  
        iCell.Characters(Start:=i, Length:=1).Font.ColorIndex = iColor  
     Next i  
  Next iCell  
  rRange.Select  
  Application.ScreenUpdating = True  
eXXit:    End Sub
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Пробуйте(раз уж я выкладывал), меняет только в направлении Eng-> Rus:  
Sub ChangeEngRus()  
Dim c As Object  
Dim n As Integer, i As Integer, posChar As Integer  
Dim ToRusLang As Boolean  
Dim LineChars(1) As String * 72  
Dim Ch As String * 1  
Dim TempSelection As String  
LineChars(0) = "CcEeTOopPAaHKkXxBM"  
LineChars(1) = "СсЕеТОорРАаНКкХхВМ"  
For Each c In Selection.Cells  
TempSelection = c.Value  
ToRusLang = True  
For i = 1 To Len(TempSelection)  
Ch = Mid(TempSelection, i, 1)  
If ToRusLang Then n = 0 Else n = 1  
posChar = InStr(LineChars(n), Ch)  
If posChar = 0 Then  
n = 0 'Abs(n - 1)  
posChar = InStr(LineChars(n), Ch)  
End If  
If posChar <> 0 Then  
Select Case n  
Case 0  
ToRusLang = True  
Case 1  
ToRusLang = False  
End Select  
Mid(TempSelection, i, 1) = Mid(LineChars(Abs(n - 1)), posChar, 1)  
End If  
Next  
c.Value = TempSelection  
Next c  
End Sub
Я сам - дурнее всякого примера! ...
 
Привет, Сергей!  
Ну, если быть честным, то соответствие букв:  
LineChars(0) = "CcEeTOopPAaHKkXxBM"  
LineChars(1) = "СсЕеТОорРАаНКкХхВМ"  
для своего макроса я слизал у тебя (просто лень было самому вчера писАть)...  
 
А объясни, что да знак умножения при задании переменных:  
Dim LineChars(1) As String * 72  
Dim Ch As String * 1  
в первый раз такое вижу...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Привет. А перечень не я писал. Пройди по ссылке Казанского - то моя программа. Изначально задумана: если забыл переключить раскладку и печатал в другой - перебъет в нужную. Перечень из поста Natalia от 30.09.2010, 10:29.  
Dim LineChars(1) As String * 72 при объявлении задает мах длину строки. Это для экономии выделяемой памяти.
Я сам - дурнее всякого примера! ...
 
Да, правильно... Не у тебя слямзил...  
Наверное, у Natalia. Но точно не сам писАл.  
 
К стати. Долго не мог понять почему ты так сложно и выполняешь замену букв (через inStr с наворотами вместо простого Replace)...  
А потом по ссылке Казанского увидел в твоём макросе такой коммент:  
' Макрос записан 05/10/2000 (Sergey P)  
и сразу вспомнил, что в офисе-98 функции Replace в ВБА Офиса не было. И я сам раньше в Access'e долго извращался с заменой циклом по одной букве.  
Помню, когда где-то в 2005 поставил себе 2003-й вместо 98-го, долго везде свои старые программы под использование Replace причёсывал. Всё очень здорово сокращалось и упрощалось.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Я наоборот не меняю. Чтобы была обратная совместимость. Иногда приходится на дровах работать.
Я сам - дурнее всякого примера! ...
 
Есть ещё машины с Excel5?
 
Ну, не знаю...  
Я так уже года 3 наверное нигде Офиса-98 не видал.  
Зато какая там была СПРАВКА! Просто супер! И мало того, что всё было на "великом, могучем и терпеливом", так ещё и нормальный поиск по ней был...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=KuklP}{date=30.09.2010 11:36}{thema=}{post}Dim LineChars(1) As String * 72 при объявлении задает мах длину строки. Это для экономии выделяемой памяти.{/post}{/quote}  
Чуть поглумлюсь по знакомству над ровесником:    
Сергей, ты, наверное, "Синклер"-овский Бэйсик вспомнил или ещё от "Радио-РК86" воспоминания живы?  
:-)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
наверное так гораздо проще автору будет да и строк поменьше :)  
замечания тоже принимаются к расмотрению :))  
Sub replEnRu()  
'R Dmitry    
Dim strR As String  
Dim strRt As String  
arrEn = Array("E", "T", "O", "P", "o", "p", "a", "A", "H", "K", "k", "X", "x", "C", "c", "B", "M")  
arrRus = Array("Е", "Т", "О", "Р", "о", "р", "а", "А", "Н", "К", "к", "Х", "х", "С", "с", "В", "М")  
For i = 0 To UBound(arrEn)  
strR = arrEn(i)  
strRt = arrRus(i)  
   Range("A:X").Replace What:=strR, Replacement:=strRt, LookAt:=xlPart, _  
       SearchOrder:=xlByRows, MatchCase:=True  
      Next i  
End Sub
Спасибо
 
Паял КР580. "Орион 128".
Я сам - дурнее всякого примера! ...
 
А где же формулисты, почему молчат? Может кто до ума доведёт..
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Владимир, так тут задача "на месте" поменять. Макросу это ближе.
 
Володь, на десяток записей да. А если база на 30000? ИМХО формулы тут - нонсенс.
Я сам - дурнее всякого примера! ...
 
Дмитрий,  
1. Вы, решив потрудиться лично, составляя список замены, пропустили замену е латинской на е русскую (так что списывать иногда полезно :-))  
2. Я просто не выложил свой предыдущий доработанный макрос.  
Сравните свой, чуть подправленный мною:  
Sub replEnRu()  
  Dim arrEng(): arrEng = Array("C", "c", "E", "e", "T", "O", "o", "p", "P", "A", "a", "H", "K", "k", "X", "x", "B", "M")  
  Dim arrRus(): arrRus = Array("С", "с", "Е", "е", "Т", "О", "о", "р", "Р", "А", "а", "Н", "К", "к", "Х", "х", "В", "М")  
  Dim i%  
  For i = 0 To UBound(arrEn)  
     Intersect(Selection, ActiveSheet.UsedRange).Replace _  
           What:=arrEng(i), _  
           Replacement:=arrRus(i), _  
           LookAt:=xlPart, _  
           SearchOrder:=xlByRows, MatchCase:=True  
  Next i  
End Sub  
 
и мой "из неопубликованного" :-)  
Sub RUS_Chr()  
  Dim LATChr$: LATChr = "CcEeTOopPAaHKkXxBM"  
  Dim RUSChr$: RUSChr = "СсЕеТОорРАаНКкХхВМ"  
  Dim i%  
  For i = 1 To Len(LATChr)  
     Intersect(Selection, ActiveSheet.UsedRange).Replace _  
           What:=Mid(LATChr, i, 1), _  
           Replacement:=Mid(RUSChr, i, 1), _  
           LookAt:=xlPart, _  
           SearchOrder:=xlByRows, MatchCase:=True  
  Next i  
End Sub  
 
ИМХО, абсолютно похожи.  
Нигде я к сожалению не видел данных про скорость Replace.  
Надо бы время обработки на больших объёмах текста сравнить. Да лень текст составлять...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=KuklP}{date=30.09.2010 12:21}{thema=}{post}Паял КР580. "Орион 128".{/post}{/quote}  
Всего-то один год разницы, а я паял "Радио РК-86".  
Процессор I8080 вместо "совкового" К580ВМ80 купил "из-под полы" у "Пионера" на Тверской.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Alex Спасибо за дочес :)  
Я брал то что автор написал и в дочес бы еще дочесал  
потому как можно зацепить чего нибудь лишнего  
Sub repEnRu()  
'R Dmitry  
Dim strR As String, strRt As String, rng As Range  
On Error Resume Next  
Set rng = Application.InputBox(Prompt:="", Title:="Выбор данных для преобразования", Type:=8)  
arrEn = Array("E", "e", "T", "O", "P", "o", "p", "a", "A", "H", "K", "k", "X", "x", "C", "c", "B", "M")  
arrRus = Array("Е", "е", "Т", "О", "Р", "о", "р", "а", "А", "Н", "К", "к", "Х", "х", "С", "с", "В", "М")  
For i = 0 To UBound(arrEn)  
strR = arrEn(i): strRt = arrRus(i)  
rng.Replace What:=strR, Replacement:=strRt, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True  
Next i  
End Sub
Спасибо
Страницы: 1 2 След.
Читают тему
Наверх