2017-02-02 49 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

你需要測試速度更快,使用查找或循環文檔的字符。應該可以像ActiveDocument.Characters中的For Each c一樣來「走動」文檔中的每個字符。但問題仍然是如何識別角色及其替代品。如果您知道西里爾文字符的Unicode編號,那麼您可以測試該編號並「查找」等價物。例如,「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