次の関数があります。これは、検索しているテキストが最初に出現した位置を返す必要があります。問題:
- -1 を返します
- ドキュメント コンテンツ全体を範囲として使用している場合 (またはドキュメント コンテンツの境界を含む範囲を使用している場合)、AV-s をスローします。
私が何をした:
- 問題の原因、またはこのコードの代替を見つけるために、多くの Google 検索を行います。
- MSDN 掘り出し物
- 試行錯誤
コードは次のとおりです。
function FindTextWord(wordApp: TWordApplication; afindText: OleVariant; startIndex, endIndex: Integer; findEndOffsetFast: Boolean): Integer;
var
matchCase : OleVariant;
matchWholeWord : OleVariant;
matchWildcards : OleVariant;
matchSoundsLike : OleVariant;
matchAllWordForms: OleVariant;
fWd : OleVariant;
wrap : OleVariant;
format : OleVariant;
replaceWith : OleVariant;
replace : OleVariant;
myRange : Range;
startSearchOffset: OleVariant;
endSearchOffset : OleVariant;
begin
WordApp.Selection.Start := 0;
WordApp.Selection.End_ := 0;
result:=-1;
try
if (Assigned(WordApp)) then
begin
if (startIndex<1) then
begin
WordApp.ActiveDocument.GrammarChecked:=true;
WordApp.ActiveDocument.SpellingChecked:=true;
WordApp.ActiveDocument.ShowGrammaticalErrors:=false;
WordApp.ActiveDocument.ShowSpellingErrors:=false;
startSearchOffset:=WordApp.ActiveDocument.Content.Start;
end else
begin
startSearchOffset:=startIndex;
end;
if (endIndex<1) then
begin
if (findEndOffsetFast)or(startIndex<1) then
begin
endSearchOffset:=WordApp.ActiveDocument.Content.End_;
end else
begin
endSearchOffset:=startSearchOffset+1;
WordApp.Selection.Start:=startSearchOffset;
while (WordApp.Selection.Start=startSearchOffset)and(endSearchOffset<WordApp.ActiveDocument.Content.End_)and(endSearchOffset-startSearchOffset<4000) do
begin
endSearchOffset:=endSearchOffset+1;
WordApp.Selection.End_:=endSearchOffset;
end;
endSearchOffset:=endSearchOffset-1-Length(afindText);
end;
end else
begin
endSearchOffset:=endIndex;
end;
myRange:=WordApp.ActiveDocument.Range(startSearchOffset,endSearchOffset);
myRange.Find.ClearFormatting;
myRange.Start:=Integer(startSearchOffset);
myRange.End_:=Integer(endSearchOffset);
MatchCase := False;
MatchWholeWord := TRUE;
MatchWildcards := False;
MatchSoundsLike := False;
MatchAllWordForms := False;
fWd := True;
Wrap := wdFindStop;
Format := False;
ReplaceWith := '';
Replace := wdReplaceNone;
if MyRange.Find.Execute(aFindText,MatchCase,MatchWholeWord,
MatchWildcards,MatchSoundsLike,
MatchAllWordForms,fWd,
Wrap,Format,ReplaceWith,Replace)
then begin
if (myRange.Start>=startSearchOffset) then
begin
if (myRange.Find.Found) then
begin
result:=myRange.Start;
end;
end else
begin
result:=FindTextWord(wordApp,afindText,startIndex,endIndex,false);
end;
end;
end;
except
end;
end;
アップデート
問題はテキストの置換ではありません (単語文書に表示される可能性のあるすべての HTML タグを削除する必要がありますが、次のひねりがあります: b、i、u、s、strong などの書式設定タグに遭遇した場合、iそれらを削除し、それに応じてテキストをフォーマットする必要があります)