Find.Executeのワイルドカードを使用した、セル内の最後や改行前の対象の検出方法

Anonymous
2016-12-15T02:25:14+00:00

いつもお世話になっております。

Word VBAでFind.Excuteを使用したワイルドカードの検索マクロを作成しようとしているのですが、

表のセル内最後の文字列や改行前に検索対象がある場合に、期待する検出ができません。

◆作成マクロ(ワイルドカード)

Sub find_test_wd()<br><br><br>  Dim SRC_str As String <br><br>  Dim CHK_str As String <br><br>  Dim rng As Range <br><br>  Dim cm As Comment <br><br>  <br><br>  SRC_str = "サーバ[!ー]" <br><br>  CHK_str = "「" & SRC_str & "」を検出"<br><br><br>  Set rng = ActiveDocument.Content <br><br>  rng.Find.Text = SRC_str <br><br>    <br><br>  Do While rng.Find.Execute(MatchWildcards:=True) = True <br><br>    <br><br>        Set cm = rng.Comments.Add(Range:=rng, Text:=CHK_str) <br><br>         cm.Author = "検索テスト" <br><br>         cm.Initial = "検索" <br><br>      <br><br>  Loop <br><br>    <br><br>End Sub◆結果例

※期待以外の動作

・表のセル内最後に検出対象がある場合、検出されていない

 (表の1列目1-2行目など。1列目3行目のように後ろに改行が入ると検出される。

  表直下の文字列「※は検証サーバ」と同様検出できるようにしたいです。)

・(表内外に関わらず)改行前に検出対象がある場合、二重に検出されてしまう

 (コメント3・4、5・6)

ワイルドカードを使用していない場合は、検出対象がセル内最後にあっても検出できており、また重複もないので、同じことができるようにしたいです。

◆作成マクロ(ワイルドカード使用なし)

Sub find_test()<br><br><br>  Dim SRC_str As String <br><br>  Dim CHK_str As String <br><br>  Dim rng As Range <br><br>  Dim cm As Comment <br><br>  <br><br>  SRC_str = "サーバ" <br><br>  CHK_str = "「" & SRC_str & "」を検出"<br><br><br>  Set rng = ActiveDocument.Content <br><br>  rng.Find.Text = SRC_str <br><br>    <br><br>  Do While rng.Find.Execute = True <br><br>    <br><br>        Set cm = rng.Comments.Add(Range:=rng, Text:=CHK_str) <br><br>         cm.Author = "検索テスト" <br><br>         cm.Initial = "検索" <br><br>      <br><br>  Loop <br><br>    <br><br>End Sub◆結果例(検出もれ・重複検出なし)

指定文字列の指定やマクロの書き方に問題があるのでしょうか?

修正方法や、回避策があれば教えていただきたいです・・・。

宜しくお願い致します。

◆環境

・Windows Server 2008 R2(Enterprise)

・Microsoft Office Professional Plus 2010

 Word(14.0.7173.5000,32ビット)

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。 プライバシーを保護するために、移行された質問のユーザー プロファイルは匿名化されます。

0 件のコメント コメントはありません
{count} 件の投票

2 件の回答

並べ替え方法: 最も役に立つ
  1. Makapu 86,635 評価のポイント ボランティア モデレーター
    2016-12-15T14:07:21+00:00

    こんばんは。

    ワイルドカードの指定を

     SRC_str = "サーバ[!ー]"

    ではなく

     SRC_str = "サーバ*"

    としてはダメでしょうか。(意図している事と違っていたらすみません。。。)

    [参考] ワイルドカード文字リファレンス

    ※以下試してみて自分なりの解釈になります。

    ◆ SRC_str = "サーバ[!ー]" で指定した場合

    <表の中>

     "サーバ"の後ろに何か一文字必要("ー"以外)。

     =「”サーバ” + ”ー”以外の何か一文字」が検索対象。(よって"サーバ"の後ろに文字が無いものは除外される。)

     (後ろで改行すると検出される件については、1つ目の改行コードは文字コードとして認識されていると推測。)

    上の結果例からいうと、検索されているのは

    サーバは

    サーバ用

    サーバ(改行コード)

    <表の外>

    (1)"サーバ" + 改行でも検索される。

    (2)二重に検出される部分は表の中・外どちらも改行コードの検出時。

    (1)(2)の結果から、表の外では改行コードが一文字として認識されている様である。

    上の結果例からいうと、検索されているのは

    サーバ(改行コード)

    サーバル


    また、VBAについては開発の方が多く利用される専用のフォーラムがありますので

    よろしければご利用されてみてはいかがでしょう。

    **Msdnフォーラム(VBA)**

    0 件のコメント コメントはありません
  2. Anonymous
    2016-12-15T23:17:13+00:00

    Makapuさん

    返信ありがとうございます。

    丁寧に解釈していただいてわかりやすかったです。

    表の中では、"サーバ"の後ろに何か一文字必要("ー"以外)、ということなのですね。

    表の中の改行表示は、改行ではないから表の中と外で挙動が違うように見えるのでしょうか。

    ご提案いただいた「サーバ*」での検索なのですが、

    マクロの作成目的として、

    「サーバー」の表記にそろえたいので「サーバー」ではなく「サーバ」となっているものを検出したい、という意図があります。(※表記ゆれをコメントで指摘したい)。

    「サーバ*」だと両方を検出してしまうので、ちょっと意図と外れてしまうのです。

    VBAのフォーラムのリンクもありがとうございます。

    いただいた回答の内容をふまえて、そちらのほうでも聞いてみることにします。

    ありがとうございました。

    ※追記 移動しました

    https://social.msdn.microsoft.com/Forums/ja-JP/c48bc07b-d2b4-4820-8c90-228c76346d29/findexecute?forum=vbajp

    0 件のコメント コメントはありません