質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

VSTO

Visual Studio Tools for Office

Q&A

1回答

4723閲覧

Word VSTO で、Find.Executeの結果がSelectionに反映されない。

hsk

総合スコア728

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

VSTO

Visual Studio Tools for Office

0グッド

1クリップ

投稿2016/09/23 10:26

お世話になっております。
Visual Studio 2013 (Visual Studio Tools fpor Office)で、マネージドコードを使用したドキュメントを作成しています。開いたときに、一部の文書の文字列を置き換えます。Microsoft Word 2010 が対象です。

本来はReplacementに置き換えたい内容を指定して置換処理をしたかったのですが、「長すぎます」とエラーになってしまうため、Findで選択させSelectionオブジェクトの示す内容へ代入する方法で代替しています。

C#

1 void Application_DocumentOpen(Word.Document Doc) 2 { 3 4 var f = Doc.Sections.First.Range; 5 f.Find.ClearFormatting(); 6 f.Find.Text = "Moji"; 7 f.Find.Replacement.Text = ""; 8 f.Find.Forward = true; 9 f.Find.Wrap = Word.WdFindWrap.wdFindContinue; 10 f.Find.Format = false; 11 f.Find.MatchCase = false; 12 f.Find.MatchWholeWord = false; 13 f.Find.MatchByte = false; 14 f.Find.MatchAllWordForms = false; 15 f.Find.MatchSoundsLike = false; 16 f.Find.MatchWildcards = false; 17 f.Find.MatchFuzzy = true; 18 var a = f.Find.Execute(); 19 var b = Application.Selection.Text; 20 Application.Selection.TypeText("REPLACE"); 21 22}

例では "Moji"という文字を検索して、REPLACEという文字列に置き換えようとしています。
このとき、a は trueになるのですが、bはとんちんかんな内容を示しています。

可能性はDocumentOpenイベントではSelectionオブジェクトを扱えないか、他に間違いがあるかですが、うまくSelectさせ、置き換えさせるために、間違えている個所がありましたらご指摘いただけますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

最初の投稿よりかなり時間が経っているので、もう解決されたかもしれないし、もうここを見ていらっしゃらないかも知れませんが、ちょうどWordのVSTOを勉強中(ただしVB)で、もしかしたら同じ疑問をお持ちの方がいらっしゃるかも知れませんので、書き込みます。
まず、「var f」はWord.Range(以下、レンジと記載)を表し、f.Find.Execute()の検索により、検索文字の領域情報がレンジfに反映されます。
ここで注意しなければいけないのは、f.Find.Execute()の結果はレンジfに反映されるだけであって、文書内の選択位置(Selection)が変わるわけではないということです。
このため、変数bには検索結果と関係ない内容(具体的には元々の選択箇所)のテキストが入ります。
もし、検索された箇所を選択状態にし、ここの文字を置き換えるには、検索後のレンジfを選択状態(f.Select())にします。
以下のようなアレンジでどうでしょうか。

C#

1void Application_DocumentOpen(Word.Document Doc) 2 { 3 4 var f = Doc.Sections.First.Range; 5 f.Find.ClearFormatting(); 6 f.Find.Text = "Moji"; 7 f.Find.Replacement.Text = ""; 8 f.Find.Forward = true; 9 f.Find.Wrap = Word.WdFindWrap.wdFindContinue; 10 f.Find.Format = false; 11 f.Find.MatchCase = false; 12 f.Find.MatchWholeWord = false; 13 f.Find.MatchByte = false; 14 f.Find.MatchAllWordForms = false; 15 f.Find.MatchSoundsLike = false; 16 f.Find.MatchWildcards = false; 17 f.Find.MatchFuzzy = true; 18 var a = f.Find.Execute(); 19 if (a) //念のためif文を追加 20 { 21 f.Select(); //この行を追加 22 var b = Application.Selection.Text; 23 Application.Selection.TypeText("REPLACE"); 24 } 25}

投稿2019/07/24 02:57

kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問