如何设置文本字体,但在 Word 中使用 VBA 保留公式中的字体?
How do I set font for text but keep font in equations in Word with VBA?
我想把所有文字的字体都设置为Times New Roman,我写了这些代码:
Selection.WholeStory
With Selection.Font
.NameAscii = "Times New Roman"
.NameOther = "Times New Roman"
.Name = ""
End With
然而,当我 运行 这些代码时,所有方程式的字体,即 Omath 对象也变成了 Times New Roman,而不是 Cambria Math。
之后我尝试添加这些代码:
For Each Oma In NewDoc.OMaths
With Oma.Range.Font
.Italic = True
.Name = "Cambria Math"
End With
DoEvents
Next
这个确实有效,但是太慢因为代码中有一个for循环。
但是,当我只按 Ctrl+A select 整个故事并手动设置字体时,Word 会自动跳过等式,而在 VBA 中则不会。
所以我想知道有没有什么好的方法可以设置文本的字体而保留方程式的字体?非常感谢!
更新:
我已尝试按照@Timothy Rylatt 的建议进行查找和替换。这是我的代码:
Sub FindReplaceFont()
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.Font.Name = "Consolas"
.Replacement.Font.Name = "Times New Roman"
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Sub
但我遇到了一个奇怪的问题:查找和替换后,两个内联方程之间的文本将合并到一个方程对象中。这是照片:
替换文件之前看起来是这样的:
替换文件后如下所示:
我以前遇到过这个问题,但我仍然不知道为什么会发生这种情况以及如何处理它。对我有什么建议吗?
再次感谢大家
更新:
我已经按照@macropod 的建议解决了这个问题。我应该设置样式的字体而不是直接设置它们。对样式进行简单的 for 循环就可以了!
这取决于您如何格式化文档。
如果您手动应用了字体而不是使用样式,那么最好的选择是使用“查找和替换”。
Sub FindReplaceFont()
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.text = ""
.Replacement.text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.Font.name = "Existing Font Name"
.Replacement.Font.name = "Times New Roman"
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Sub
如果您使用过样式,或者只是将所有内容都保留在默认 'Normal' 样式中,则可以更改基本样式的字体,即 'Normal'.
ActiveDocument.Styles(wdStyleNormal).Font.Name = "Times New Roman"
注意:除非您使用主题字体,否则无法使用 VBA 正确更改默认字体。要使 Table 样式正常工作,Normal 的字体必须匹配文档默认值,只能通过 UI.
设置
答案很简单:
ActiveDocument.Styles(wdStyleNormal).Font.Name = "Times New Roman"
我想把所有文字的字体都设置为Times New Roman,我写了这些代码:
Selection.WholeStory
With Selection.Font
.NameAscii = "Times New Roman"
.NameOther = "Times New Roman"
.Name = ""
End With
然而,当我 运行 这些代码时,所有方程式的字体,即 Omath 对象也变成了 Times New Roman,而不是 Cambria Math。
之后我尝试添加这些代码:
For Each Oma In NewDoc.OMaths
With Oma.Range.Font
.Italic = True
.Name = "Cambria Math"
End With
DoEvents
Next
这个确实有效,但是太慢因为代码中有一个for循环。
但是,当我只按 Ctrl+A select 整个故事并手动设置字体时,Word 会自动跳过等式,而在 VBA 中则不会。
所以我想知道有没有什么好的方法可以设置文本的字体而保留方程式的字体?非常感谢!
更新:
我已尝试按照@Timothy Rylatt 的建议进行查找和替换。这是我的代码:
Sub FindReplaceFont()
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.Font.Name = "Consolas"
.Replacement.Font.Name = "Times New Roman"
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Sub
但我遇到了一个奇怪的问题:查找和替换后,两个内联方程之间的文本将合并到一个方程对象中。这是照片:
替换文件之前看起来是这样的:
替换文件后如下所示:
我以前遇到过这个问题,但我仍然不知道为什么会发生这种情况以及如何处理它。对我有什么建议吗?
再次感谢大家
更新:
我已经按照@macropod 的建议解决了这个问题。我应该设置样式的字体而不是直接设置它们。对样式进行简单的 for 循环就可以了!
这取决于您如何格式化文档。
如果您手动应用了字体而不是使用样式,那么最好的选择是使用“查找和替换”。
Sub FindReplaceFont()
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.text = ""
.Replacement.text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.Font.name = "Existing Font Name"
.Replacement.Font.name = "Times New Roman"
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Sub
如果您使用过样式,或者只是将所有内容都保留在默认 'Normal' 样式中,则可以更改基本样式的字体,即 'Normal'.
ActiveDocument.Styles(wdStyleNormal).Font.Name = "Times New Roman"
注意:除非您使用主题字体,否则无法使用 VBA 正确更改默认字体。要使 Table 样式正常工作,Normal 的字体必须匹配文档默认值,只能通过 UI.
设置答案很简单:
ActiveDocument.Styles(wdStyleNormal).Font.Name = "Times New Roman"