web-dev-qa-db-ja.com

MS Word2010のVBAを使用してすべての画像に境界線スタイルを適用する

テキストと多くの写真を含む大きなWorddocxファイルがあります。すべての写真に一度にボーダー/フレームスタイルを適用したいと思います。私はすべての写真に対して個別にそれをしたくありません。

したがって、マクロが進むべき道だと思いますが、Wordマクロの作成にはあまり精通していません。これが始まりだと思いますが、設定を<hr>要素に適用しようとするとエラーが発生します。

これが私が使用したマクロコードです。ほんの少しの微調整で修正できると思います(すべての画像オブジェクトに対してコードを実行できるようにします)。

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

ありがとう。


追加:

ドキュメントの内部に<hr>があり、その要素がマクロを停止していることに注意してください(これらのパラメーターを<hr>要素に適用することはできません)。したがって、マクロは画像画像のみを選択する必要があります。

2
Rick Hellewell

そのコードを機能させるには、Word文書内のすべての画像を「テキストに合わせて」としてフォーマットする必要があります。ドキュメントテキストを他の方法で画像に折り返すと、InlineShapeオブジェクトではなく VBA Shape Object になります。

Picture Formats in Word

また、Bordersオブジェクトには4つの辺すべてが含まれます。 2番目のFor ... Nextステートメントで4を4回ループして、両側のスタイルと色を設定する必要はありません。

最後に、デフォルトの幅サイズに設定したときに、境界線が写真で見づらくなったということです。 Linewidthプロパティを設定して、機能しているかどうかを確認することもできます。

Office 2007では、これは私にとってはうまくいきます。

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

編集:

<hr>エラーについて。すべてのInlineShapeオブジェクトが画像であるとは限りません。タイプがPictureであるInlineShapesのみを選択するように、VBAコードで指定できます。

これが、オブジェクトをすべて「InlineShape-s」でグループ化するのではなく、「InlineShape」として直接参照することを好む理由です。 InlineShape-sを使用して「Type」プロパティに簡単にアクセスすることはできません。

    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
2
Cathy A. Brink

私はこの質問に対するCathyの答えが本当に好きですが、周囲の線を取得するために必ずしもBordersInlineShapeメンバーを使用する必要はないことを付け加えたいと思います。 Lineメンバーは、通常のShapeの場合と同じように、次のようになります。

Option Explicit

Sub PicturesAll_Borders_Show()

    'for pictures which are "In Line with Text"
    Dim inShp As InlineShape
    For Each inShp In ActiveDocument.InlineShapes
        If inShp.Type = wdInlineShapePicture Then
            With inShp.Line
                .Visible = True
                .Style = msoLineSingle
                .Weight = 1
                .ForeColor.RGB = RGB(0, 0, 0)
            End With
        End If
    Next inShp

    'for pictures which are "With Text Wrapping"
    Dim shp As Shape
    For Each shp In ActiveDocument.Shapes
        If shp.Type = msoPicture Then
            With shp.Line
                .Visible = True
                .Style = msoLineSingle
                .Weight = 1
                .ForeColor.RGB = RGB(0, 0, 0)
            End With
        End If
    Next shp

End Sub

また、後で見つけた人が必要になった場合に備えて、すべての写真の境界線を非表示にする簡単な方法を作成しました。

Sub PicturesAll_Borders_Hide()

    'for pictures which are "In Line with Text"
    Dim inShp As InlineShape
    For Each inShp In ActiveDocument.InlineShapes
        If inShp.Type = wdInlineShapePicture Then inShp.Line.Visible = False
    Next inShp

    'for pictures which are "With Text Wrapping"
    Dim shp As Shape
    For Each shp In ActiveDocument.Shapes
        If shp.Type = msoPicture Then shp.Line.Visible = False
    Next shp

End Sub
0
Marcucciboy2