J'ai un document qui est constitué de plusieurs paragraphes dont certains se retrouvent plusieurs fois à l'identique. J'ai écris une macro pour les supprimer, mais elle ne fonctionne pas : il ne se passe rien...
Voici le code :
Fin = oDoc.BuiltInDocumentProperties(wdPropertyParas)
For i = 1 To Fin - 1
myPar = oDoc.Paragraphs(i).Range.Text
For p = i + 1 To Fin
myKey = oDoc.Paragraphs(p).Range.Text
If myPar = myKey Then
oDoc.Paragraphs(p).Range.Select
Selection.Delete
End If
Next p
Next i
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 Modifié par ucfoutu le 8/01/2016 à 20:17
Bonjour,
Déjà (et bein que je n'utilise pas personnellement Word) :
Lorsque l'on détruit en boucle (quel que puisse être le langage de développement) , on commence par la fin pour remonter vers le haut (step -1). Si non, on se fait forcément des croche-pieds avec les indexes.
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
vb95
Messages postés3416Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023165 8 janv. 2016 à 20:43
Bonjour Hantar
Si la première boucle est bien
For i = Fin - 1 To 2 Step -1
la boucle intérieure ne doit surtout pas être
For p = Fin -2 To 1 step - 1
mais
For p = i-1 To 1 step - 1
De plus si on trouve un doublon c'est celle référencé par l'indice i qu'il faut supprimer et sortir de la boucle intérieure par Exit For !
Si il y avait un triplé entre i , p et un troisième paragraphe c'est en comparant p et ce troisième au prochaine tour de boucle qu'il s'éliminerait d'où l'utilité du Exit For
Un bonjour amical à ucfoutu en lui souhaitant bonne année et bonne santé
J4ai suivi tes indications, la macro tourne, mais le résultat n'est pas efficient : il reste toujours des doublons, des triplons, des quadriplons, etc... (!!)
Le document que je traite à des paragraphes qui se retrouvent parfois une dizaine ou une quinzaine de fois...
Voici le code si tu vois ce qui peut être amélioré :
For i = Fin - 1 To 2 Step -1
myPar = oDocCible.Paragraphs(i).Range.Text
For p = i - 1 To 1 Step -1
myKey = oDocCible.Paragraphs(p).Range.Text
If myPar = myKey Then
oDocCible.Paragraphs(p).Range.Select
Selection.Delete
Fin = oDocCible.BuiltInDocumentProperties(wdPropertyParas)
End If
If p >= Fin Then Exit For
Next p
If i >= Fin Then Exit For
Next i/Code
vb95
Messages postés3416Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023165
>
Hantar
8 janv. 2016 à 23:03
Fin = oDocCible.BuiltInDocumentProperties(wdPropertyParas)
For i = Fin - 1 To 2 Step -1 myPar = oDocCible.Paragraphs(i).Range.Text For p = i - 1 To 1 Step -1 myKey = oDocCible.Paragraphs(p).Range.Text If myPar = myKey Then oDocCible.Paragraphs(p).Range.Select Selection.Delete Exit For End If Next p Next i
Hantar
>
vb95
Messages postés3416Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023 Modifié par Hantar le 8/01/2016 à 23:16
Fonctionne parfaitement !
Merci beaucoup pour ton aide
vb95
Messages postés3416Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023165
>
Hantar
Modifié par vb95 le 8/01/2016 à 23:19
ok Hantar
Essaie de comprendre le code aussi
Mets le sujet en résolu et meilleurs voeux !
Hantar
>
vb95
Messages postés3416Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention31 mai 2023 8 janv. 2016 à 23:27
meilleurs voeux à toi aussi et pour le code c'est ok