![为什么这个简单的word宏这么慢](https://linux22.com/image/1476088/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84word%E5%AE%8F%E8%BF%99%E4%B9%88%E6%85%A2.png)
此宏将表格设计应用于文档中的所有表格。然后它将段落格式应用于表格。当只有少数表格(例如 20 个)时,此宏运行非常慢。
我该如何优化它?
Sub Apply_tabledesign_to_all_tables()
'
' Apply_tabledesign_to_all_tables Macro
' Apply EVU table to all tables in document.
'
Application.ScreenUpdating = False
Dim tbl As Table
Dim ac_cell As Word.cell
For Each tbl In ActiveDocument.Tables
tbl.Style = "EVU"
For Each ac_cell In tbl.Range.Cells
ac_cell.Range.ParagraphFormat.Style = ActiveDocument.Styles("tabel")
Next
'Set the alignment for the first column
For k = 1 To tbl.Columns(1).Cells.Count
tbl.cell(k, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphLeft
Next k
Next
Application.ScreenUpdating = True
End Sub
编辑:我忘了包含第一列的对齐方式。
答案1
您要循环遍历表格,然后循环遍历每个表格中的每个单元格。这会花费时间。将范围作为单个对象处理,而不是循环遍历单元格。
类似这样的事情应该可以工作(假设你的对象是正确的)
Sub Macro2()
Dim tbl As Table
For Each tbl In ActiveDocument.Tables
tbl.Style = "EVU"
tbl.Range.ParagraphFormat.Style = ActiveDocument.Styles("tabel")
Next
End Sub
本质上就是这样(确实有效)
Sub Macro2()
Dim tbl As Table
For Each tbl In ActiveDocument.Tables
tbl.Style = "Light Shading"
tbl.Range.ParagraphFormat.Style = "Heading 1"
Next
End Sub
答案2
我必须实施的另一个技巧是从页面视图切换到连续视图,以阻止重新分页。本例中的要点是:即使您停止屏幕更新,Word 也会针对选项卡中的每次修改重新分页整个文档。
我有效阻止重新分页的方式是将当前页面视图模式保存在 var 中,并在屏幕更新阻止后强制连续视图:
Dim ViewModeSave As Variant
Application.ScreenUpdating = False
ViewModeSave = Application.ActiveWindow.View.Type
Application.ActiveWindow.View.Type = Word.wdNormalView
在工作结束时,你必须恢复原来的设置:
Application.Options.Pagination = True
Application.ScreenUpdating = True
Application.ActiveWindow.View.Type = ViewModeSave
答案3
我遇到了同样的问题,循环遍历表格中的单元格并设置每个单元格的段落格式。虽然我同意上面的答案,但瓶颈并不是循环遍历单元格,而是段落格式很慢 - 非常慢。我尝试改变我在循环中设置的段落格式属性的数量。设置 1 个属性很快,但是当我将设置的属性数量增加到 8 时,vba 代码变得越来越慢;在 8 时它真的很慢。我认为这只是一个 word 2013 问题。