この単純なワードマクロはなぜこんなに遅いのか

この単純なワードマクロはなぜこんなに遅いのか

このマクロは、ドキュメント内のすべての表にテーブルデザインを適用します。次に、表に段落書式を適用します。表の数が少ない場合 (たとえば 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

私が実装しなければならなかったもう 1 つのトリックは、ページ ビューから連続ビューに切り替えて、ページ番号の再設定をブロックすることです。この場合のポイントは、画面の更新を停止しても、タブでの変更ごとに 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 の問題だと思います。

関連情報