dポイントプレゼントキャンペーン実施中!

word最新ver?で、こちらのマクロを使用して、複数のWord文書に対して文字列リストを元に連続して置換しています。
https://stabucky.com/wp/archives/13067

ただ、オートシェイプ内だけ、置換がおこなわれないようで、その記述の追記がわかりません。

参考にしたページは、リストではなく、一個毎のようでした。
https://www.wordvbalab.com/code/2162/

追記方法をお教えいただけないでしょうか。

なお、先日はマーカーの追記をお教え頂きました。有難うございました。繁忙期でテスト出来ずお礼が出来ませんでした。。申し訳ありません。

質問者からの補足コメント

  • へこむわー

    有難うございます。
    fujillinさんの記載された意味を考え、上記のリンクの一括置換のマクロの記述をちょっと変えたのですが、走りませんでした。。
    Qchan1962さんのページも見たのですが元々あまり詳しくなく。。
    すみません。再度ヒントをいただけるとありがたいです。


    Function 文書全体を置換(mae, ato)
    中略
    .Shape.TextFrame.TextRange.Text = mae
    中略
    .Shape.TextFrame.TextRange.Text = ato
    後略

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/04/20 08:30
  • つらい・・・

    Qchan様、何度も申し訳ありません。
    なぜか上手くいかず…

    https://stabucky.com/wp/archives/13067
    こちらを元にし、Function 文書全体を置換(mae, ato)以降を、昨日の通り変更しました。

    以下は変更せず動くものでしょうか?
    'Word文書に対する処理
    myfile = Dir(mypath & "*.doc*")
    Do While myfile <> ""
    Documents.Open FileName:=mypath & myfile
    For i = 0 To x - 1
    Call 文書全体を置換(mae(i), ato(i))
    Next i
    ActiveWindow.Close SaveChanges:=wdSaveChanges
    myfile = Dir
    Loop

      補足日時:2021/04/22 01:04

A 回答 (4件)

こんにちは


mae(i)ato(i)などの配列作成コードが不明なので何をされたいのかがわかりません。

参考にされているWebは段落を削除しているように思うのですが、
それが期待する結果でしょうか?

>ただ、オートシェイプ内だけ、置換がおこなわれないようで、その記述の追記がわかりません。
#3のサンプルは、オートシェイプ内のテキストに対してなので
段落、ワード文章とかは関係ありません。従って
Word文書に対して文字列リストを元に連続して置換が上手くいっているのなら、その処理が終了以後、#3のコードを試してみてください。
mae = "aa" シェイプ内テキストの変更前文字列
ato = "BB" シェイプ内テキストの変更後文字列

別々に実行して期待する結果になったのであれば、集約できるか検討してみてください。


追記
>こちらのマクロを使用して、複数のWord文書に対して文字列リストを元に連続して置換しています。
これも上手くいっていないのでしょうか?その場合、
何をどの(参考サイトの)ように何に置換を行っているのでしょう?
    • good
    • 0
この回答へのお礼

助かりました

Qchan1962さん
何度も有難うございました。質問がしまってしまうので、先にお礼させて下さい。
もう少しチャレンジして、理由を考えてみます。

一覧を元に、複数ファイル置換のマクロは動きます。ただ、テキストボックスの文字が置換対象から外れるため、それの機能も追加したかったのです。
マクロは難しいですね。。

お時間割いてくださり、本当にありがとうございました。

お礼日時:2021/04/23 07:33

#2です


>オートシェイプ内も
とありましたのでオートシェイプを重ねるなどしてグループにしているのかな、と思いました。
ご質問にある (みんなのワードマクロ)
https://www.wordvbalab.com/code/2162/
新田様のコードを参考にすると

Sub a()
Dim mae, ato
mae = "aa"
ato = "BB"
Call 文書全体を置換(mae, ato)
End Sub

Function 文書全体を置換(mae, ato)
Dim Shp As Shape
For Each Shp In ActiveDocument.Shapes
Shp.Select
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = mae '検索する文字列
.Replacement.Text = ato '置換後の文字列
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Next
End Function

でどうでしょう。
    • good
    • 0

こんばんは、


Excel、Wordもシェープ内にテキストを配置できるタイプは複数あるようです。
また、グループ化したシェイプはGroupItemsコレクションから対象シェイプを取得する必要があります。
Excelでの同様の質問に回答した際、少し躓きました。

WordVBAはあまり知らないのですが、参考サイトを示します。
解説などが少ないのでサンプルコードから理解するような方法になるかも

以前、リボンカスタマイズで大変参考にさせて頂きました
信頼度は高いと思います。

参考 https://www.ka-net.org/blog/?p=859

メソッドやプロパティは
Shape オブジェクト (Word)
https://docs.microsoft.com/ja-jp/office/vba/api/ …

ご質問の解釈が違っていたら、ごめんなさい
この回答への補足あり
    • good
    • 0

こんばんは



WordのVBAは知りませんけれど・・・

>リストではなく、一個毎のようでした。
いずれにしろ、直接的にはひとつずつ置き換えることになるでしょうから、リストのkeyの数だけループして置き換えを行えば宜しいでしょう。

ご提示のサンプルでは、置き換えたらシェイプに記入していますが(1個だけなので当然ですが)、複数回行う場合には無駄な処理になってしまいます。
文字列をまとめて置き換えてから、記入するほうが効率的と思われます。
 Shape.TextFrame.TextRange.Text
で、シェイプ内の文字列を取得できるようですので、文字列操作で全部の置き換えを行ってから、戻せば宜しそうに思われます。
https://docs.microsoft.com/ja-jp/office/vba/api/ …

※ ドキュメントを見ただけなので、はずしていたらスルーしてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!