Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Vba 在27页文档上运行宏时Word内存不足_Vba_Ms Word - Fatal编程技术网

Vba 在27页文档上运行宏时Word内存不足

Vba 在27页文档上运行宏时Word内存不足,vba,ms-word,Vba,Ms Word,这篇文章被交叉张贴在地图上 下面我的宏用于保护有问题的word文档。当它在较小的文档(4-10页)上运行时,它工作得很好,但是我们有一个更大的27页文档(6000字),它似乎占用了所有的内存!我运行了它,这个词最终在我身上冻结了 以下是指向OneDrive可复制示例的链接: 不确定通过OneDrive访问时格式是否有效,但单击时复选框显示X “如何满足建议的说明”后面有一个文本字段,用户可以输入文本。与“负责任的团队”和“你为什么不同意的理由”相同 宏运行后,应锁定整个文档,但红色文本和上述格式

这篇文章被交叉张贴在地图上

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

以下是指向OneDrive可复制示例的链接:

不确定通过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

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

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

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

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可能会允许垃圾收集释放不再使用的内存。谢谢,但在运行时仍会冻结。我应该注意到,此特定文档包含Word表和图像。无论如何,这会影响宏吗?我发布的代码应该比您使用的要快得多。也就是说,表对文档的性能有很大的影响,特别是当它们或它们的列/行被允许自动调整大小时(即使没有发生大小更改)。最重要的是,“查找/替换”不能跨表格单元格边界工作,这意味着每个红细胞必须以其自身的权限进行处理。这可能适合也可能不适合你的目标。因此,即使没有自动调整大小,任何所需的逐单元处理也会降低速度。耐心一点。在Do While循环中插入DoEvents语句可能会有帮助。虽然这可能会使Word看起来更具响应性,并允许您在不等待宏完成的情况下跳出宏,我怀疑在每次迭代中执行DoEvents是否会加快速度——它很可能会减慢速度。我的看法是,Word不仅会减慢速度,而且实际上会挂起,可能是因为内存不足的情况(虽然这似乎不太可能,但Windows有时会使用该错误消息来表示“原因未知”)。在这种情况下,DoEvents可以允许垃圾收集释放不再使用的内存。