Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 将Word宏循环到多个列表段落会导致内存问题_List_Vba_For Loop_Ms Word - Fatal编程技术网

List 将Word宏循环到多个列表段落会导致内存问题

List 将Word宏循环到多个列表段落会导致内存问题,list,vba,for-loop,ms-word,List,Vba,For Loop,Ms Word,我遇到了一个针对MicrosoftWord的相当简单的vba宏的问题,该宏旨在解决我们在从Word文档创建PDF版本时遇到的列表缩进问题 宏基本上遍历文档中的每个列表,对于与列表关联的每个列表段落,它设置列表模板的项目符号和文本位置,以匹配在段落级别应用的内容(代码需要与Word 2000一起使用,因此不使用列表样式) 在处理大型文档(60多个列表,~350个列表段落)时,宏第一次运行良好,但第二次在运行到一半时消失,出现“此方法或属性不可用,因为内存或磁盘问题” 我已经按照通常的方式取消了循环

我遇到了一个针对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的链接中,有一个有趣的建议:执行撤销。不时清除。你可以试试看!