ここで質問するのは初めてなので、以下に進みます。
「見出し 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());
}
これに対する修正をまだ探しています。ありがとう、