Почему этот простой макрос Word такой медленный?

Почему этот простой макрос Word такой медленный?

Этот макрос применяет tabledesign ко всем таблицам в документе. Затем он применяет формат абзаца к таблицам. Когда таблиц всего несколько (например, 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 перелистывает весь документ для каждого изменения во вкладках, даже если вы останавливаете обновление экрана.

Мой способ эффективно заблокировать перенавигацию — сохранить текущий режим просмотра страницы в переменной и принудительно включить непрерывный просмотр сразу после блокировки обновления экрана:

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.

Связанный контент