Word VBA/マクロ 備忘録

作業効率化のため作成したマクロをバックアップ代わりにアップしていきます。

【Word VBA/マクロ】スマートアートの文字列置換

サンプルコードでできること

スマートアートの文字列を置換します。

コードの説明

TextRange2オブジェクトのReplaceメソッドを用いて置換します。


                Set tempRng = rng.Replace(mae, ato, MatchCase:=msoTrue)

「MatchCase:=msoTrue」で大文字と区別を追加しています。
英文など単語全体で検索するときは、「Wholewords:=msoTrue」を追加します。
パラメーターを見る限り、Range.FIndやSelection.Findと違い、ワイルド検索には対応していないようです。

    mae = "■"  '検索キーワード
    ato = "□" '置換キーワード

必要に応じてキーワードを変更します。

                        Set tempRng = rng.Replace(mae, ato, tempRng.Start _
                            + tempRng.Length - 1, MatchCase:=msoTrue)                        

最初の置換が終わったあとのコードです。
「tempRng.Start + tempRng.Length - 1」は、名前付き引数を使うと「After: tempRng.Start + tempRng.Length - 1」です。
置換した文字のあとの範囲で次の置換を行うという意味です。
検索と置換のキーワードの文字数が違うとうまくいかなくて、このコードの記述に時間がかかりました。
検証が足りないので、場合によってはうまくいかないかもしれません。

Sub SmartArtReplace()
    '行内のスマートアートの文字列を置換します。
    Dim shp As Shape, gShp As Shape, inlShp As InlineShape
    Dim satNode As SmartArtNode
    Dim rng As TextRange2, tempRng As TextRange2
    Dim mae As String, ato As String
    
    mae = "Word"  '検索キーワード
    ato = "ワード" '置換キーワード
    
    For Each inlShp In ActiveDocument.InlineShapes
        If inlShp.Type = wdInlineShapeSmartArt Then
            For Each satNode In inlShp.SmartArt.AllNodes
                Set rng = satNode.TextFrame2.TextRange
                Set tempRng = rng.Replace(mae, ato, MatchCase:=msoTrue)
                Do While Not (tempRng Is Nothing)                        
                        Set tempRng = rng.Replace(mae, ato, tempRng.Start _
                            + tempRng.Length - 1, MatchCase:=msoTrue)                        
                Loop
            Next
        End If
    Next
End Sub