为什么这个简单的word宏这么慢

为什么这个简单的word宏这么慢

此宏将表格设计应用于文档中的所有表格。然后它将段落格式应用于表格。当只有少数表格(例如 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 问题。

相关内容