Cómo escribir una macro VBA de Word para comprimir imágenes en lote antes de guardar
🔍 WiseChecker

Cómo escribir una macro VBA de Word para comprimir imágenes en lote antes de guardar

Cuando inserta varias imágenes de alta resolución en un documento de Word, el tamaño del archivo puede aumentar rápidamente, lo que dificulta compartirlo o almacenarlo. Word no ofrece un comando integrado de un solo clic para comprimir todas las imágenes a la vez antes de guardar. Puede usar una macro VBA para automatizar la compresión de imágenes en lote, reduciendo el tamaño del archivo sin ajustar manualmente cada imagen. Este artículo explica cómo escribir y ejecutar una macro VBA que comprime cada imagen en su documento antes de la operación de guardado.

Puntos clave: Escribir una macro VBA para la compresión de imágenes en lote

  • Alt + F11 para abrir el editor de VBA: Acceda al entorno de Visual Basic for Applications donde escribe la macro.
  • ActiveDocument.InlineShapes o .Shapes: Use estos objetos para recorrer todas las imágenes en el cuerpo del documento y en los encabezados y pies de página.
  • Método PictureFormat.Compress: El comando principal que reduce la resolución de la imagen y elimina las áreas recortadas.
  • Application.Options.PictureCompression: Establezca esta propiedad en True antes de la compresión para asegurarse de que Word aplique la configuración de compresión.

ADVERTISEMENT

Cómo almacena Word las imágenes y por qué es importante la compresión

Word almacena cada imagen insertada en su resolución original de forma predeterminada. Una foto de 10 megapíxeles de una cámara digital puede ocupar de 5 a 10 MB dentro del documento. Cuando inserta veinte de estas imágenes, el tamaño del archivo supera los 100 MB. Esto hace que el documento se abra lentamente, sea difícil de enviar por correo electrónico y problemático para el almacenamiento en la nube.

La función de compresión integrada de Word reduce la resolución de todas las imágenes a un PPI objetivo, normalmente 220 PPI para uso web o 150 PPI para correo electrónico. También descarta las áreas recortadas que están ocultas a la vista. Puede aplicar esta configuración manualmente a través de Archivo > Opciones > Avanzadas > Tamaño y calidad de la imagen, o mediante el botón Comprimir imágenes en la pestaña Formato de imagen de la cinta de opciones. Sin embargo, ninguno de los dos métodos permite comprimir imágenes automáticamente antes de cada guardado. Una macro VBA resuelve esta limitación ejecutando la lógica de compresión cuando la activa, ya sea manualmente o automáticamente al guardar.

Requisitos previos para ejecutar una macro VBA

Antes de escribir la macro, asegúrese de que la configuración de seguridad de Word permita las macros. Vaya a Archivo > Opciones > Centro de confianza > Configuración del Centro de confianza > Configuración de macros. Seleccione Habilitar todas las macros. Esta configuración es temporal para el desarrollo; vuelva a Deshabilitar todas las macros con notificación después de las pruebas. También necesita familiaridad básica con el editor de VBA. La macro descrita funciona en Word 2016, Word 2019, Word 2021 y Word para Microsoft 365.

Escribir la macro VBA para la compresión de imágenes en lote

La macro recorre todas las imágenes en línea y las formas flotantes en el cuerpo del documento, luego aplica la compresión. También admite imágenes en encabezados y pies de página. El código utiliza el método PictureFormat.Compress que requiere un objeto PictureCompression.

  1. Abrir el Editor de VBA
    Presione Alt + F11 en Word. Se abre la ventana de Visual Basic for Applications. Si el Explorador de proyectos no está visible, presione Ctrl + R para mostrarlo.
  2. Insertar un nuevo módulo
    En el Explorador de proyectos, busque Normal o el nombre de su documento actual. Haga clic derecho y seleccione Insertar > Módulo. Aparece una ventana de código en blanco.
  3. Pegar el código de la macro
    Copie y pegue el siguiente código en la ventana del módulo:
    Sub CompressAllImages()
        Dim shp As Shape
        Dim ils As InlineShape
        Dim s As Section
        Dim hf As HeaderFooter
    
        ' Set compression options
        Application.Options.PictureCompression = True
    
        ' Compress inline shapes in document body
        For Each ils In ActiveDocument.InlineShapes
            If ils.Type = wdInlineShapePicture Then
                ils.PictureFormat.Compress ppResolutionDefault, msoFalse
            End If
        Next ils
    
        ' Compress floating shapes in document body
        For Each shp In ActiveDocument.Shapes
            If shp.Type = msoPicture Then
                shp.PictureFormat.Compress ppResolutionDefault, msoFalse
            End If
        Next shp
    
        ' Compress images in headers and footers
        For Each s In ActiveDocument.Sections
            For Each hf In s.Headers
                For Each shp In hf.Shapes
                    If shp.Type = msoPicture Then
                        shp.PictureFormat.Compress ppResolutionDefault, msoFalse
                    End If
                Next shp
                For Each ils In hf.InlineShapes
                    If ils.Type = wdInlineShapePicture Then
                        ils.PictureFormat.Compress ppResolutionDefault, msoFalse
                    End If
                Next ils
            Next hf
            For Each hf In s.Footers
                For Each shp In hf.Shapes
                    If shp.Type = msoPicture Then
                        shp.PictureFormat.Compress ppResolutionDefault, msoFalse
                    End If
                Next shp
                For Each ils In hf.InlineShapes
                    If ils.Type = wdInlineShapePicture Then
                        ils.PictureFormat.Compress ppResolutionDefault, msoFalse
                    End If
                Next ils
            Next hf
        Next s
    
        MsgBox "All images compressed.", vbInformation
    End Sub
    
  4. Ejecutar la macro
    Presione F5 o haga clic en Ejecutar > Ejecutar Sub/UserForm. La macro comprime todas las imágenes y muestra un mensaje de confirmación. Alternativamente, cierre el editor y presione Alt + F8, seleccione CompressAllImages, luego haga clic en Ejecutar.
  5. Guardar el documento
    Después de ejecutar la macro, guarde el documento normalmente (Ctrl + S). El tamaño del archivo debería ser significativamente menor.

Personalizar la resolución de compresión

La macro utiliza ppResolutionDefault que aplica la resolución predeterminada establecida en Opciones de Word. Para especificar un PPI concreto, reemplace ppResolutionDefault con una de las siguientes constantes:

  • ppResolution200 – 200 PPI, adecuado para impresión de alta calidad
  • ppResolution150 – 150 PPI, bueno para la mayoría de los documentos
  • ppResolution96 – 96 PPI, mejor para correo electrónico o visualización en pantalla
  • ppResolution72 – 72 PPI, la calidad más baja pero el tamaño de archivo más pequeño

Por ejemplo, para comprimir a 150 PPI, cambie la línea a: ils.PictureFormat.Compress ppResolution150, msoFalse

Ejecutar la macro automáticamente antes de guardar

Para comprimir imágenes automáticamente cada vez que guarde, use el evento DocumentBeforeSave. Esto requiere colocar código en el módulo de clase ThisDocument. Haga doble clic en ThisDocument en el Explorador de proyectos y pegue lo siguiente:

Private Sub DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
    Call CompressAllImages
End Sub

Ahora, cada vez que guarde, la macro ejecuta primero la compresión. Tenga en cuenta que esto puede ralentizar el proceso de guardado en documentos grandes.

ADVERTISEMENT

Problemas comunes con la macro de compresión

La macro no comprime imágenes en encabezados o pies de página

El código anterior incluye bucles para encabezados y pies de página. Si aún encuentra imágenes en encabezados que no se comprimen, verifique que las imágenes no estén vinculadas. Las imágenes vinculadas no están incrustadas y no se pueden comprimir. Convierta las imágenes vinculadas en incrustadas seleccionándolas, haciendo clic derecho y eligiendo Cambiar imagen > Desde archivo, luego vuelva a insertar la imagen sin vincular.

La compresión causa pérdida de calidad de imagen

La macro utiliza la constante de resolución que especifique. Si el documento requiere impresión de alta calidad, use ppResolution200 o ppResolutionDefault con una configuración predeterminada alta. Para cambiar el valor predeterminado, vaya a Archivo > Opciones > Avanzadas > Tamaño y calidad de la imagen y establezca la salida objetivo en 220 PPI o más.

La macro se ejecuta pero no se produce compresión

Verifique que las imágenes estén incrustadas, no vinculadas. También verifique que Application.Options.PictureCompression esté establecido en True. Si esta propiedad es False, el método Compress no tiene efecto. La macro lo establece en True al inicio, pero si ocurre un error antes de que se ejecute esa línea, es posible que la compresión no se aplique.

Error: Error en el método Compress del objeto PictureFormat

Este error ocurre cuando la imagen está dañada o en un formato no compatible. Inserte la imagen de nuevo usando un formato estándar como JPEG o PNG. También asegúrese de que la imagen no esté en un control de contenido que restrinja el acceso programático. Desbloquee el control de contenido o elimínelo temporalmente.

Compresión manual vs macro VBA: diferencias clave

Elemento Compresión manual Compresión con macro VBA
Número de clics por imagen 3 o más por imagen 1 ejecución de macro para todas las imágenes
Tiempo para 50 imágenes 5–10 minutos Menos de 10 segundos
Encabezados y pies de página incluidos Debe navegar manualmente Incluidos automáticamente
Resolución personalizada por imagen Posible por imagen Misma resolución para todas
Automatización antes de guardar No es posible Posible con el evento DocumentBeforeSave

Ahora puede escribir y usar una macro VBA para comprimir todas las imágenes en un documento de Word antes de guardar. Comience probando la macro en una copia de su documento. Ajuste la constante de resolución para que coincida con sus necesidades de calidad. Para una automatización avanzada, adjunte la macro al evento DocumentBeforeSave para que la compresión ocurra automáticamente cada vez que guarde. Recuerde restaurar la configuración de seguridad de macros después de las pruebas para evitar que se ejecuten macros no autorizadas.

ADVERTISEMENT