Por que esta simples palavra macro é tão lenta

Por que esta simples palavra macro é tão lenta

Esta macro aplica um design de tabela a todas as tabelas do documento. Em seguida, aplica um formato de parágrafo às tabelas. Quando há apenas algumas tabelas (por exemplo, 20), o processo é muito lento.

Como posso otimizá-lo?

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

Editar: esqueci de incluir o alinhamento da primeira coluna.

Responder1

Você está percorrendo tabelas e, em seguida, percorrendo cada célula de cada tabela. Isso levará tempo. Aborde o intervalo como um único objeto em vez de percorrer as células.

Algo assim deve funcionar (assumindo que seus objetos estejam corretos)

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

Essencialmente é isso (que funciona com certeza)

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

Responder2

Outro truque que tive que implementar foi mudar da visualização de página para visualização contínua para bloquear a repaginação. O ponto neste caso é: o Word repagina todo o documento para cada modificação nas guias, mesmo se você interromper a atualização da tela.

Minha maneira de bloquear efetivamente a repaginação é salvar o modo de visualização da página atual em uma var e forçar a visualização contínua logo após o bloqueio da atualização da tela:

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

Ao final do trabalho, é necessário recuperar as configurações originais:

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

Responder3

Eu tive o mesmo problema, percorrendo as células de uma tabela e definindo o formato do parágrafo de cada célula. Embora eu concorde com as respostas acima, não é o loop pelas células que é o gargalo; na verdade, é a formatação do parágrafo que é lenta - incrivelmente lenta. Experimentei alterar o número de propriedades de formato de parágrafo que defini no loop. Definir 1 propriedade foi rápido, mas conforme aumentei o número de propriedades defini para 8, o código vba ficou cada vez mais lento; às 8 foi muito lento. Acho que é apenas uma questão de palavra de 2013.

informação relacionada