2016-08-03 4 views
2

私は、Unicode前の時代に作られた多数のドキュメントを持ち、それぞれに独自のフォントを持つさまざまな言語の文字列を含んでいます。 ドキュメント内のすべての文字を別の文字に置き換えるマクロを作成しました(複数の古い転写フォントからユニコードフォントへ)。 (これらのフォントのいずれかのマクロの下のコードを参照してください)いくつかの文字がvbaマクロの書式を失うものはありません

何らかの理由で、マクロは、一部の文字の書式設定(私の場合はほとんどイタリック体)を保持します。これは、いくつかの文字がイタリック体になっている多くの単語を私に残し、他の文字はそうではありません。

アル・マリク・アル・ムーǧāはHUを隠し T BA

の書式を失う発音区別記号付きすべての文字がありますが、発音区別記号付きではないすべての文字が(例えば、その書式設定を失う文字この例では)。 フォーマットを維持するすべての文字が、ユニコードフォントと同じコードポイントを元のフォントに持つわけではありません(例では、theはユニコード番号U + 23を元のフォントに、U + 1E2Bをユニコードフォントにします)。

なぜ一部の文字では書式設定が維持されているのか、他の文字では書式設定が維持されているのでしょうか?またはこの問題をどうやって解決できるか?

また、イタリック体で少なくとも1つの文字を含むすべての単語をイタリック体にフォーマットする別のマクロをプロシージャに追加することもできます(ただし、別の質問:MS Word macro to correct partially formatted words)。

Sub BatchReplaceAOTimes() 

'Replace the font AO Times New Roman in the body and footnotes 
'of the active document 

Debug.Print "Replacing AO Times New Roman font" 
Dim old_values(270) As String 
Dim unicode_values(270) As Long 

old_values(0) = &H30 
old_values(1) = &H31 
(...) 
old_values(263) = &HFD 
old_values(264) = &HDD 
old_values(265) = &H178 
old_values(266) = &HFF 
old_values(267) = &H5A 
old_values(268) = &H7A 
old_values(269) = &H2C 
old_values(270) = &H9 

unicode_values(0) = &H30 
unicode_values(1) = &H31 
(...) 
unicode_values(263) = &H2BE 
unicode_values(264) = &H2BF 
unicode_values(265) = &H1E6E 
unicode_values(267) = &H5A 
unicode_values(268) = &H7A 
unicode_values(269) = &H2C 
unicode_values(270) = &H9 

Selection.HomeKey Unit:=wdStory 

Dim ThisRng As Range 

'do body text 
Set ThisRng = ActiveDocument.StoryRanges(wdMainTextStory) 
For i = 0 To 270 
    Debug.Print i 

    ThisRng.Find.ClearFormatting 
    ThisRng.Find.Replacement.ClearFormatting 

    With ThisRng.Find 
     .Font.Name = "AO Times New Roman" 
     .Text = ChrW(old_values(i)) 
     .Replacement.Font.Name = "Arial Unicode MS" 
     .Replacement.Text = ChrW(unicode_values(i)) 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = True 
     .MatchWholeWord = False 
     .MatchKashida = False 
     .MatchDiacritics = False 
     .MatchAlefHamza = False 
     .MatchControl = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 
    ThisRng.Find.Execute Replace:=wdReplaceAll 
    Next i 

    (...: do the same for the footnotes) 

    End Sub 

答えて

0

一部の文字を置き換えることができるように自動補正をオフにすることができます。あなたがそれらに探して試すことができますので、Wordの文字で

は、段落スタイルと文字スタイルを持っている:あなたのように配列を設定した場合

まず
Debug.Print ThisRng.Style.Description 
Debug.Print ThisRng.CharacterStyle.Description 
Debug.Print ThisRng.ParagraphStyle.Description 
2

、単なる提案として、あなたは小さなコードベースを持つことができます: -

Dim ValueMap(270) As String 
Dim AryTemp()  As String 
ValueMap(0) = "&H30|&H30" 

For i = 0 To 270 
    AryTemp = Split(ValueMap(i),"|") 
    'AryTemp(0) = The Old 
    'AryTemp(1) = The New 
Next 

あなたの質問に対する回答です。私はイタリック体を失うのを止める方法を知らないが、これはフォーマットの代わりにスタイルを使ってイタリック体にすることによって引き起こされる可能性があると思われるが、その深さはこの環境に適合しないだろう(Q &)私は思っていません。

解決策としては、あなたが必要とすることを行うための多くの方法があります。other questionで解決されたように、私はこれがブランケット方式で行われるとは思わない(つまり、一度にイタリック体にイタリック体に戻る)、検索と置換が実行された後に情報が保持されないためです。したがって、文字がスワップされた時点で完了する必要があります。つまり、一度に1つの検索と置換を実行するだけで、パフォーマンスに影響します。

以下の例では、上記の短い配列方法も使用しました。

Public Sub Sample() 
Dim BlnWasItalic  As Boolean 
Dim AryValueMap(270) As String 
Dim AryTemp()   As String 
Dim LngLocation   As Long 
Dim LngValueID   As Long 
Dim WdDoc    As Word.Document 
Dim WdFnd    As Word.Find 
Dim WdRng    As Word.Range 
Dim WdSlct    As Word.Selection 

AryValueMap(0) = "&H30|&H30" 
AryValueMap(1) = "&H31|&H31" 
'... 
AryValueMap(269) = "&H2C|H2C" 
AryValueMap(270) = "&H9|&H9" 

Set WdDoc = ThisDocument 
    For Each WdRng In WdDoc.StoryRanges 
     For LngValueID = 0 To 270 
      WdRng.Select 
      Set WdSlct = Selection 
       WdSlct.SetRange 0, 0 
       Set WdFnd = WdSlct.Find 

        'Clear any previous find settings 
        If LngValueID = 0 Then 
         WdFnd.ClearAllFuzzyOptions 
         WdFnd.ClearFormatting 
         WdFnd.ClearHitHighlight 

         .Font.Name = "AO Times New Roman" 

        End If 

        AryTemp = Split(AryValueMap(LngValueID), "|") 

        'Look for any italic character 
        Do Until Not WdFnd.Execute(FindText:=ChrW(AryTemp(0)), MatchCase:=True, _ 
               MatchWholeWord:=False, MatchWildcards:=False, _ 
               MatchSoundsLike:=False, MatchAllWordForms:=False, _ 
               Forward:=True, Wrap:=wdFindStop, Format:=True, _ 
               ReplaceWith:="", Replace:=wdReplaceNone, _ 
               MatchKashida:=False, MatchDiacritics:=False, _ 
               MatchAlefHamza:=False, MatchControl:=False) 

         'Take note if it was italic 
         BlnWasItalic = WdSlct.Font.Italic 

         'Make the replacement 
         WdSlct = ChrW(AryTemp(1)) 

         'Remember the location (in case there are due to be more than 
         'one change in one word 
         LngLocation = WdSlct.End 

         'Expand the selection to the whole word 
         WdSlct.Expand wdWord 

         'Set the font 
         WdSlct.Font.Name = "Arial Unicode MS" 

         'Set the word to be italic if it was meant to be 
         WdSlct.Font.Italic = BlnWasItalic 

         'Move past the word 
         WdSlct.SetRange LngLocation, LngLocation 
        Loop 
       Set WdFnd = Nothing 
      Set WdSlct = Nothing 
      DoEvents 
     Next 
     DoEvents 
    Next 
Set WdDoc = Nothing 
End Sub 

(このコードは、テストされていないし、溶液を例示するために形成されている)

関連する問題