Microsoft Word 对象 -> ThisDocument模块 -> 模块1
你要操作的是 模块1 ,不是 ThisDocument,也不是"引用"。
你现在该怎么做
第 1 步:双击"模块1"
在左侧项目树里,双击:
text
模块1
右边会出现代码窗口。
第 2 步:把代码放进"模块1"
如果里面已经有你之前那段旧宏,可以直接删掉,换成下面这段。
这段已经把字体设成 STIX Two Math 了:
vb
Sub FixEquationStyleSmart()
Dim rngStory As Range
Dim eq As OMath
Dim r As Range
Dim funcs As Variant
Dim i As Long
funcs = Array( _
"sin", "cos", "tan", "cot", "sec", "csc", _
"arcsin", "arccos", "arctan", _
"sinh", "cosh", "tanh", _
"ln", "log", "lg", "exp", _
"lim", "min", "max", "sup", "inf", _
"det", "dim", "mod", "gcd", "lcm", _
"ker", "deg", "arg", "Pr" _
)
Application.ScreenUpdating = False
For Each rngStory In ActiveDocument.StoryRanges
Do
For Each eq In rngStory.OMaths
eq.Range.Font.Name = "STIX Two Math"
eq.Range.Font.Italic = True
For i = LBound(funcs) To UBound(funcs)
Set r = eq.Range.Duplicate
With r.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = funcs(i)
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = True
.MatchWholeWord = True
.MatchWildcards = False
End With
Do While r.Find.Execute
r.Font.Italic = False
r.Font.Name = "STIX Two Math"
r.Collapse wdCollapseEnd
Loop
Next i
Next eq
Set rngStory = rngStory.NextStoryRange
Loop Until rngStory Is Nothing
Next rngStory
Application.ScreenUpdating = True
MsgBox "公式已处理完成。", vbInformation
End Sub
你要注意
这句已经帮你设置字体了:
vb
eq.Range.Font.Name = "STIX Two Math"
所以你不用再去别的地方设置字体名。
第 3 步:运行宏
把光标点到这段代码里面任意一行,然后按:
text
F5
如果键盘上的 F5 不方便,也可以点顶部菜单:
text
运行 -> 运行子过程/用户窗体
第 4 步:回到 Word 看结果
运行完后,回到论文文档里检查公式:
- 字体会尽量改成 STIX Two Math
- 单个变量通常会是斜体
sin、cos、ln、log、lim这些会尽量保持正体
你现在不用碰的地方
你当前左侧这些里:
ThisDocument:不用点引用:不用点模块1:就操作这里
如果"模块1"里已经有旧代码
你有两种做法。
做法 A:直接全部替换
把原来代码全删掉,粘贴我上面这段新的。
做法 B:保留旧宏,再加一个新宏
如果你想保留旧的,也可以把新代码直接粘在旧代码下面。
只要宏名字不同就行。
你现在这个新宏名字是:
vb
FixEquationStyleSmart
运行后如果没有变化
最常见有 3 个原因:
1. 文档里的公式不是 Word 自带公式
如果是 MathType 公式或图片,这个宏改不了。
它只能处理 Word 内置公式。
2. 宏没真的运行
看有没有弹出:
text
公式已处理完成。
如果没弹,说明没跑成功。
3. 某些公式本身被手动设置过特殊格式
这种少数情况可能要单独再处理。
保存怎么选
因为你把宏放在 Project(学位论文) 下面:
- 想保留这段宏代码:保存为
.docm - 只想保留改好的公式结果:保存为
.docx也可以
也就是说,公式修改结果会保留 ,只是宏代码本身在 .docx 里通常不会保留。
你现在就做这一件事:
双击"模块1"→ 把代码换成上面这段 → 按 F5。
把宏搬到 Normal(Normal.dotm) 的意思是:
把代码从 当前文档的 VBA 项目 移到 Word 的全局模板 里。这样以后任何 Word 文档都能运行这个宏,而且你的论文仍然可以保存成 .docx。
我给你一步一步操作(照做基本不会错)👇
一、打开 VBA 编辑器
在 Word 里按:
Alt + F11
左侧会看到类似:
MathTypeCommands (MathType Commands 2016)
Normal
Project()
Project(EndNote Cwyw)
Project(学位论文)
二、在 Normal 里新建模块
在左侧找到:
Normal
展开它。
你会看到类似:
Normal
Microsoft Word 对象
ThisDocument
然后:
1️⃣ 右键点击 Normal
选择:
插入 → 模块
这时会出现:
Normal
模块
Module1
(名字可能是 Module1 或 Module2)
三、把宏代码粘进去
双击刚刚创建的:
Module1
右边会出现代码窗口。
把你的宏 完整粘进去:
vb
Sub FixEquationStyleSmart()
Dim rngStory As Range
Dim eq As OMath
Dim r As Range
Dim funcs As Variant
Dim i As Long
funcs = Array( _
"sin", "cos", "tan", "cot", "sec", "csc", _
"arcsin", "arccos", "arctan", _
"sinh", "cosh", "tanh", _
"ln", "log", "lg", "exp", _
"lim", "min", "max", "sup", "inf", _
"det", "dim", "mod", "gcd", "lcm", _
"ker", "deg", "arg", "Pr" _
)
Application.ScreenUpdating = False
For Each rngStory In ActiveDocument.StoryRanges
Do
For Each eq In rngStory.OMaths
eq.Range.Font.Name = "STIX Two Math"
eq.Range.Font.Italic = True
For i = LBound(funcs) To UBound(funcs)
Set r = eq.Range.Duplicate
With r.Find
.Text = funcs(i)
.Forward = True
.Wrap = wdFindStop
.MatchCase = True
.MatchWholeWord = True
End With
Do While r.Find.Execute
r.Font.Italic = False
r.Font.Name = "STIX Two Math"
r.Collapse wdCollapseEnd
Loop
Next i
Next eq
Set rngStory = rngStory.NextStoryRange
Loop Until rngStory Is Nothing
Next rngStory
Application.ScreenUpdating = True
MsgBox "公式已处理完成。"
End Sub
四、运行宏
把光标放到代码里任意位置,然后按:
F5
或者回到 Word 按:
Alt + F8
选择:
FixEquationStyleSmart
点击 运行。
五、保存 Normal 模板(关键)
关闭 Word 时,Word 很可能会弹出提示:
是否保存 Normal.dotm 的更改?
一定要点:
保存
这样宏才会永久存在。
六、以后使用方法
以后在任何 Word 文档里:
按
Alt + F8
就能看到:
FixEquationStyleSmart
点击运行即可。
你的论文仍然可以保存为:
xxx.docx
不会再出现 模块消失 的问题。
七、一个小建议(很重要)
以后不要把宏放在论文文档里,统一放到:
Normal → 模块
原因:
| 位置 | 结果 |
|---|---|
| Project(论文) | docx 保存会丢 |
| Normal | 永久存在 |
如果你愿意,我可以再教你一个更稳的版本 :
运行时只修改 选中的公式,而不是整篇文档全部扫描。这样对论文更安全。