私は、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