Microsoft 365 WordのVBAに関する覚書きです。
チップス
- 配列のFor Each(
For Each A In B())でAはVariant型固定。Dim A As Bとすると実行時エラーが発生する。 - Wordの図は行内にある場合は
InlineShape型。取得する場合もActiveDocument.InlineShapesになる。TypeはWdInlineShapeType型。Shape型、ActiveDocument.Shapes、MsoShapeTypeではない。
関数
アクティブな文書に存在するすべての図(行内図)の直後に改行を2個追加するプロシージャ
'アクティブな文書に存在するすべての図(行内図)の直後に改行を2個追加します。
'実行後は選択範囲がリセットされます。
Sub AddTwoNewLinesAfterAllPictureShapes()
Dim PictureShapes() As InlineShape
PictureShapes = FilterInlneShapesTypeOf( _
ActiveDocument.InlineShapes, wdInlineShapePicture)
Dim PictureShape As Variant
For Each PictureShape In PictureShapes
PictureShape.Select
Selection.MoveRight wdCharacter, 1
Selection.TypeParagraph
Selection.TypeParagraph
Next
End Sub
FilterInlneShapesTypeOfを使用します。
アクティブな文書に存在するすべての図(行内図)の直後に改行とページ区切りを追加するプロシージャ
'アクティブな文書に存在するすべての図(行内図)の直後に改行とページ区切りを追加します。
'実行後は選択範囲がリセットされます。
Sub AddNewLineAndPageBreakAfterAllPictureShapes()
Dim PictureShapes() As InlineShape
PictureShapes = FilterInlneShapesTypeOf( _
ActiveDocument.InlineShapes, wdInlineShapePicture)
Dim PictureShape As Variant
For Each PictureShape In PictureShapes
PictureShape.Select
Selection.MoveRight wdCharacter, 1
Selection.InsertParagraph
Selection.InsertBreak wdPageBreak
Next
End Sub
FilterInlneShapesTypeOfを使用します。
ShapeのコレクションをShape()型に変換する関数
'ShapeのコレクションをShape()型に変換します。
'コレクションがShapeに変換できないオブジェクトを含む場合はエラーが発生します。
Public Function ConvInlineShapeCollectionToArray( _
ByRef Collection As Collection, _
Optional ByVal StartIndex = 1) As InlineShape()
Dim Shapes() As InlineShape
ReDim Shapes(StartIndex To Collection.Count + StartIndex - 1)
Dim I As Integer
For I = 1 To Collection.Count
Set Shapes(StartIndex + I - 1) = Collection(I)
Next
ConvInlineShapeCollectionToArray = Shapes
End Function
InlineShapesからある種類のInlineShapeオブジェクトの配列を作成する関数
'InlineShapesからある種類のInlineShapeオブジェクトの配列を作成します。
Public Function FilterInlneShapesTypeOf( _
ByRef InlineShapes As InlineShapes, _
ByVal ShapeType As WdInlineShapeType) As InlineShape()
Dim Col As Collection
Set Col = New Collection
Dim InlineShape As InlineShape
For Each InlineShape In InlineShapes
If InlineShape.Type = ShapeType Then
Col.Add InlineShape
End If
Next
FilterInlneShapesTypeOf = ConvInlineShapeCollectionToArray(Col)
End Function
ConvInlineShapeCollectionToArrayを使用します。