List 将Word宏循环到多个列表段落会导致内存问题
我遇到了一个针对MicrosoftWord的相当简单的vba宏的问题,该宏旨在解决我们在从Word文档创建PDF版本时遇到的列表缩进问题 宏基本上遍历文档中的每个列表,对于与列表关联的每个列表段落,它设置列表模板的项目符号和文本位置,以匹配在段落级别应用的内容(代码需要与Word 2000一起使用,因此不使用列表样式) 在处理大型文档(60多个列表,~350个列表段落)时,宏第一次运行良好,但第二次在运行到一半时消失,出现“此方法或属性不可用,因为内存或磁盘问题” 我已经按照通常的方式取消了循环中使用的任何对象引用,所以我看不出内存中可能存在什么 代码非常简单,由单个过程组成,当前存储在此文档中:List 将Word宏循环到多个列表段落会导致内存问题,list,vba,for-loop,ms-word,List,Vba,For Loop,Ms Word,我遇到了一个针对MicrosoftWord的相当简单的vba宏的问题,该宏旨在解决我们在从Word文档创建PDF版本时遇到的列表缩进问题 宏基本上遍历文档中的每个列表,对于与列表关联的每个列表段落,它设置列表模板的项目符号和文本位置,以匹配在段落级别应用的内容(代码需要与Word 2000一起使用,因此不使用列表样式) 在处理大型文档(60多个列表,~350个列表段落)时,宏第一次运行良好,但第二次在运行到一半时消失,出现“此方法或属性不可用,因为内存或磁盘问题” 我已经按照通常的方式取消了循环
Option Explicit
Sub test2()
Dim i As Integer, n As Integer
Dim curList As List, curPar As Paragraph, templ As ListTemplate
Dim gapSize As Double, level As Integer
Application.ScreenUpdating = False
Application.Options.Pagination = False
For i = 1 To Lists.Count
Set curList = Lists(i)
For n = 1 To curList.ListParagraphs.Count
Set curPar = curList.ListParagraphs(n)
Set templ = curPar.Range.ListFormat.ListTemplate
level = curPar.Range.ListFormat.ListLevelNumber
gapSize = templ.ListLevels(level).TextPosition - templ.ListLevels(level).NumberPosition
templ.ListLevels(level).NumberPosition = curPar.LeftIndent - gapSize
templ.ListLevels(level).TextPosition = curPar.LeftIndent
templ.ListLevels(level).TabPosition = curPar.TabStops.After(curPar.LeftIndent - gapSize).position
Set templ = Nothing
Set curPar = Nothing
Next n
UndoClear
Set curList = Nothing
Next i
Application.ScreenUpdating = True
Application.Options.Pagination = True
End Sub
您的代码看起来不错,我的建议只是尝试以另一种方式执行相同操作的想法…
想法1:在innerloop中的某个位置插入DoEvents,以方便垃圾收集。
想法2:使用FOR-EACH构造简化代码:
For Each curlist in Lists
For each curPar in curList.ListParagraphs
With curPar.Range.ListFormat.ListTemplate
.....
End With
Next curPar
Next curList
除了撤消清除,还可以在每个循环中保存文档 不过,这可能会严重影响宏性能 这里也有类似的问题
希望这能有所帮助。我发现了一个令人讨厌的、肮脏的解决方案,它在某种程度上绕过了这个问题,但实际上是一个非常糟糕的解决方案。基本上,完成宏的一次完整运行后,关闭并保存文档,然后立即重新打开。这样就可以立即或在任何阶段重新运行宏,因为关闭文档似乎最终会正确地刷新内存。显然,只有当用户愿意在运行宏的过程中进行保存时,才能使用此选项,但在我的情况下,您的代码看起来不错。也许在下一个n之前尝试添加一个DoEvents?我在Word2010中看到了一些我怀疑是相同的问题。本质上,在遍历ListPages时,如果我们更改其中一个段落的样式,则ListPages.Count将递减。这导致Word在对for循环的最后一个元素求值for语句时崩溃(最后一个元素现在比我们第一次启动循环时小得多)。史蒂文,你找到合理的解决方案了吗?嗨,蒂亚戈,谢谢你的建议。不幸的是,我试过了,但没有任何好的影响。我试过你的两个建议,但没有乐趣。有了doevents,word应用程序的响应时间会更长,但在完全挂起或出现内存错误之前,它最终会完全被占用。@Steven:对不起,我想我帮不了什么忙了。事实上,我从未编程Word(但我做了很多XL和Access)。最后一次尝试:您是否有Word版本的最新service pack和更新?因为这看起来有点像虫子!也许您可以在宏期间按Ctrl+Shift+Esc,看看Word使用的内存是否增长。但这当然不会给你解决方案:-/再试一次:在Tiago的链接中,有一个有趣的建议:执行撤销。不时清除。你可以试试看!