因为运行时间比较长,因此设计了用户窗体,以便知道当前运行的进度。不想要用户窗体的话,代码如下:
Sub delFieldLink() Dim shapeLoop As Shape Dim i As Integer Application.ScreenUpdating = False fieldUnlink aFields:=ActiveDocument.Content.Fields On Error Resume Next For Each shapeLoop In ActiveDocument.Shapes If shapeLoop.TextFrame.HasText Then fieldUnlink aFields:=shapeLoop.TextFrame.TextRange.Fields Next On Error GoTo 0 For Each shapeLoop In ActiveDocument.Shapes If shapeLoop.Type = msoLinkedOLEObject Then shapeLoop.LinkFormat.Update shapeLoop.LinkFormat.BreakLink End If Next shapeLoop Application.ScreenUpdating = True End Sub Sub fieldUnlink(aFields As Fields) Dim myField As Field For Each myField In aFields If myField.Type = wdFieldLink Then myField.Unlink '只删除文件链接 Next myField End Sub
我这里测试的结果是这样的,打开文档的时候,好像要先更新链接,不然代码运行的时候会提示找不到链接的文件。但我在另一台机器运行的时候,却可以不需要更新链接。真是奇怪。总觉得这里似乎有个选项,可以在删除图形链接ole的时候,不检查链接的文件,从而大大加快删除图形链接的速度。
测试代码的时候,打开任务管理器,可以看到在删除图形链接时,不断有Excel的进程被打开、关闭,正是这些进程的不断开、关造成了运行很慢。
守柔老师有空请帮忙查一查,是否有某个选项,可以让vba执行shapeLoop.LinkFormat.BreakLink时,不去检查链接文件是否存在。我对word比刚来论坛的时候稍微熟悉一点了,但查找相关帮助资料还是很不得要领。 |