Vba Word 2013 - Supprimer paragraphes doublons dans un document [Résolu]

-
Bonjour,

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


Je reçois le message d'erreur suivant :

Erreur d'exécution '5941' :

Le membre requis de la collection n'existe pas.
Afficher la suite 

2 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68
0
Merci
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é
Salut,

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é :

[Code]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
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és
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68 > Hantar -
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
> vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
-
Fonctionne parfaitement !
Merci beaucoup pour ton aide
vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68 > Hantar -
ok Hantar
Essaie de comprendre le code aussi
Mets le sujet en résolu et meilleurs voeux !
> vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
-
meilleurs voeux à toi aussi et pour le code c'est ok
Commenter la réponse de vb95