Warum ist dieses einfache Wortmakro so langsam

Warum ist dieses einfache Wortmakro so langsam

Dieses Makro wendet ein Tabellendesign auf alle Tabellen im Dokument an. Anschließend wendet es ein Absatzformat auf die Tabellen an. Wenn nur wenige Tabellen vorhanden sind (z. B. 20), läuft dies sehr langsam.

Wie kann ich es optimieren?

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

Bearbeiten: Ich habe vergessen, die Ausrichtung der ersten Spalte einzubeziehen.

Antwort1

Sie durchlaufen Tabellen und dann jede Zelle in jeder Tabelle. Das wird einige Zeit in Anspruch nehmen. Adressieren Sie den Bereich als einzelnes Objekt, anstatt die Zellen zu durchlaufen.

So etwas sollte funktionieren (vorausgesetzt, Ihre Objekte sind korrekt)

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

Im Wesentlichen ist es dies (was mit Sicherheit funktioniert)

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

Antwort2

Ein weiterer Trick, den ich implementieren musste, ist das Umschalten von der Seitenansicht zur fortlaufenden Ansicht, um die Neupaginierung zu blockieren. Der Sinn in diesem Fall ist: Word paginiert das gesamte Dokument bei jeder Änderung in den Registerkarten neu, auch wenn Sie die Bildschirmaktualisierung stoppen.

Ich kann die Neupaginierung wirksam blockieren, indem ich den aktuellen Seitenansichtsmodus in einer Variable speichere und direkt nach der Blockierung der Bildschirmaktualisierung eine kontinuierliche Ansicht erzwinge:

Dim ViewModeSave As Variant
Application.ScreenUpdating = False    
ViewModeSave = Application.ActiveWindow.View.Type
Application.ActiveWindow.View.Type = Word.wdNormalView

Am Ende der Arbeiten müssen Sie die ursprünglichen Einstellungen wiederherstellen:

Application.Options.Pagination = True
Application.ScreenUpdating = True
Application.ActiveWindow.View.Type = ViewModeSave

Antwort3

Ich hatte das gleiche Problem, als ich durch die Zellen einer Tabelle schleifte und das Absatzformat jeder Zelle einstellte. Obwohl ich den obigen Antworten zustimme, ist nicht das Schleifen durch die Zellen der Engpass, sondern die Absatzformatierung, die langsam ist – unglaublich langsam. Ich habe experimentiert, indem ich die Anzahl der Absatzformateigenschaften geändert habe, die ich in der Schleife festgelegt habe. Das Festlegen von 1 Eigenschaft ging schnell, aber als ich die Anzahl der Eigenschaften auf 8 erhöhte, wurde der VBA-Code immer langsamer; bei 8 war er wirklich langsam. Ich denke, das ist nur ein Problem von Word 2013.

verwandte Informationen