¿Por qué esta simple macro de palabras es tan lenta?

¿Por qué esta simple macro de palabras es tan lenta?

Esta macro aplica un diseño de tabla a todas las tablas del documento. Luego aplica un formato de párrafo a las tablas. Cuando hay sólo unas pocas mesas (por ejemplo, 20), esto funciona muy lento.

¿Cómo puedo optimizarlo?

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: olvidé incluir la alineación de la primera columna.

Respuesta1

Estás recorriendo las tablas y luego recorriendo cada celda de cada tabla. Eso llevará tiempo. Aborde el rango como un solo objeto en lugar de recorrer las celdas.

Algo como esto debería funcionar (suponiendo que sus objetos sean correctos)

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

Básicamente es esto (que funciona con seguridad)

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

Respuesta2

Otro truco que tuve que implementar es cambiar de vista de página a vista continua para bloquear la repaginación. El punto en este caso es: Word vuelve a paginar todo el documento para cada modificación en pestañas, incluso si detiene la actualización de la pantalla.

Mi forma de bloquear efectivamente la repaginación es guardar el modo de vista de la página actual en una variable y forzar la vista continua justo después del bloqueo de la actualización de la pantalla:

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

Al finalizar el trabajo, hay que recuperar la configuración original:

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

Respuesta3

Tuve el mismo problema al recorrer las celdas de una tabla y configurar el formato de párrafo de cada celda. Aunque estoy de acuerdo con las respuestas anteriores, el cuello de botella no es el bucle a través de las celdas, sino que en realidad es el formato del párrafo el que es lento, increíblemente lento. Experimenté alterando la cantidad de propiedades de formato de párrafo que configuré en el bucle. Configurar 1 propiedad fue rápido, pero a medida que aumenté la cantidad de propiedades que configuré a 8, el código vba se volvió cada vez más lento; a las 8 era muy lento. Creo que es sólo una cuestión de palabra de 2013.

información relacionada