替换Microsoft Word中的单词保留VBA中的原始大小写

时间:2017-04-01 21:56:46

标签: ms-word word-vba case-sensitive

我是这方面的新手,通常会使用谷歌搜索答案,但无法在任何地方找到答案。

我正在制作一个小程序来替换MS Word文档中的单词,我想保留单词的原始大小写。让我们说,有一个表达:"碎玻璃"。我想将其修改为" Cristal Roto"。

为了做到这一点,我有两个文本框,输入和输出。输入是要替换的术语所在的位置,输出是输入术语将被替换的单词。现在举个例子,我会把"碎玻璃"在(输入)文本框中," Cristal Roto"在(输出)文本框中。

Word文档中的结果将是" Cristal roto",所以无论我尝试什么单词组合,第二个单词的第一个字母都会小写。我正在使用此代码替换现在的单词:

Dim rng As Word.Range
        rng = objWordS.ActiveDocument.Content
        With rng.Find
            .ClearFormatting()
            .Execute(FindText:=Input.Text, _
                     ReplaceWith:=Output.Text, _
                     MatchWholeWord:=True, _
                     Replace:=Word.WdReplace.wdReplaceAll)
        End With

我只关心每个单词第一个字母的原始大小写。 我希望理解我想要的东西并不太难。谢谢你的关注!

修改

好吧,为什么"碎玻璃"结果是" Cristal roto"尽管打字就像" Cristal Roto"在输出文本框中,我错过了在上面的代码中添加它:

.Replacement.ClearFormatting()

我在.ClearFormatting和.Execute之间添加了。

现在Word文件中的文本被替换为我在输出texbox中使用的外壳。不过,我想知道是否有办法检测Word文件中原始单词的大小,以便在不使用Proper Casing的情况下自动调整输出文本框的文本。所以: 替换:"碎玻璃" - 替换文字:" cristal roto" - 期望的结果:" Cristal Roto"。谢谢!

2 个答案:

答案 0 :(得分:1)

尝试在执行搜索时将Output.Text解析为ProperCase。这样的事情应该有效:

ReplaceWith:=StrConv(Output.Text, vbProperCase)

更短更清洁。但你仍然必须使用ProperCase,不知道这是否符合你的需要

答案 1 :(得分:0)

我最终做了我想要的事情:

Dim rng As Word.Range
        rng = objWordS.ActiveDocument.Content
        With rng.Find
            .ClearFormatting()
            .Replacement.ClearFormatting()
            .Execute(FindText:=InputText)
            If rng.Text = rng.Text.Substring(0, 1).ToLower() + rng.Text.Substring(1) Then
                .Execute(ReplaceWith:=Output.Text.Substring(0, 1).ToLower() + Output.Text.Substring(1).ToLower, _
                         MatchWholeWord:=True, _
                         Replace:=Word.WdReplace.wdReplaceAll)
            End If
            If rng.Text = rng.Text.Substring(0, 1).ToUpper() + rng.Text.Substring(1) Then
                .Execute(ReplaceWith:=Output.Text, _
                         MatchWholeWord:=True, _
                         Replace:=Word.WdReplace.wdReplaceAll)
            End If
        End With

这样,我不必每次都手动更换外壳,这样做的目的是根据第一个字符是大写字母还是小写字母来替换单词。如果它是大写的,文本将被替换为输出中使用的外壳(例如BroKeN WindoW)。

如果它是小写的,那么它将替换低于输出内容的单词(例如,破碎的窗口)。通过这种方法,我可以在将来实现新条件,例如"如果第一个单词的第一个字母是大写,但第二个单词的第一个字母是小写,那么......& #34 ;.我希望这对其他人也有用。

实际上,我甚至可以使用Proper Casing实现一个条件来实现我在EDIT主题中提出的要求。

感谢您的时间和帮助!