Word MVPの新田さんのブログで気になる記事がありました。
テキストボックス等Shapeオブジェクトのテキストのみを置換するWordマクロです。
これまで本文のみ、もしくはオートシェイプを含めた文書全体の文字列置換というのは行ったことがあるのですが、Shapeオブジェクトのみを対象とした文字列置換は行ったことがなかったので、私の方でも試してみました。
Option Explicit
Public Sub Sample()
Dim Shp As Shape
Dim GrpShp As Shape
Dim CvsShp As Shape
Dim CvsGrpShp As Shape
Const SrcText As String = "あいうえお" '検索する文字列
Const DestText As String = "かきくけこ" '置換後の文字列
For Each Shp In ActiveDocument.Shapes
If Shp.Type = msoCanvas Then
'描画キャンバスの場合の処理
For Each CvsShp In Shp.CanvasItems
If CvsShp.Type = msoGroup Then
For Each CvsGrpShp In CvsShp.GroupItems
ReplaceShapeText CvsGrpShp, SrcText, DestText
Next
Else
ReplaceShapeText CvsShp, SrcText, DestText
End If
Next
ElseIf Shp.Type = msoGroup Then
'グループ化されている場合の処理
For Each GrpShp In Shp.GroupItems
ReplaceShapeText GrpShp, SrcText, DestText
Next
Else
ReplaceShapeText Shp, SrcText, DestText
End If
Next
End Sub
Private Sub ReplaceShapeText(ByVal Shp As Shape, ByVal SrcText As String, ByVal DestText As String)
If Shp.TextFrame.HasText Then
'検索条件は適当に設定
With Shp.TextFrame.TextRange.Find
.ClearFormatting
.Forward = True
.Text = SrcText
.Replacement.Text = DestText
.Execute Replace:=wdReplaceAll
End With
End If
End Sub
新田さんのマクロではSelectionオブジェクトを利用していますが、上記コードでは、ShapeオブジェクトのTextFrameプロパティ(TextFrameオブジェクト)にあるTextRangeプロパティからRangeオブジェクトを取得できるので、これを利用してみました。
描画キャンバスとグループ化されたアイテムだけは考慮していますが、それ以外は特別な処理をしていませんので、上記コードでは対応できない場合があるかもしれません。
Shapeオブジェクトのみ、ということで中々出番が無いかもしれませんが、こういったマクロも面白いですね(^^)


















この記事へのコメントはありません。