有些字符在vba宏中丢失格式,其他字符则没有

时间:2016-08-03 11:35:09

标签: vba unicode ms-word macros

我有许多在Unicode前时代制作的文档,包含各种语言的转录,每种语言都有自己的字体。 我创建了一个宏,用另一个字符(从多个旧的转录字体转换为unicode字体)替换文档中的每个字符。 (有关其中一种字体的宏,请参见下面的代码)

出于某种原因,宏保留了某些字符的格式(在我的情况下,大多数是斜体),而不是其他字符。这留下了许多单词,其中一些字母用斜体字表示,而其他字母则不用,例如。

al-Malik al-Mu ǧāhidḫu ba

丢失格式的字符都是带有变音符号的字符,但并非所有带有变音符号的字符都会丢失其格式(例如,示例中的ḫ)。 并非所有保留其格式的字符在原始字体中都具有与unicode字体相同的代码点(例如,示例中的ḫ在原始字体中具有unicode编号U + 23,在unicode字体中具有U + 1E2B)。 / p>

您是否知道为什么要为某些字符保留格式,而不是为其他字符保留格式?或者我如何解决这个问题?

或者,我可以在程序中添加另一个宏,将所有包含至少一个斜体字母的单词格式化为斜体(但如何做到这是另一个问题:MS Word macro to correct partially formatted words)。

inn()

2 个答案:

答案 0 :(得分: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& A)我不这么认为。

至于解决方案,有很多方法可以满足您的需求,正如您在other question中解决的那样,我不认为这可以通过一揽子方式完成(即没有办法在执行查找和替换后,不保留信息,将所有斜体设置为斜体。所以它必须在交换字符时完成,这意味着它只能在一次性能影响的时候进行一次查找和替换。

在下面的例子中,我也使用了上面描述的较短阵列方法。

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

(此代码未经测试并形成以示例解决方案)

答案 1 :(得分:0)

您可以尝试关闭自动更正功能,因为它可以替换某些字符。

在Word中,字符具有段落样式和字符样式,因此您可以尝试查看这些:

<div id="myModal1" class="modal hide" role="dialog">