J'ai la fonction suivante, qui devrait retourner la position de la première occurrence du texte que je recherche. Le problème:Rechercher dans le document Word avec OLE ne fonctionne pas
- retourne -1
- lance AV-s, quand je suis en utilisant tout le contenu du document en tant que gamme (ou en utilisant une gamme avec les limites du contenu du document)
Qu'ai-je fait:
- Beaucoup de recherches Google, pour trouver la source du problème, ou des solutions de rechange à ce code
- MSDN creuser
- tâtonnement
Voici le code:
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;
Mise à jour
Le problème ne remplace pas le texte (je dois supprimer toutes les balises HTML qui peuvent apparaître dans le document Word, mais avec la torsion suivante: si je rencontre des balises de mise en forme, telles que b, i, u, s, fort, et autres, je dois les supprimer et mettre en forme le texte en conséquence)
La question n'a rien à voir avec le "remplacement" du texte, ce que fait votre fragment de code. Il manque également une déclaration pour 'vE'. –
+1 Ken, Le problème ne remplace pas le texte (je dois supprimer toutes les balises HTML qui peuvent apparaître dans le document Word, mais avec la torsion suivante: si je rencontre des balises de formatage, telles que b, i, u, s, fort, et semblable, je dois les enlever et formater le texte en conséquence) – beerwin