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