Visio2010を使用して、visioで作成された複数のファイル(図、表などの内部にテキストがあるものが混在する)の中のテキストを検索置換することは可能でしょうか?検索置換の用語はExcelファイルで一覧になっている(数百語あります)ので、これを読み込むか、あらかじめvisioの中に取り込んで一括検索置換できないかと考えています。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2010/07/15 17:55:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.4

回答回数607ベストアンサー獲得回数108

ポイント10pt

複数のシート、複数のファイルに対して実行するように設定することも可能でしょうか。

複数の Visio ドキュメントファイルならびに複数ページに対応したスクリプトを作成しました。

以下の点に注意して実行をお願いします。

1. 以下のスクリプトのソースを適当なエディタに貼り付けてください。
2. ソース内の Visio ドキュメントファイルのパスを設定します。
  「g_strVisioFilePath」に変換対象の Visio ドキュメントファイルのパスを設定します。
3. スクリプトを名前を付けて保存します。
  「UpdateVisioDocument.vbs」とします。
4. コマンドプロンプトにてスクリプトを実行します。
  プログラムを置いてある場所に移動し、
  CScript //Nologo UpdateVisioDocument.vbs
  を実行します。
5. スクリプトを実行すると、順次ファイルを変換します。
  実行時にバックアップファイルは作成しておりません。
  必ず、事前に Visio ドキュメントファイルのバックアップを取得願います。
<プログラムの概要>
1. ファイル数ループします。
└2. ページ数ループします。
 └3. 置換用 Excel のレコード数ループします。
  └4. ページ内のオートシェイプの数ループします。
   └5. オートシェイプのテキストを置換します。

' File : UpdateVisioDocument.vbs
' Usage : CScript //Nologo UpdateVisioDocument.vbs
Option Explicit

' VisOpenSaveArgs の定数
Const visOpenMacrosDisabled = &H80

' ログファイルの出力先を指定します
Const g_strLogFile = "C:\home\edu\hatena\caji\1278579260\DebugPrint.Log"

' 検索・置換用ワードを格納したExcelファイルを指定します
Const g_strExcelFile = "C:\home\edu\hatena\caji\1278579260\book1.xls"

' Visio ファイルの配置場所を指定します。
Const g_strVisioFilePath = "C:\home\edu\hatena\caji\1278579260\data"

' メイン処理を呼び出します
Call Main()

Sub Main()
    ' 複数の Visio ドキュメントを Excel ファイルの内容で更新する処理を呼び出します。
    Call UpdateVisioDocuments( g_strVisioFilePath, g_strExcelFile  )
End Sub

' 複数の Visio ドキュメントを Excel ファイルの内容で更新する処理
Function UpdateVisioDocuments( strVisioFilePath, strExcelFile  )
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folder
    Set folder = fso.GetFolder( strVisioFilePath )
    Dim file
    ' 指定したフォルダ内のファイル名を順次取得します
    For Each file In folder.Files
        Dim strFileExt
        strFileExt = fso.GetExtensionName( file.Name )
        If LCase(strFileExt) = "vsd" Then
            DebugPrint "File Name = [" & file.Name & "]"
            ' 単一の Visio ドキュメントを Excel ファイルの内容で更新する処理を呼び出します
            Call UpdateVisioDocument( strVisioFilePath & "\" & file.Name, strExcelFile )
        End If
    Next
End Function

' 単一の Visio ドキュメントを Excel ファイルの内容で更新する処理
Function UpdateVisioDocument( strVisioFile, strExcelFile )
    Dim app
    Set app = CreateObject("Visio.Application") ' Visio のプロセスを起動します。
    app.Visible = True ' Visio のプロセスを表示状態に変更します。
    Dim doc
    Set doc = app.Documents.OpenEx( strVisioFile, visOpenMacrosDisabled )
    
    Dim page
    For Each page In doc.Pages
        DebugPrint "[" & page.Name & "]"
        ' オートシェイプのテキストを Excel ファイルの内容で更新する処理を呼び出します
        Call UpdateShapeTextByReplaceFile( page, strExcelFile )
    Next
    doc.Save   ' ファイルを上書き保存します
    doc.Close
    app.Quit   ' Visio のプロセスを終了します
End Function

' オートシェイプのテキストを Excel ファイルの内容で更新する処理
Sub UpdateShapeTextByReplaceFile( ByRef page, strExcelFile )
    Dim cn
    Set cn = CreateObject("ADODB.Connection")
    
    Dim strFileName
    strFileName = g_strExcelFile
    ' Excel に接続する為の接続文字列を指定します。項目名が無い(1行目からデータが始まる)場合は「HDR=No」を指定します。
    cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=Yes;"""
    ' 64bit OS の場合は、Jet.OLEDB が使用できない為、以下を有効化します。
    'cn.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=Yes;"""
    
    Dim rs
    ' Excel のシート名が「Sheet1」でない場合、下記の名称を変更してください。
    Set rs = cn.Execute("SELECT * FROM [Sheet1$]")
    
    Dim strFind
    Dim strReplace
    ' Excel の検索・置換用ワードをレコード件数分、順次取得します
    While Not rs.BOF And Not rs.EOF
        strFind = rs(0)    ' 検索用ワードを取得
        strReplace = rs(1) ' 置換用ワードを取得
        ' オートシェイプのテキストを置換する処理を呼び出します
        Call UpdateShapeTextByReplaceText( page, strFind, strReplace )
        rs.MoveNext
    Wend

End Sub

' オートシェイプのテキストを置換する処理
Function UpdateShapeTextByReplaceText( ByRef page, strFind, strReplace )
    Dim shpItem
    ' オートシェイプのコレクションのアイテムを順次取得します
    For Each shpItem In page.Shapes
        ' オートシェイプのテキストに検索用ワードがある場合のみ置換処理を実行します
        If InStr(shpItem.Text, strFind) > 0 Then
            ' デバッグ用にメッセージを出力します。
            ' 例)「サーバー.Text = Replae( "hatena1", "hatena", "はてな")」
            DebugPrint shpItem.Name & ".Text = Replae( """ & shpItem.Text & """, """ & strFind & """, """ & strReplace & """)"
            ' オートシェイプのテキストの検索用ワードを置換用ワードで置換します。
            shpItem.Text = Replace(shpItem.Text, strFind, strReplace)
        End If
    Next
End Function

' デバッグ文字列の出力
Function DebugPrint( strMessage )
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim file
    Set file = fso.OpenTextFile(g_strLogFile, 8, True) ' 追加書き込みモード
    WScript.Echo strMessage
    file.WriteLine strMessage
    file.Close
End Function

以下は参考情報です。

■ Microsoft Office Visio オートメーション リファレンス
http://msdn.microsoft.com/ja-jp/library/cc345404.aspx

不明な点等ございましたら、コメント等追加お願い致します。

その他の回答3件)

id:koriki-WeKan No.1

回答回数342ベストアンサー獲得回数20

ポイント23pt

できない


VBAでプログラムを組めば可能かもしれないが、詳しい条件が分からないので何とも言えない。

http://q.hatena.ne.jp/

id:caji

ソフトウェアの画面設計書の他言語から日本語への翻訳作業です。検索用、置換用に該当する2列が存在するエクセルファイルが存在します。エクセルファイルから取得した情報で、一括検索置換するVBAのサンプルプログラムがあれば教えていただきたいです。他に必要な条件があれば返答いたします。

2010/07/09 10:31:02
id:karuishi No.2

回答回数767ベストアンサー獲得回数128

ポイント23pt

コメント欄が開放されておりませんので回答欄からすいません。

 

http://iyn.cocolog-nifty.com/iyn_blog/2009/04/visio-excel-54a.ht...

を見ると

>Visio の図形の一つ一つを for each 文によりたぐり寄せて検索することができます。

ということなので、この手繰り寄せてきたオブジェクトに置換後の文字列を上書きすれば置換できるかと。

 

ただ体裁を気にする場合、図形内文字列の置換で置換後の文字列の方が長い場合の処理が大変だと思います。

id:caji

ありがとうございます。

試しに書いてみましたが、動きませんでした。

Replace関数が間違っているようですが、正しい書き方がわかりません。

教えていただけますと助かります。

Sub Searchandreplace()

Dim Str As String

Dim textFind1 As String

Set vsoShapes = ActiveDocument.Application.ActivePage.Shapes

For Each vsoShape In vsoShapes

If CStr(textFind1) = vsoShape.Characters.Text Then

vsoShape.Characters.Text.Replace(Str, "text1", "テキスト1")

End If

End Sub

2010/07/11 21:55:18
id:cx20 No.3

回答回数607ベストアンサー獲得回数108

ポイント34pt

Visio の VBA より、Excel ファイルの検索・置換用ワードを取得し置換するサンプルコードを用意致しました。


Excel ファイルは以下の仕様を想定しています。

ブック名:[book1.xls] / シート名:[Sheet1]

  A B
1 検索用 置換用
2 hatena はてな
3 google グーグル
4 yahoo ヤフー

コード実行の前に、

  • ログファイルの出力先
  • Excel ファイルのパス
  • シート名
  • 項目名のあり(HDR=Yes)、なし(HDR=No)

をご確認お願いします。

Option Explicit

' ログファイルの出力先を指定します
Const g_strLogFile = "C:\home\edu\hatena\caji\1278579260\DebugPrint.Log"

' 検索・置換用ワードを格納したExcelファイルを指定します
Const g_strExcelFile = "C:\home\edu\hatena\caji\1278579260\book1.xls"

' オートシェイプのテキストを辞書を使用して日本語に変換します。
Sub ConvertShapeTextToJapanese()
    Dim cn
    Set cn = CreateObject("ADODB.Connection")
    
    Dim strFileName
    strFileName = g_strExcelFile
    ' Excel に接続する為の接続文字列を指定します。項目名が無い(1行目からデータが始まる)場合は「HDR=No」を指定します。
    cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=Yes;"""
    
    Dim rs
    ' Excel のシート名が「Sheet1」でない場合、下記の名称を変更してください。
    Set rs = cn.Execute("SELECT * FROM [Sheet1$]")
    
    Dim strFind
    Dim strReplace
    ' Excel の検索・置換用ワードをレコード件数分、順次取得します
    While Not rs.BOF And Not rs.EOF
        strFind = rs(0)    ' 検索用ワードを取得
        strReplace = rs(1) ' 置換用ワードを取得
        ' オートシェイプのテキストの置換処理を実行します
        UpdateShapeText strFind, strReplace
        rs.MoveNext
    Wend

End Sub


' オートシェイプのテキストの置換処理
Function UpdateShapeText(strFind, strReplace)
    Dim shpItem
    ' オートシェイプのコレクションのアイテムを順次取得します
    For Each shpItem In ActivePage.Shapes
        ' オートシェイプのテキストに検索用ワードがある場合のみ置換処理を実行します
        If InStr(shpItem.Text, strFind) > 0 Then
            ' デバッグ用にメッセージを出力します。
            ' 例)「サーバー.Text = Replae( "hatena1", "hatena", "はてな")」
            DebugPrint shpItem.Name & ".Text = Replae( """ & shpItem.Text & """, """ & strFind & """, """ & strReplace & """)"
            ' オートシェイプのテキストの検索用ワードを置換用ワードで置換します。
            shpItem.Text = Replace(shpItem.Text, strFind, strReplace)
        End If
    Next
End Function

' デバッグ文字列の出力
Function DebugPrint(strData)
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    With fso.OpenTextFile(g_strLogFile, 8, True) ' 追加書き込みモード
        .WriteLine strData
        .Close
    End With
End Function

また、コメント欄(デフォルトでは有効化されていません)を有効化していただけると助かります。


以下は VBA より Excel データを取得する方法に関する参考情報です。

■ [HOWTO] Visual Basic または VBA から ADO を Excel データで使用する
http://support.microsoft.com/kb/257819/
id:caji

まことにありがとうございます。

記載いただいた方法でパスなどを変更して実行したところ、動作していることを確認できました。

複数のシート、複数のファイルに対して実行するように設定することも可能でしょうか。

#コメント欄を有効にしました。書込みできますでしょうか。

2010/07/12 08:47:11
id:cx20 No.4

回答回数607ベストアンサー獲得回数108ここでベストアンサー

ポイント10pt

複数のシート、複数のファイルに対して実行するように設定することも可能でしょうか。

複数の Visio ドキュメントファイルならびに複数ページに対応したスクリプトを作成しました。

以下の点に注意して実行をお願いします。

1. 以下のスクリプトのソースを適当なエディタに貼り付けてください。
2. ソース内の Visio ドキュメントファイルのパスを設定します。
  「g_strVisioFilePath」に変換対象の Visio ドキュメントファイルのパスを設定します。
3. スクリプトを名前を付けて保存します。
  「UpdateVisioDocument.vbs」とします。
4. コマンドプロンプトにてスクリプトを実行します。
  プログラムを置いてある場所に移動し、
  CScript //Nologo UpdateVisioDocument.vbs
  を実行します。
5. スクリプトを実行すると、順次ファイルを変換します。
  実行時にバックアップファイルは作成しておりません。
  必ず、事前に Visio ドキュメントファイルのバックアップを取得願います。
<プログラムの概要>
1. ファイル数ループします。
└2. ページ数ループします。
 └3. 置換用 Excel のレコード数ループします。
  └4. ページ内のオートシェイプの数ループします。
   └5. オートシェイプのテキストを置換します。

' File : UpdateVisioDocument.vbs
' Usage : CScript //Nologo UpdateVisioDocument.vbs
Option Explicit

' VisOpenSaveArgs の定数
Const visOpenMacrosDisabled = &H80

' ログファイルの出力先を指定します
Const g_strLogFile = "C:\home\edu\hatena\caji\1278579260\DebugPrint.Log"

' 検索・置換用ワードを格納したExcelファイルを指定します
Const g_strExcelFile = "C:\home\edu\hatena\caji\1278579260\book1.xls"

' Visio ファイルの配置場所を指定します。
Const g_strVisioFilePath = "C:\home\edu\hatena\caji\1278579260\data"

' メイン処理を呼び出します
Call Main()

Sub Main()
    ' 複数の Visio ドキュメントを Excel ファイルの内容で更新する処理を呼び出します。
    Call UpdateVisioDocuments( g_strVisioFilePath, g_strExcelFile  )
End Sub

' 複数の Visio ドキュメントを Excel ファイルの内容で更新する処理
Function UpdateVisioDocuments( strVisioFilePath, strExcelFile  )
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folder
    Set folder = fso.GetFolder( strVisioFilePath )
    Dim file
    ' 指定したフォルダ内のファイル名を順次取得します
    For Each file In folder.Files
        Dim strFileExt
        strFileExt = fso.GetExtensionName( file.Name )
        If LCase(strFileExt) = "vsd" Then
            DebugPrint "File Name = [" & file.Name & "]"
            ' 単一の Visio ドキュメントを Excel ファイルの内容で更新する処理を呼び出します
            Call UpdateVisioDocument( strVisioFilePath & "\" & file.Name, strExcelFile )
        End If
    Next
End Function

' 単一の Visio ドキュメントを Excel ファイルの内容で更新する処理
Function UpdateVisioDocument( strVisioFile, strExcelFile )
    Dim app
    Set app = CreateObject("Visio.Application") ' Visio のプロセスを起動します。
    app.Visible = True ' Visio のプロセスを表示状態に変更します。
    Dim doc
    Set doc = app.Documents.OpenEx( strVisioFile, visOpenMacrosDisabled )
    
    Dim page
    For Each page In doc.Pages
        DebugPrint "[" & page.Name & "]"
        ' オートシェイプのテキストを Excel ファイルの内容で更新する処理を呼び出します
        Call UpdateShapeTextByReplaceFile( page, strExcelFile )
    Next
    doc.Save   ' ファイルを上書き保存します
    doc.Close
    app.Quit   ' Visio のプロセスを終了します
End Function

' オートシェイプのテキストを Excel ファイルの内容で更新する処理
Sub UpdateShapeTextByReplaceFile( ByRef page, strExcelFile )
    Dim cn
    Set cn = CreateObject("ADODB.Connection")
    
    Dim strFileName
    strFileName = g_strExcelFile
    ' Excel に接続する為の接続文字列を指定します。項目名が無い(1行目からデータが始まる)場合は「HDR=No」を指定します。
    cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=Yes;"""
    ' 64bit OS の場合は、Jet.OLEDB が使用できない為、以下を有効化します。
    'cn.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 8.0;HDR=Yes;"""
    
    Dim rs
    ' Excel のシート名が「Sheet1」でない場合、下記の名称を変更してください。
    Set rs = cn.Execute("SELECT * FROM [Sheet1$]")
    
    Dim strFind
    Dim strReplace
    ' Excel の検索・置換用ワードをレコード件数分、順次取得します
    While Not rs.BOF And Not rs.EOF
        strFind = rs(0)    ' 検索用ワードを取得
        strReplace = rs(1) ' 置換用ワードを取得
        ' オートシェイプのテキストを置換する処理を呼び出します
        Call UpdateShapeTextByReplaceText( page, strFind, strReplace )
        rs.MoveNext
    Wend

End Sub

' オートシェイプのテキストを置換する処理
Function UpdateShapeTextByReplaceText( ByRef page, strFind, strReplace )
    Dim shpItem
    ' オートシェイプのコレクションのアイテムを順次取得します
    For Each shpItem In page.Shapes
        ' オートシェイプのテキストに検索用ワードがある場合のみ置換処理を実行します
        If InStr(shpItem.Text, strFind) > 0 Then
            ' デバッグ用にメッセージを出力します。
            ' 例)「サーバー.Text = Replae( "hatena1", "hatena", "はてな")」
            DebugPrint shpItem.Name & ".Text = Replae( """ & shpItem.Text & """, """ & strFind & """, """ & strReplace & """)"
            ' オートシェイプのテキストの検索用ワードを置換用ワードで置換します。
            shpItem.Text = Replace(shpItem.Text, strFind, strReplace)
        End If
    Next
End Function

' デバッグ文字列の出力
Function DebugPrint( strMessage )
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim file
    Set file = fso.OpenTextFile(g_strLogFile, 8, True) ' 追加書き込みモード
    WScript.Echo strMessage
    file.WriteLine strMessage
    file.Close
End Function

以下は参考情報です。

■ Microsoft Office Visio オートメーション リファレンス
http://msdn.microsoft.com/ja-jp/library/cc345404.aspx

不明な点等ございましたら、コメント等追加お願い致します。

  • id:cx20
    ご連絡が遅くなりまして申し訳ございません。

    > 複数のシート、複数のファイルに対して実行するように設定することも可能でしょうか。

    複数の Visio ファイルに対して一括に処理するようプログラムを作成することは可能です。
    が、すみませんが、ちょっとコードを書く時間が取れない為、回答することができません。
    (1~2日まっていただけるなら回答いたします。)

    コードのイメージ的には VBA ではなく、VBScript にして、
    FileSystemObject の GetFolder にてファイルのリストを取得して、
    取得したファイルに対して、Visio をオートメーションで
    操作してあげればいけそうな感じです。

    以下は、Visio ファイルを開くサンプルコードです。

    Function UpdateVisioDocument( strVisioFile, strFind, strReplace )
     Dim app
     Set app = CreateObject("Visio.Application")
     app.Visible = True
     Dim doc
     Set doc = app.Documents.Open( strVisioFile )
      Dim page
      For Each page In doc.Pages
       ' ここにページに対する処理
      Next
     doc.Close
    End Function
  • id:caji
    ありがとうございました。cx20さんが2度目にポストいただいたプログラムをこちらで実行したところ、複数ファイル・シートについて検索置換が実行されました。VISIOのテンプレート機能を使用している場合の更新について調査中ですが(おそらくテンプレートファイルを置換して置き換える?)、通常の検索・置換についてはこのプログラムをもとに作業実施できそうです。
  • id:koikenoid
    cx20さんの№4は非常に参考になり実施したところグループ化されたものには置換されませんでした。仕様がVISIO2003だからでしょうか?グループ化対応させるにはどのようにすればよいでしょうか。
  • id:cx20
    koikenoid さん>

    > グループ化対応させるにはどのようにすればよいでしょうか?

    グループ化した場合、オブジェクト階層になっていると思われるので、
    その階層ぶん再帰的にループすれば置換は可能かと思います。

    Visio 2003 では試していないですが、以下のコードでどうでしょうか?

    ' オートシェイプのテキストを置換する処理(グループ化対応版)
    Function UpdateShapeTextByReplaceText(ByRef page, strFind, strReplace)
      Dim shpItem
      ' オートシェイプのコレクションのアイテムを順次取得します
      For Each shpItem In page.Shapes
        Call UpdateShapeTextByReplaceTextRecursive(shpItem, strFind, strReplace)
      Next
    End Function

    ' 再帰的にオートシェイプのテキストを置換する処理
    Function UpdateShapeTextByReplaceTextRecursive(ByRef shpItem, strFind, strReplace)
      Dim shpSubItem
      ' オートシェイプのコレクションのアイテムを順次取得します
      For Each shpSubItem In shpItem.Shapes
        ' オートシェイプのテキストに検索用ワードがある場合のみ置換処理を実行します
        If InStr(shpSubItem.Text, strFind) > 0 Then
          ' オートシェイプのテキストの検索用ワードを置換用ワードで置換します。
          shpSubItem.Text = Replace(shpSubItem.Text, strFind, strReplace)
        End If
        
        ' 内包するオートシェイプが存在する場合
        If shpSubItem.Shapes.Count > 0 Then
          ' 再帰的にオートシェイプのテキストを置換します
          UpdateShapeTextByReplaceTextRecursive shpSubItem, strFind, strReplace
        End If
      Next
    End Function
  • id:koikenoid
    ありがとうございました。テストしたところグループ化に対して置換されました。
    グループ以外は置換されなかったため下記を加えたところ、とりあえず動きました。
    本来はどのようにすればよいかご教授願いたくお願いいたします。


    ' オートシェイプのテキストを置換する処理(グループ化対応版)
    Function UpdateShapeTextByReplaceText( ByRef page, strFind, strReplace )
    Dim shpItem
    ' オートシェイプのコレクションのアイテムを順次取得します
    For Each shpItem In page.Shapes
    If InStr(shpItem.Text, strFind) > 0 Then
    shpItem.Text = Replace(shpItem.Text, strFind, strReplace)
    Else
    Call UpdateShapeTextByReplaceTextRecursive(shpItem, strFind, strReplace)
    End If
    Next
    End Function
  • id:cx20
    ちょっとテスト不足だったようですね。すみません。。。


    基本的な考え方としては、以下のようなオブジェクトオブジェクト階層を辿って行き、
    それぞれの Shape の Text を置換するというやり方になります。

    [ThisDocument]
     +-[Pages]
       +-[Item 1 : Page]
        +-[Shapes] <--------------- 内包する Shape が存在する場合、子に対して処理
         +-[Item 1 : Shape]
          +-[Text] <------------ Shape の Text に対して置換処理
         +-[Item 2 : Shape]
          +-[Shapes] <---------- 内包する Shape が存在する場合、子に対して処理
            +-[Item 1 : Shape]
             +-[Text] <------ Shape の Text に対して置換処理
            +-[Item 2 : Shape]
             +-[Text] <------ Shape の Text に対して置換処理

    > 本来はどのようにすればよいかご教授願いたくお願いいたします。

    少し修正してみました。


    ' 再帰的にオートシェイプのテキストを置換する処理(修正版)
    Function UpdateShapeTextByReplaceTextRecursive(ByRef shpItem, strFind, strReplace)
      ' オートシェイプのテキストに検索用ワードがある場合のみ置換処理を実行します
      If InStr(shpItem.Text, strFind) > 0 Then
        ' オートシェイプのテキストの検索用ワードを置換用ワードで置換します。
        shpItem.Text = Replace(shpItem.Text, strFind, strReplace)
      End If

      Dim shpSubItem
      ' オートシェイプのコレクションのアイテムを順次取得します
      For Each shpSubItem In shpItem.Shapes
        ' 再帰的にオートシェイプのテキストを置換します
        UpdateShapeTextByReplaceTextRecursive shpSubItem, strFind, strReplace
      Next
    End Function
  • id:koikenoid
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません