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

- 8 janv. 2016 à 20:11 - Dernière réponse :  Hantar - 8 janv. 2016 à 23:27
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 

Votre réponse

2 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
Modifié par ucfoutu le 8/01/2016 à 20:17
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
1710
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 novembre 2018
8 janv. 2016 à 20:43
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
Messages postés
1710
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 novembre 2018
> 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
>
Messages postés
1710
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 8 janv. 2016 à 23:14
Fonctionne parfaitement !
Merci beaucoup pour ton aide
Messages postés
1710
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 novembre 2018
> Hantar - 8 janv. 2016 à 23:18
ok Hantar
Essaie de comprendre le code aussi
Mets le sujet en résolu et meilleurs voeux !
>
Messages postés
1710
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 8 janv. 2016 à 23:27
meilleurs voeux à toi aussi et pour le code c'est ok
Commenter la réponse de vb95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.