2017-02-02 17 views
0

Я хочу сделать макросы в VBA, переведя кириллические буквы в латинские буквы.
В настоящее время я используюзаменить кириллические буквы на латинские

Selection.Find.ClearFormatting 
Selection.Find.Replacement.ClearFormatting 

With Selection.Find 
    .Text = "Ш" 'cyrillic letter 
    .Replacement.Text = "Sh" 'latin letter 

    .Forward = True 
    .Wrap = wdFindContinue 
    .Format = False 
    .MatchCase = True 
    .MatchWholeWord = False 
    .MatchWildcards = False 
    .MatchSoundsLike = False 
    .MatchAllWordForms = False 
End With 
Selection.Find.Execute Replace:=wdReplaceAll 

и повторить его для всех букв. Этот метод работает. Но он очень медленно работает с большим документом, потому что более 50 раз вызывает Selection.Find.Execute.

Вопрос: Могу ли я решить его быстрее? Например, что-то вроде

Selection.Find.ClearFormatting 
Selection.Find.Replacement.ClearFormatting 

With Selection.Find 
    .Text = "^$" 'Finds any letter 
    .Replacement.Text = "\\1" ' ---> There I don't know how retrieve 
           ' found letter 


    .Forward = True 
    .Wrap = wdFindContinue 
    .Format = False 
    .MatchCase = True 
    .MatchWholeWord = False 
    .MatchWildcards = False 

    .MatchSoundsLike = False 
    .MatchAllWordForms = False 
End With 
Selection.Find.Execute Replace:=wdReplaceAll 

Или я могу решить это с другим способом (Application.ActiveDocument.Characters или Application.ActiveDocument.Words и т.д.), не потерять форматирование?

+0

Вы должны были бы проверить, что быстрее, с помощью функции поиска или перекручивание символов документа. Должно быть возможно сделать что-то вроде «Для каждого c в ActiveDocument.Characters» для «ходьбы» каждого символа в документе. Но проблема остается в том, как идентифицировать персонажей и их замены. Если вы знаете номер юникода для кириллических символов, вы можете проверить это число и «найти» эквивалент. Например, символ «sh»: если Chr (c.Text) = 1064 Then », и здесь вызывается функция, которая возвращает« sh », которую вы пишете в документе. –

+0

Я знаю, как гулять с ActiveDocument.Characters, но не знаю, замените его содержимое? –

+0

Основываясь на фрагменте в моем предыдущем комментарии, используя объект c: c.Text = "sh". Подумав об этом, это может запутать Word, когда вы заменяете один символ несколькими символами. Возможно имеет смысл написать второй документ в фоновом режиме, вместо того, чтобы изменять оригинал во время работы ... –

ответ

0

Это то, что я хотел бы использовать:

  1. Удалить выбранные параметры и установить их в качестве диапазона, если это возможно.

  2. Отключить ScreenUpdating, это будет лучше.

    Sub Replacer() 
    
    Dim rng1 As Range 
    
    call onstart 
    
    Set rng1 = Activedocument.Range 
    
    With rng1.Find 
        .Text = "Ш" 'cyrillic letter 
        .Replacement.Text = "Sh" 'latin letter 
    
        .Forward = True 
        .Wrap = wdFindContinue 
        .Format = False 
        .MatchCase = True 
        .MatchWholeWord = False 
        .MatchWildcards = False 
        .MatchSoundsLike = False 
        .MatchAllWordForms = False 
    End With 
    
    call onend 
    
    End Sub 
    
    Public Sub OnEnd() 
    
    Application.ScreenUpdating = True 
    Application.DisplayAlerts = True 
    Application.StatusBar = False 
    
    End Sub 
    
    Public Sub OnStart() 
    
    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 
    
    End Sub 
    

 Смежные вопросы

  • Нет связанных вопросов^_^