Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2013年11月21日] [更新 2013年11月21日] ワード操作フォームEx
ワード操作フォームEx   参考コード類
文字列の検索と置換
動作確認等 Windows 7 U64(SP1) + Delphi XE2 + Word 2010







Find オブジェクトを使用した文字列の逐次検索


Find オブジェクトを使用して、文書内の指定文字列を、現在のキャレット位置から 逐次検索していきます。Find オブジェクトの Execute メソッドを実行すると、実際に、対象の文字列が検索できたか、できなかったを知ることができます。


図1
逐次検索
  • ボタンをクリックすると次を検索

リスト1
Find オブジェクトを使用した文字列の逐次検索。ダイアログは表示しない
procedure TplWordFormEx2.Button1Click(Sender: TObject);
var
  AFind : OleVariant;
begin
  AFind := wdfWordApp.Selection.Find;
  //検索条件のクリア
  AFind.ClearFormatting;
  AFind.Text := Edit1.Text;

  if AFind.Execute(Forward := True, Wrap := wdFindContinue) = False then begin
    ShowMessage('一致する文字列はありませんでした。');
  end;
end;




組み込みダイアログのダイアログを非表示で文字列を逐次検索


ワードの組み込みダイアログである Dialogs オブジェクトの wdDialogEditFind を使用して文字列の逐次検索を実行します。
ワードの組み込みダイアログは、Show メソッドを実行するとダイアログを表示します。Execute メソッドを実行すると、その時のプロパティの値で、ダイアログを表示しないで実行します。下のコードはダイアログを表示しないで、設定したプロパティの内容を実行する例です。

使用可能なプロパティはダイアログによって違います。ワードのオブジェクトを OleVariant 型で扱う方が便利です。以下のコードは、上のサンプルと同じく、現在のキャレット位置から、文字列を逐次検索していきます。


図2
逐次検索
  • ボタンをクリックすると次を検索

リスト2
組み込みダイアログを使用し、ダイアログを表示しないで文字列を逐次検索
procedure TplWordFormEx2.Button2Click(Sender: TObject);
var
  objDialog : OleVariant;
begin
  wdfSetFocusWord;

  try
    objDialog := wdfWordApp.Dialogs.Item(wdDialogEditFind);
    objDialog.Find      := Edit1.Text;
    objDialog.Direction := wdCollapseEnd;
    objDialog.Wrap      := wdFindContinue;
    objDialog.Execute;
  except
    raise;
  end;
  //これがないと正常に動作しない場合がある
  wdfSetFocusWord;
end;




検索ダイアログを表示して文字列を逐次検索


ダイアログのオブジェクトで、ダイアログを表示するには、Show メソッドを実行します。
その例です。
検索する文字列を設定してからダイアログを表示します。Delphi の IDE のように、文書で選択中の文字列を検索対象にするどの応用も可能です。現在のキャレット位置から検索を開始します。


図3
検索ダイアログで検索
  • 検索する文字列をダイアログにセットしている

リスト3
検索ダイアログを表示して文字列を逐次検索
procedure TplWordFormEx2.Button3Click(Sender: TObject);
var
  objDialog : OleVariant;
begin
  wdfSetFocusWord;

  try
    objDialog := wdfWordApp.Dialogs.Item(wdDialogEditFind);
    objDialog.Find      := Edit1.Text;
    objDialog.Direction := wdCollapseEnd;
    objDialog.Wrap      := wdFindContinue;
    objDialog.Show;
  except
    raise;
  end;
  //これがないと正常に動作しない場合がある
  wdfSetFocusWord;
end;




置換ダイアログを表示して文字列を逐次置換


置換ダイアログを表示して、文書内の文字列を置換します。ダイアログは検索ダイアログと同じですが、[置換] タブがアクティブになっていて、他のタブは選択できない状態となります。
下のコードでは、検索する文字列と置換後の文字列を設定してからダイアログを表示します。


図4
置換ダイアログを表示

リスト4
置換ダイアログを表示して文字列を逐次置換
var
  objDialog : OleVariant;
begin
  //これがないとダイアログが正常に表示しない場合がある
  wdfSetFocusWord;

  try
    objDialog := wdfWordApp.Dialogs.Item(wdDialogEditReplace);
    objDialog.Find    := Edit1.Text;
    objDialog.Replace := '置換後の文字列';
    objDialog.Show;
  except
    raise;
  end;
  //これがないと正常に動作しない場合がある
  wdfSetFocusWord;
end;




組み込みダイアログのダイアログを非表示で文字列を一括置換


ワードの組み込みダイアログは、Show メソッドを実行するとダイアログを表示します。Execute メソッドを実行すると、その時のプロパティの値で、ダイアログを表示しないで実行します。
下のコードは wdDialogEditReplace ダイアログを表示しないで、設定したプロパティの内容を実行する例です。図は、ワードの文書内の '文字列' を '置換後の文字列' に置換した結果です。


図5
文字列の一括変換
  • Dialog オブジェクトを使用するが、ダイアログは表示しない

リスト5
Dialog オブジェクトを使用し、ダイアログを表示しないで文字列を一括置換
procedure TplWordFormEx2.Button5Click(Sender: TObject);
var
  objDialog : OleVariant;
begin
  try
    objDialog := wdfWordApp.Dialogs.Item(wdDialogEditReplace);
    objDialog.Find       := Edit1.Text;
    objDialog.Replace    := '置換後の文字列';
    objDialog.ReplaceAll := wdReplaceAll;
    objDialog.Execute;
  except
    raise;
  end;
  //これがないと正常に動作しない場合がある
  wdfSetFocusWord;
end;




[ 検索 ] [ 置換 ] [ ジャンプ ] タブの切り換えが可能な検索ダイアログ


上の方のサンプルで、検索のダイアログを表示するものがあります。しかし、表示したダイアログは [検索] または [置換] タブしか使用可能になっていませんでした。
CommandBar ID (コマンドバー ID) を使用すると、どのタブもアクティブにすることが可能なダイアログを表示できます。検索や置換の文字列は、Find オブジェクトの該当プロパティで設定します。

CommandBar ID を使用してダイアログを表示する場合は注意が必要です。表示前に、ワードに入力フォーカスがないと非表示の状態でダイアログが起動してしまいます。また、他のアプリケーションがフォアグランドになった状態で、ワード操作フォームをアクティブにしても、ダイアログは最前面に表示できません。この現象はワード操作フォームEx の内部仕様が原因です。
ダイアログを表示しない CommandBar ID の実行であれば問題ありません。


図6
[検索] と [置換] ダイアログ

リスト6
[検索] [置換] [ジャンプ] タブの切り換えが可能な検索ダイアログ
procedure TplWordFormEx2.Button6Click(Sender: TObject);
var
  objWordApp : OleVariant;
  AFind      : OleVariant;
  pType      : OleVariant;
  pID        : OleVariant;
begin
  //これがないとダイアログが正常に表示しない場合がある
  wdfSetFocusWord;

  objWordApp := wdfWordApp.Application;
  AFind      := objWordApp.Selection.Find;
  //検索条件のクリア
  AFind.ClearFormatting;
  AFind.Text := Edit1.Text;

  pType := msoControlButton;
  pID   := 9276;

  try
    objWordApp.CommandBars.FindControl(pType, pID).Execute;
  except
    raise;
  end;
end;




コントロール ID を使用した文字列検索


上のサンプルと同じ CommandBars コレクションですが、コントロール ID を使用する例です。
コントロール ID の実行は ExecuteMso メソッドを使用します。引数はコントロール ID を識別する文字列です。
ここでは、NavigationPaneFind を使用しています。検索や置換の文字列は Find オブジェクトの該当プロパティで設定します。実行すると、下図のように検索した文字列の全ての背景色が変化します。
検索結果の状態を解除するには、空文字で再度検索を実行します。


図7
NavigationPaneFind を実行

リスト7
コントロール ID の NavigationPaneFind を使用した文字列の検索
procedure TplWordFormEx2.Button7Click(Sender: TObject);
var
  objWordApp : OleVariant;
  AFind      : OleVariant;
begin
  objWordApp := wdfWordApp.Application;
  AFind      := objWordApp.Selection.Find;
  //検索条件のクリア
  AFind.ClearFormatting;
  AFind.Text := Edit1.Text;

  try
    objWordApp.CommandBars.ExecuteMso('NavigationPaneFind');
  except
    raise;
  end;
  //これがないと正常に動作しない場合がある
  wdfSetFocusWord;
end;




Word 2010 の [ Ctrl ] + [ F ] とナビゲーションウィンドウ


Word 2007 までは [Ctrl] + [F] を押下すると、検索と置換のダイアログが表示されました。
Word 2010 では下図のように、ナビゲーションウィンドウが表示されるようになりました。
ワード操作フォームEx では仕様上、このナビゲーションウィンドウは表示できません。
下の図はサンプルプログラム集の [432] にボタンを追加して、下のコードを実行した結果です。

Word 2010 でも Word 2007 までと同じ検索と置換のダイアログを表示するようにできます。参考リンクの記事で確認してください。


図8
ナビゲーション非表示
図9
ナビゲーションを表示

リスト8
Word 2010 のナビゲーションウィンドウの表示を切り換える
ワード操作フォームEx では無効
procedure TForm1.Button4Click(Sender: TObject);
var
  objWordDoc : OleVariant;
begin
  objWordDoc := WordApplication1.ActiveDocument;
  objWordDoc.ActiveWindow.DocumentMap := not objWordDoc.ActiveWindow.DocumentMap;
end;