目录
一、准备
1.调用MathType库
(1)点开发工具-工具-引用
![](https://i-blog.csdnimg.cn/blog_migrate/23c2d8e7c50447e23dcfbc423a861534.jpeg)
(2)勾选【MathTypeCommands】类
![](https://i-blog.csdnimg.cn/blog_migrate/29d769ef70b437b21f9854a4ba5deea5.jpeg)
2.内部方法/命令
MathTypeCommands.MTCommand_TeXToggle
意思是在MathType格式和Latex格式之间,切换所选区域公式的格式
二、操作方法
因为是通过VBA代码编写我们既可以写循环(对选区的每个公式单独选中,切换),又可以一步完成(全选需要处理的所有公式,直接写一条语句即可完成)。简单对比一下:
1.假设需求
这里准备了两内容相同的文档,都是34页公式,我们对全文公式操作。
![](https://i-blog.csdnimg.cn/blog_migrate/a33b79b55ea542999028724e299e076e.jpeg)
2.处理速度对比
(1)循环方法
A.示例代码
Rem 运行此代码请先勾选上MathType库
Sub mtEqToLatex()
Dim fd As Field
Dim fw As Range
Dim i As Long
t0 = Now
Set fw = Selection.Range
If fw.Start = fw.End Then Exit Sub
Application.ScreenUpdating = False
For Each fd In fw.Fields
If fd.Code Like "*EMBED Equation.*" Then
fd.Select
MathTypeCommands.MTCommand_TeXToggle
i = i + 1
End If
Next
fw.Select
Application.ScreenUpdating = True
Set fw = Nothing
Set fd = Nothing
Debug.Print DateDiff("s", t0, Now)
MsgBox Format(i, "完成 共处理了0个公式")
End Sub
B.测试结果
全选【文档1】,运行上面的代码
![](https://i-blog.csdnimg.cn/blog_migrate/457e854fc8678dc5eae7b171574ffa4a.jpeg)
在立即窗口看到,运行完成用了149秒,速度挺慢。
(2)直接运行
A.示例代码
Rem 运行此代码请先勾选上MathType库
Sub mtEqToLatex_All()
Dim fd As Field
Dim fw As Range
Dim i As Long
t0 = Now
Set fw = Selection.Range
If fw.Start = fw.End Then Exit Sub
Application.ScreenUpdating = False
For Each fd In fw.Fields
If fd.Code Like "*EMBED Equation.*" Then
i = i + 1
End If
Next
MathTypeCommands.MTCommand_TeXToggle
fw.Select
Application.ScreenUpdating = True
Set fw = Nothing
Set fd = Nothing
Debug.Print DateDiff("s", t0, Now)
MsgBox Format(i, "完成 共处理了0个公式")
End Sub
B.测试结果
全选【文档2】,运行上面的代码
![](https://i-blog.csdnimg.cn/blog_migrate/6d4505e1c2c13fdef16958d2090d1e4a.jpeg)
在立即窗口看到,运行完成用了???秒。
大概运行了4-5分钟,屏幕还在一直抖动,因为运行太慢,就手动停止了。(此时还只运行到第5页)
这种方法运行更慢,不可取。
三.分析
最初还以为全选一次运行可以更快,因为我认为MathType插件里面应该优化了方法,本来就是循环。但是最终的结果并不是。
所以说有时候代码操作和手动操作的区域还是很大的。
四、完整思路与代码
1.思路
(1)选择区域,防止误操作
(2)遍历区域内的域,因为MathType公式的域代码必定包含【EMBED Equation.】,用like方法比较判断是否为MathType公式
注:此处可以用MathType内部方法逐个选中公式,有兴趣可先自行研究,后面可能会专门讲
(3)如果是MathType公式,则选中这个域(公式)所在区域,执切换命令,然后计数
(4)循环完成,操作结束
2.最终推荐代码
Rem 运行此代码请先勾选上MathType库
Sub mtEqToLatex()
Dim fd As Field
Dim fw As Range
Dim i As Long
t0 = Now
Set fw = Selection.Range
If fw.Start = fw.End Then Exit Sub
Application.ScreenUpdating = False
For Each fd In fw.Fields
If fd.Code Like "*EMBED Equation.*" Then
fd.Select
MathTypeCommands.MTCommand_TeXToggle
i = i + 1
End If
Next
fw.Select
Application.ScreenUpdating = True
Set fw = Nothing
Set fd = Nothing
Debug.Print DateDiff("s", t0, Now)
MsgBox Format(i, "完成 共处理了0个公式")
End Sub