Vba Word 2013 - Supprimer paragraphes doublons dans un document

Résolu
Hantar - Modifié par Hantar le 8/01/2016 à 20:14
 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.

2 réponses

ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
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.
0
vb95
Messages postés
2775
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
30 juin 2022
151
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é
0
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
0
vb95
Messages postés
2775
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
30 juin 2022
151 > 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
0
Hantar > vb95
Messages postés
2775
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
30 juin 2022

Modifié par Hantar le 8/01/2016 à 23:16
Fonctionne parfaitement !
Merci beaucoup pour ton aide
0
vb95
Messages postés
2775
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
30 juin 2022
151 > 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 !
0
Hantar > vb95
Messages postés
2775
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
30 juin 2022

8 janv. 2016 à 23:27
meilleurs voeux à toi aussi et pour le code c'est ok
0