0

ここで質問するのは初めてなので、以下に進みます。

「見出し 1」または「見出し 2」のスタイル名を持つ Word ドキュメント内のテキストを検索しています。見つかったら、新しい範囲をそのテキストの先頭とドキュメントの末尾に設定し、その範囲内の最初のテーブルを検索し、列 2 にテキストがある場合は列 1 に番号を付けるメソッドを呼び出します。コードが完全に一致する最初のレコードを見つけたときに問題が発生します。すべてが機能しますが、Find.Execute は永久ループに入り、同じテキストを何度も検索し続けます。ドキュメントの最後まで検索を続けてほしい。これが私のコードです。事前に感謝します:

    public void TextFind(object findText, string reqCode)
    {
        Document doc = Application.ActiveDocument;
        Range docRange = doc.Sections[1].Range;
        var intCount = 0;
        docRange.SetRange(0, docRange.Characters.Count);
        if (findText == null) throw new ArgumentNullException("findText");
        docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop);
        while (docRange.Find.Found)
        {
            intCount++;
            Style style = docRange.get_Style();
            var styleName = style.NameLocal;
            if (styleName == "Heading 1" || styleName == "Heading 2")
            {
                var endRange = doc.Sections[1].Range;
                var docRange2 = docRange;
                docRange2.SetRange(docRange.Start, endRange.End);
                ApplyNumberingToTable(docRange2, reqCode);
            }
            docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop);
        }

        MessageBox.Show(intCount.ToString());
    }

intCountとはMessageBox、私が問題を診断する試みでした。

試行番号 2 の内容は次のとおりです。

だから私はまだ立ち往生しており、検索範囲をリストに追加し、リストで foreach を実行しようとしましたが、範囲が変更されるたびに、リスト内のその範囲への参照も変更されます。t5o が while ループ内で Range をインスタンス化する方法を理解することはできません。これが私のコードです:

public void TextFind(object findText, string reqCode)
    {
        Document doc = Application.ActiveDocument;
        Range docRange = doc.Sections[1].Range;
        var intCount = 0;
        if (findText == null) throw new ArgumentNullException("findText");
        var rangelist = new List<Range>();
        var i = 0;
        while (docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop))
        {
            rangelist = new List<Range> {docRange};
            intCount++;
        }
        foreach ( var range in rangelist)
        {
            Style style = range.get_Style();
            var styleName = style.NameLocal;
            if (styleName != "Heading 1" && styleName != "Heading 2") continue;
            var endRange = doc.Sections[1].Range;
            range.SetRange(range.Start, endRange.End);
            ApplyNumberingToTable(range, reqCode);
        }
        if (intCount == 0) return;
        MessageBox.Show(rangelist.ToString());
    }

これに対する修正をまだ探しています。ありがとう、

4

1 に答える 1

0

ドキュメントhereによると、メソッド自体は、検索に成功したかどうかについてブール値を返します。おそらく、この変数を取得して、Found プロパティではなく while ステートメントを使用する必要があります。現在、これをテストできません。今日中に結果を返します。

おそらく試してみてください:

        while (docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop))
        {
            intCount++;
            Style style = docRange.get_Style();
            var styleName = style.NameLocal;
            if (styleName == "Heading 1" || styleName == "Heading 2")
            {
                var endRange = doc.Sections[1].Range;
                var docRange2 = docRange;
                docRange2.SetRange(docRange.Start, endRange.End);
                ApplyNumberingToTable(docRange2, reqCode);
            }
            docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop);
        }
于 2012-09-18T15:51:04.893 に答える