Этот макрос применяет 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.