3 votos

Aplicar el estilo de borde a todas las fotos con VBA en MS Word 2010

Tengo un gran archivo docx de Word con texto y muchas imágenes. Me gustaría aplicar un estilo de borde/marco a todas las fotos a la vez. No quiero hacerlo individualmente para todas las fotos.

Así que creo que una macro es el camino a seguir, pero no soy muy fluido en la creación de macros de Word. Creo que este es el comienzo, pero me da un error al tratar de aplicar la configuración a un <hr> elemento.

Aquí está el código de macro que usé. Sospecho que sólo un pequeño ajuste lo arreglará (permitiendo que el código corra contra todos los objetos de la imagen) es necesario.

Sub addborder()
'
' addborder Macro
'
'
Dim i As Long, j As Long
With ActiveDocument.Range
    For i = 1 To .InlineShapes.Count
        With .InlineShapes(i)
            For j = 1 To .Borders.Count
                .Borders(j).LineStyle = wdLineStyleSingle
                .Borders(j).Color = wdColorAutomatic
            Next j
        End With
    Next i
End With
End Sub

Gracias.


Añadido:

Observe que el documento tiene algunos <hr> dentro, y ese elemento está deteniendo la macro (no puede aplicar esos parámetros a la <hr> elemento). Así que el macro tiene que seleccionar sólo imágenes de imagen.

2voto

Cathy A. Brink Puntos 50

Todas las imágenes de tu documento de Word tienen que estar formateadas como "En línea con el texto" para que ese pedazo de código funcione. Hacer que el texto del documento envuelva la imagen de cualquier otra forma hace que sea un Objeto de forma VBA y no un Objeto InlineShape.

Picture Formats in Word

Además, la frontera s El objeto incluye los 4 lados. No deberías necesitar tu segundo para... La siguiente declaración para hacer un bucle 4 veces para establecer el estilo y el color de cada lado.

Lo último es que la línea del borde no era fácil de ver en mis fotos cuando dejé que se ajustara al tamaño de ancho predeterminado. También puedes establecer la propiedad Linewidth sólo para ver si funciona.

En Office 2007, esto funciona para mí:

Dim i As Long, j As Long
With ActiveDocument.Range
    For i = 1 To .InlineShapes.Count
        With .InlineShapes(i)
                .Borders(1).LineStyle = wdLineStyleSingle
                .Borders(1).Color = wdColorAutomatic
    ' optional  .Borders(1).LineWidth = wdLineWidth225pt

        End With
    Next i
End With

EDITAR:

En cuanto a su <hr> error. No todos los objetos de InlineShape son imágenes. Puede especificar en su código VBA que sólo seleccione InlineShapes cuyo tipo sea Picture.

Probablemente por eso prefiero referirme a los objetos directamente como "InlineShape" en lugar de agruparlos todos con "InlineShape-s". No se puede llegar fácilmente a la propiedad 'Type' con InlineShape-s.

    Dim inshape As InlineShape
    Dim ashape As shape  

    For Each inshape In ActiveDocument.InlineShapes

      If inshape.Type = wdInlineShapePicture Then

           inshape.Borders(1).LineStyle = wdLineStyleSingle
           inshape.Borders(1).Color = wdColorAutomatic
 'optional inshape.Borders(1).LineWidth = wdLineWidth225pt

      End If
    Next

    'The second loop will look for pictures formatted as Shape objects

    For Each ashape In ActiveDocument.Shapes

       If ashape.Type = msoPicture Then

          ashape.Line.Style = msoLineSingle
          ashape.Line.Weight = 0.5 'default size is 0.5 pts'

       End If
    Next

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: