【问题标题】:Word runs out of memory when running macro on 27 page document在 27 页文档上运行宏时 Word 内存不足
【发布时间】:2021-03-04 11:23:23
【问题描述】:

这篇文章被交叉发布在Microsoft Answers forum

我下面的宏用于保护有问题的 Word 文档。当它在较小的文档(4-10 页)上运行时,它工作得很好,但是我们有一个更大的 27 页文档(6000 字),它似乎占用了所有的内存!我运行它,结果让我僵住了。

这里是 OneDrive 可重现示例的链接:https://1drv.ms/w/s!AgPO3BotYSt7iHvafHts2HyF2OjB?e=HSOI57

不确定通过 OneDrive 访问时格式是否成立,但单击复选框时会显示 X。

“您将如何满足推荐的描述”后面是一个文本字段,以便用户输入文本。同样处理“负责任的团队”和“为什么你不同意:”

宏运行后,整个文档应该被锁定,除了红色的文本以及上述格式。

是否可以调整宏以节省一些内存,使其在用于较大文件时运行?

这是宏:

Sub Lock_Teammate_DraftReports_mp()

Selection.HomeKey wdStory

Selection.Find.ClearFormatting

Selection.Find.Font.ColorIndex = wdRed

With Selection.Find

    Do While .Execute(FindText:="", Forward:=True, MatchWildcards:=False, Wrap:=wdFindStop) = True

        Selection.Editors.Add wdEditorEveryone

        Selection.Collapse wdCollapseEnd

    Loop

End With

ActiveDocument.Protect Password:="example123", NoReset:=False, Type:=wdAllowOnlyReading, 
UseIRM:=False, EnforceStyleLock:=False

End Sub

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    您的问题很可能与您的代码正在执行的所有选择有关,这既低效又容易导致大量滚动和屏幕闪烁。试试:

    Sub Lock_Teammate_DraftReports_mp()
    Application.ScreenUpdating = False
    Dim i As Long
    With ActiveDocument
      With .Range
        With .Find
          .ClearFormatting
          .Font.ColorIndex = wdRed
          .Text = ""
          .Forward = True
          .Wrap = wdFindStop
          .MatchWildcards = False
        End With
        Do While .Find.Execute = True
          i = i + 1
          If .Information(wdWithInTable) = True Then
            If .Rows(1).Range.Font.ColorIndex = wdRed Then .End = .Rows(1).Range.End
            If .End = .Cells(1).Range.End - 1 Then .End = .Cells(1).Range.End
            If .Information(wdAtEndOfRowMarker) = True Then .End = .End + 1
          End If
          .Editors.Add wdEditorEveryone
          If .End = ActiveDocument.Range.End Then Exit Do
          .Collapse wdCollapseEnd
          If i Mod 100 = 0 Then DoEvents
        Loop
      End With
      .Protect Password:="example123", NoReset:=False, Type:=wdAllowOnlyReading, UseIRM:=False, EnforceStyleLock:=False
    End With
    Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

    • 谢谢你,但运行时它仍然冻结。我应该注意到这个特定的文档有 Word 表格和图像。无论如何这会影响宏观吗?
    • 我发布的代码应该比您使用的要快得多。也就是说,表格会对文档造成重大的性能影响,特别是如果允许它们或它们的列/行自动调整大小(即使没有发生大小变化)。最重要的是,查找/替换不能跨表格单元格边界工作,这意味着每个红色单元格必须单独处理。这可能适合也可能不适合您的目标。因此,即使没有自动调整大小,任何所需的逐个单元处理都会减慢速度。请耐心等待。
    • 在 Do While 循环中插入 DoEvents 语句可能会有所帮助。
    • 虽然这可能会使 Word 看起来更具响应性,并允许一个人在不等待宏完成的情况下打破宏,但我怀疑在每次迭代时执行 DoEvents 是否可以加快速度 - 它可能会减慢速度。
    • 我的看法是,Word 不仅速度变慢,而且实际上挂起,可能是因为内存不足(尽管这似乎不太可能,但 Windows 有时会使用该错误消息来表示“原因不明”)。在这种情况下,DoEvents 可以允许垃圾回收释放不再使用的内存。
    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多