使用vba宏/python代码更新word目录——只更新页码
工作中出现了如题的需求。实际上这个操作人工的话只需要右键区域→更新域→选择只更新页码然后确定就行了。不过工作需求就是得用代码去完成以上事情。
这个问题的主体部分就是找到相关的代码……实际上关于这一点网上已有不少教程,比如这一篇就实际上作为原型让我写出了我实际使用的代码:
Sub UpdateContent()Dim i AsInteger
i=0Dim aStory As Range
Dim aField AsFieldFor Each aStory In ActiveDocument.StoryRanges
For Each aField In aStory.Fields
If i<4Then:
aField.Update
i=i+1Next aField
Next aStory
EndSub
注意i相关的操作是我自己加的,因为我只想刷新目录,所以不需要真的遍历全部域。
本来问题到这里就该解决了,我成功在自己电脑上跑通了这个程序,第二天拿到工作的地方……
然后发现他们只有WPS。
WPS也是有宏功能的。这没问题。
问题在于,这一段代码在WPS中运行的表现是“更新整个目录”而不是默认的“只更新页码”。
而录制宏录下来的是一句“…Field.ShowCode=False”,牛头不对马嘴,而且确实没有效果。
找了很久最后找了wps的技术客服,然后得到解决办法了:
Sub UpdateContent()Dim aStory As Range
Dim aField AsFieldFor Each aStory In ActiveDocument.StoryRanges
For Each aField In aStory.Fields
if aField.Type==37:
aField.Update
Next aField
Next aStory
EndSub
页码本身也是域,然后类型标识是37,所以只要这么指定就会只更新页码了。
说真的,这个操作不看手册真的八辈子都想不出。而VBA里面那个帮助文档简直就和不存在差不多。
不过最后还是在MSDN上找到类型标识的列表了。这里是链接
不过话说回来,虽然问题是解决了哈……
那为啥word里面之前那段代码就是只更新页码呢……
而且我后面的代码在调试中发现进了if的次数有100多次之多,基本上就是一半不到一点点的field数(大概一半是标题一半是页码),但前面的代码我显然只跑了前4个field……两个程序对同一文件处理的运行速度也是天差地别。
如果说word中我是update了靠前的、目录整体的大框架,而这个update默认更新的是页码……那在word中又要如何更新整个目录呢?(顺带一提word中去掉i<4的限制也是只更新页码,虽然用时会飙升)
(这和python又有啥关系?请见另一篇文章(这算引流吗))
版权归原作者 虚境 所有, 如有侵权,请联系我们删除。