Suppression d'un doublon non aléatoire

franzoose

XLDnaute Nouveau
Bonjour à tous !

Voilà, je quémande votre aide pour concevoir une macro de traitement des doublons...

J'ai un tableau contenant des données sur des dossiers. Pour info, le tableau a 9 colonnes.
La première colonne (colonne A) comporte un numéro de dossier, c'est en quelque sorte "la clé primaire" du tableau.

Le problème : Il y a beaucoup de doublons dans la colonne A.
Alors bien sûr la solution est de supprimer les doublons (et leur ligne entière associée) par une macro. Jusque là, ça va !

Mais il y a un autre problème, certaines lignes sont moins bien renseignées que d'autres.
Par exemple, certains dossiers/lignes ont 9 colonnes renseignés alors que d'autres dossiers/lignes n'ont que 4 voir 5 colonnes remplies.

Donc voilà, je ne peux pas supprimer les doublons de manière aléatoire, la macro doit garder le doublon le mieux renseigné et supprimer le doublon le moins renseigné.

L'idéale serait bien sûr de concaténer les 2 (ou 3) lignes doublons. Mais la concaténation devrait concerner uniquement les champs vides de la ligne. Ainsi, la ligne résultante serait toujours mieux (ou également) renseignée que la mieux renseignée des 2 lignes doublons. Mais je ne sais pas si c'est possible...


Voici, pour le moment, le résultat de mon jus de cerveau...

OS : Windows Vista
Version Excel : Excel 2007

Code:
Private Sub CommandButton3_Click()

Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim derniere_ligne As Integer
Dim compteuri As Integer
Dim compteurj As Integer

derniere_ligne = Range("A65536").End(xlUp).Row

For i = 5 To derniere_ligne   'les premières données se trouvent à la ligne 5
    For j = derniere_ligne To 5 Step -1
    
        If Range("B" & i) = Range("B" & j) Then
            For m = 1 To 9
                
                If Cells(i, m) <> "" Then
                compteuri = compteuri + 1
                End If
                    
                If Cells(j, m) <> "" Then
                compteurj = compteurj + 1
                End If
            Next
        
            If compteurj > compteuri Then
                Rows(i).Delete
            Else
                Rows(j).Delete
            End If
        End If
    Next
Next

End Sub


Effrayant, hin ? Une fois lancée, la macro ne se termine pas !

Dans tous les cas, merci pour vos coups de main :)
 

franzoose

XLDnaute Nouveau
Re : Suppression d'un doublon non aléatoire

Merci pour vos réponses !

@CISCO : Le fichier comporte 460 lignes actuellement et est amené à en accueillir plus dans le temps. Ce n'est pas forcément indispensable de le faire avec une macro (du moment que ce soit facilement utilisable pour l'utilisateur). Pour info, les lignes du tableau proviennent de plusieurs fichiers excel externes. C'est pour cela qu'on retrouve des doublons (pour l'intitulé d'un dossier) mais que les champs de chaque doublons ne sont pas tous remplies (selon la provenance des fichiers Excel sources).

@néné06 : Je suis d'accord que cela simplifierait les choses. Mais je ne peux le faire vu le nombre de données confidentielles contenues. Et modifier 460 lignes à la main... A moins qu'il existe un moyen simple de disposer les chiffres et les lettres aléatoirement dans chaque case ?

Pour te donner une idée du tableau :

Col A Col B Col C Col D Col E Col F Col G Col H Col I
XFGT-7 L'affaire M.X M.Dutoit M.Durand 14/09/10
FGGH-3 Chantier 45 Loire M.Fabrice M.Fernand 1 an 15/10/12 31/10/12
XFGT-7 L'affaire M.X Paris M.Dutoit 3 ans Non 05/08/10 14/09/10

La ligne 1 et 3 désigne la même affaire mais ne disposent pas des mêmes informations
 

franzoose

XLDnaute Nouveau
Re : Suppression d'un doublon non aléatoire

Merci pour vos réponses !

@CISCO : Le fichier comporte 460 lignes actuellement et est amené à en accueillir plus dans le temps. Ce n'est pas forcément indispensable de le faire avec une macro (du moment que ce soit facilement utilisable pour l'utilisateur). Pour info, les lignes du tableau proviennent de plusieurs fichiers excel externes. C'est pour cela qu'on retrouve des doublons (pour l'intitulé d'un dossier) mais que les champs de chaque doublons ne sont pas tous remplies (selon la provenance des fichiers Excel sources).

@néné06 : Je suis d'accord que cela simplifierait les choses. Mais je ne peux le faire vu le nombre de données confidentielles contenues. Et modifier 460 lignes à la main... A moins qu'il existe un moyen simple de disposer les chiffres et les lettres aléatoirement dans chaque case ?

Pour te donner une idée du tableau :

Col A Col B Col C Col D Col E Col F Col G Col H Col I
XFGT-7 L'affaire M.X M.Dutoit M.Durand 14/09/10
FGGH-3 Chantier 45 Loire M.Fabrice M.Fernand 1 an 15/10/12 31/10/12
XFGT-7 L'affaire M.X Paris M.Dutoit 3 ans Non 05/08/10 14/09/10

La ligne 1 et 3 désigne la même affaire mais ne disposent pas des mêmes informations
 

néné06

XLDnaute Accro
Re : Suppression d'un doublon non aléatoire

Re
A la vue de ton fichier , je te conseillerais, si cela ne le perturbe pas, de commencer par un tri alpha sur la colonne A.
Tu regardes ensuite si la ligne du dessous a la même référence.
Tu complètes les cases non renseignées dans la première ref
tu supprimes la ligne du dessous.
tu recommences pour toutes les ref identiques
tu passe à la ligne suivante , donc une autre ref ... ect ...
Si cela t'aide ?

A+
 

franzoose

XLDnaute Nouveau
Re : Suppression d'un doublon non aléatoire

Je viens d'essayer, et en effet c'est bien plus simple en procédant ainsi.
Mais je me vois mal dire à mon collègue de faire ça tous les jours ^^.

En y réfléchissant, il faut que je traduise en VBA le processus que tu viens de me décrire... Hm... Dur XD !

Et sinon, si on se limitait uniquement à supprimer la ligne qui contient le moins d'infos pour garder uniquement la ligne la mieux renseigné, ce serait faisable en VBA ?
 

néné06

XLDnaute Accro
Re : Suppression d'un doublon non aléatoire

Je parlais de faire cela en VBA.
Si tu adresse un bout de 5 ou 6 lignes de ton fichier en remplaçant des données confidentielles par des données "bidons", les participants du forum le résoudront facilement.
Ce soir je n'ai pas le temps, mais si personne ne le fait, je pourrais demain en fin d'après-midi m'en charger.

A+
 
Dernière édition:

franzoose

XLDnaute Nouveau
Re : Suppression d'un doublon non aléatoire

Re-salut néné06 !

Si tu arrives à faire cela, ce serait vraiment cool !!
J'ai fait ce que tu as dit, voici le fichier Excel avec une dizaine de ligne de données.

Bonne soirée :)
 

Pièces jointes

  • Tab_Record.xlsx
    9.9 KB · Affichages: 54

CISCO

XLDnaute Barbatruc
Re : Suppression d'un doublon non aléatoire

Bonsoir

Une possibilité en pièce jointe, avec deux formules matricielles (à valider avec ctrl+maj+entrer), en M2 (à tirer vers le bas) et en N2 (à tirer vers la droite et vers le bas). On peut effacer les 0 qui apparaissent dans les cellules vides, soit avec les formules, soit avec le format.

A toi d'adapter cela à ton fichier réel.

Comme il s'agit de formules matricielles, cela risque de prendre du temps de calcul, mais bon...

@ plus
 

Pièces jointes

  • Tab_Record Franzoose.xlsx
    14.1 KB · Affichages: 47
  • Tab_Record Franzoose.xlsx
    14.1 KB · Affichages: 49
  • Tab_Record Franzoose.xlsx
    14.1 KB · Affichages: 47

franzoose

XLDnaute Nouveau
Re : Suppression d'un doublon non aléatoire

Re-salut !!

Je viens de tester tes fonctions, et c est a l air de tres bien
fonctionner. Par contre, comment faire pour transferer le tableau resultant (avec les fn a l interieur)
sur une autre feuille ? Le copier coller n a pas l air de lui faire plaisir ^^.

Et aussi, comment faire pour prolonger l effet de tes formules aux autres lignes du tableau initial ?

J ai essaye cet aprem de comprendre les fonctions mais j avoue c est trop baleze Pour moi...

Et un grand merci, ton aide m a redonne l espoir :)
 

néné06

XLDnaute Accro
Re : Suppression d'un doublon non aléatoire

Bonsoir franzoose,CISCO

Ma version en VBA
J'ai enlevé les cellules fusionnées car VBA déteste cela!

Voici le code

Private Sub CommandButton1_Click()
'recherche der ligne
num = Cells.Find("*", , , , , xlPrevious).Row
'tri
Range(Cells(1, 1), Cells(num, 9)).Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Range("A1").Select
'teste toutes les lignes
i = 1
Do Until Cells(i + 1, 1) = ""
modif = 0
If Cells(i + 1, 1) = Cells(i + 2, 1) Then 'verifie manques
modif = 1
For j = 2 To 9
If Cells(i + 1, j) = "" And Cells(i + 2, j) <> "" Then
Cells(i + 1, j) = Cells(i + 2, j) 'complète la ligne
End If
If Len(Cells(i + 1, j)) < Len(Cells(i + 2, j)) Then
Cells(i + 1, j) = Cells(i + 2, j) 'complète la ligne
End If
Next j
If modif = 1 Then 'sup du doublon
Rows(i + 2).Delete
End If
i = i - 1
End If
i = i + 1
Loop
End Sub


A+
 

Pièces jointes

  • Copie de Tab_Record.xlsm
    23.5 KB · Affichages: 52

pierrejean

XLDnaute Barbatruc
Re : Suppression d'un doublon non aléatoire

Bonjour à tous

Un essai en Vba

Edit: Vu ta solution néné (a priori meilleure que la mienne: recupere les manquants )
 

Pièces jointes

  • Tab_Record.xls
    50 KB · Affichages: 45
Dernière édition:

Discussions similaires

Réponses
11
Affichages
304

Membres actuellement en ligne

Statistiques des forums

Discussions
312 330
Messages
2 087 347
Membres
103 526
dernier inscrit
HEC