為什麼這個簡單的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

我必須實現的另一個技巧是從頁面視圖切換到連續視圖以阻止重新分頁。這種情況下的要點是:即使您停止螢幕更新,單字也會針對選項卡中的每次修改重新分頁整個文件。

我有效阻止重新分頁的方法是將當前頁面視圖模式保存在 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點的時候真的很慢。我想這只是2013年的一個字。

相關內容