MACROS : tri conditionnel sans doublons en macros ?

atomic

XLDnaute Nouveau
Bonjour à tous,

Voici ce qui m'ammène : je souhaite réaliser un tri conditionnel en macro sur un tableau pour en supprimer les doublons (voi tableau en pièce jointe).
J'ai essayé pas mal de macros mais je ne connais encore pas suffisamment les macros pour réussir à mettre au point ce que je veux (voir le fichier excel joint).

A mon avis, on doit pouvoir partir de cette macro:
Code:
Sub Macro1()
Dim Tableau As Range             'declaration
Dim i As Integer, j As Integer   'declaration
Dim Test As Boolean              'declaration

Set Tableau = Range("A1").CurrentRegion    ' Définit la région globale
For i = Tableau.Rows.Count To 2 Step -1    ' Définit les lignes concernées
For j = 1 To 1                                        ' Définit les colonnes concernées (To Tableau.Columns.Count pour l'ensemble des colonnes)

    Test = True
        If Tableau(i, j) <> Tableau(i - 1, j) Then Test = False  'Vérifie si la ligne i est identique à la i-1
    Exit For
Next
    If Test Then Tableau.Rows(i).Delete    'si Test=Vrai, supprimer la ligne i
Next
End Sub

Le problème avec cette macro c'est qu'elle ne supprime les doublons que sur 2 lignes identiques (parfois j'en ai 4, 5 voir + identiques).

Merci d'avance pour vos réponses/commentaires:cool:
 

Pièces jointes

  • Classeur1.zip
    17.5 KB · Affichages: 167
  • Classeur1.zip
    17.5 KB · Affichages: 94
  • Classeur1.zip
    17.5 KB · Affichages: 87
Dernière édition:

néné06

XLDnaute Accro
Re : MACROS : tri conditionnel sans doublons en macros ?

Bonsoir Atomic, le Forum.
Je n’ai pas trop bien compris ce que tu recherches donc je te fais parvenir un bout de code qui dans un premier temps enlèvera les doublons.
Si cela est dans la bonne voie, explique nous ce que tu recherches après.

Cordialement
 

atomic

XLDnaute Nouveau
Re : MACROS : tri conditionnel sans doublons en macros ?

Un grand merci néné06, c'est déjà une bonne chose de faite!
-> Petite précision : ton script fonctionne très bien mais j'ai dû rajouter un filtre ascendant sur la 1ere colonne pour que les doublons de + de 2 lignes soient pris en compte aussi.

Concernant la suite des réjouissance (c'est là que ça se complique sérieusement!):
Voici comment je vois les choses pour réaliser un tri sans doublons SAUF si le total des quantités de la colonne C:C d'une même ref est > à la quantité de la 1ere ligne de cette même ref (dans ce cas, on ne supprime pas les doublons de cette ref).

1/Faire un tri du + ancien au + récent sur la colonne D:D, puis faire un tri ascendant sur la colonne A:A pour avoir les doublons apparents (je l'ai déjà fait en macro).

2/ Ensuite, prendre comme champ de travail chaque ensemble de lignes qui ont la même reference en colonne A:A, et y appliquer les opérations suivante, puis passer à l'ensemble de lignes de même ref d'après.

3/sur chacun de ces champs de travail, faire le total des chiffres de la colonne C:C et vérifier sil est > ou < à la 1ere ligne de la colonne F:F de ce même champ de travail.

4/ Si le total de la colonne C:C du champ de travail est > à celui de la 1ere ligne du champ de travail de la colonne F, ne pas supprimer les doublons de cette ref.
Si le total de la colonne C:C du champ de travail est < à celui de la 1ere ligne du champ de travail de la colonne F, alors supprimer les autres lignes (les doublons).

5/ Prendre un tube d'aspro pour calmer le mal de tête qui vient de vous prendre en essayant de comprendre ces lignes!
 

atomic

XLDnaute Nouveau
Re : MACROS : tri conditionnel sans doublons en macros ?

Salut Atomic
J'ai refais le programme de A à Z avec des remarques explicatives.
Regarde et dis moi si c'était la bonne voie,et envoie les remarques éventuelles.

A+

Merci beaucoup néné06 pour ton travail ! En effet, on s'approche à grand pas du code final !!!
A part ça oui, j'ai bien une "remarque éventuelle :p " : le code m'a l'air correct mais une fois éxécuté, il ne donne pas le résultat attendu...
Je pensais que cela venait de la contradiction de la formule au début du code ci-dessous mais après correction, ça ne donne pas encore le résultat attendu, pour rappel: (pour une même ref) si la somme colC est > premiere ref col F, alors conserver les lignes en doublon, sinon supprimer les doublons.
Code:
' si somme colC est > premiere ref col F (inverse de la formule dessous ?!?)
If Cells(num_lig_active, 6) > total_colC Then
                  
'pas de supprimer doublons
num_lig_active = nb_ref_ident + num_lig_active - 1
  Else
'supprimer doublons
Range(Cells(num_lig_active + 1, 1), Cells(nb_ref_ident + num_lig_active, 10)).ClearContents
    num_lig_active = nb_ref_ident + num_lig_active - 1
     End If
      End If
On ne doit pas etre loi de la solution pourtant...
 

néné06

XLDnaute Accro
Re : MACROS : tri conditionnel sans doublons en macros ?

lorsque tu parles de la premiere ref de la col F , il ne s'agit pas toujours de la cellule F2??
mais de la cellule en col F correspondante au debut de la serie de la col A

est > premiere ref col F, alors conserver les lignes en doublon.

A+
 

atomic

XLDnaute Nouveau
Re : MACROS : tri conditionnel sans doublons en macros ?

Peux-tu nous faire parvenir sur une feuille3 le résultat final que tu souhaites obtenir.

A+

Voici le classeur avec les lignes identifiées :
1- celles correctement supprimées par la macro actuelle,
2- celles supprimées par la macro actuelle mais qui n'auraient pas dû l'être (principalement la 1ere ligne après les lignes supprimées),
3- et celles qui auraient dû être supprimées et qui ne l'ont pas été.

La plupart des lignes sont plutôt dans la 1ere catégorie :) , c'est un bon signe!

Pour le message précédent : Oui, je parle bien de la 1ere cellule en F de chaque zone.

P.S. : Tu verras aussi que j'ai un peu modifié:
- les tri au départ et à la fin car ils n'étaient pas dans le bon sens,
- et la formule du milieu de la macro (le If) comme déjà parlé auparavant.
 

Pièces jointes

  • Classeur12.zip
    21.2 KB · Affichages: 83
  • Classeur12.zip
    21.2 KB · Affichages: 89
  • Classeur12.zip
    21.2 KB · Affichages: 65

atomic

XLDnaute Nouveau
Re : MACROS : tri conditionnel sans doublons en macros ?

Alors, voyons...
Ta derniere version a en effet corrigé le problème du "-1" qui était en trop dans la boucle de suppression :).
Avec ta dernière version la macro tourne donc exactement comme je le voulais... dans la 1ere moitié du tableau. Car la fin du tableau montre plusieurs erreurs (dû au premier filtre je pense).

ci-joint voir le fichier joint où j'ai mis en évidence :
- en jaune les lignes qui ont été supprimées involontairement,
- en orange les lignes qui auraient dû disparaitre.

P.S. : pour le filtre de la colonne D, il doit se faire de la date la + ancienne à la + récente (ordre ascendant donc, non descendant), afin que lorsqu'on supprime des lignes, il ne doit rester que la ligne avec la date la + ancienne.

Tu verras aussi que j'ai dû modifier le filtre final car le précédent ne fonctionnait pas de manière optimal (j'ai l'impression qu'avec ta macrole tri de la colonne A et de la colonne D se font en même temps, alors qu'il faut faire d'abord la colonne D, puis la A).

Correction : cela ne provient pas des filtres sur les colonnes A et D...
Je les ai remplacés par ce code et le résultat est toujours le même:
Code:
Cells.Select
        Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
        Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
 

Pièces jointes

  • Classeur1 retouché.zip
    20.3 KB · Affichages: 94
Dernière édition:

néné06

XLDnaute Accro
Re : MACROS : tri conditionnel sans doublons en macros ?

J'ai placé un stop à la fin de ma routine, et tu constateras après le Stop sur la feuille, que sur la feuille le programme et Ok .
Si tu trie après,les cases jaunes et oranges indiqueront une autre cellule.
Pour moi tout me semble Ok jusqu'au Stop

A+
 

atomic

XLDnaute Nouveau
Re : MACROS : tri conditionnel sans doublons en macros ?

Je pense avoir compris ce qui se passe, néné06 !!

En fait, la macro fonctionne très bien, par contre, au bout d'un moment, elle décale d'une ligne son analyse, ce qui fait qu'elle se base sur la 2e cellule de la colonne F (et non sur la 1ere) pour chaque ref pour supprimer ou non les lignes en doublon qui sont situées... sous la 2e ligne de chaque ref!

-> voir par exemple ce qui se passe pour la ref 603CE05AAY02...
 
Dernière édition:

atomic

XLDnaute Nouveau
Re : MACROS : tri conditionnel sans doublons en macros ?

Tiens d'ailleurs, un autre soucis :
Lorsque je passe la macro dans la vrai feuille finale qui a 470 lignes au lieu des 120 que j'ai mis sur le fichier de test, j'obtiens une "Erreur 6 : dépassement de capacité" !!

J'ai essayé de jouer sur les types de déclaration de variable mais ça n'a pas résolu le problème...:( Une idée ?
 

atomic

XLDnaute Nouveau
Re : MACROS : tri conditionnel sans doublons en macros ?

ça y est, cette fois-ci le sujet est clos, j'ai trouvé ce qui clochait :
La macro de néné06 avait une erreure dans les dernières lignes, voici la version corrigée qui fonctionne à merveille :)

Code:
Sub Dernier_Tri()
Application.CutCopyMode = False

'*********mise en place les variables
    Dim ligne_active As Integer
    Dim X As Range
    Dim derniere_ligne_occupée As Integer
    Dim nb_ref_ident As Integer
    Dim total_colC As Long

'*********tri par composants et par dates Ascendantes
Sheets("Extraction_triee2").Select
    Cells.Select
        Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
        Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
        ligne_active = 2  '<--pointeur de la ligne active

'****recherche premiere cellule vide (nommee "X") en col A, puis deduction de la cellule précédente non vide(derniere_ligne_occupee).
    Set X = Range("A:A").Find("", , xlValues, xlWhole, , , False)
    derniere_ligne_occupée = (X.Row) - 1
    
'****parcoure les cellules col A jusqu'a dernière cellule remplie
    Do Until ligne_active > derniere_ligne_occupée
        If Cells(ligne_active, 1) = Cells(ligne_active + 1, 1) Then '***si cellule du dessous= cellule du ligne_active
               'recherche nombre de composant identiques aprés la cellule
                nb_ref_ident = 0
                total_colC = 0
                     ' calcul la somme des ref colC
                        Do Until Cells(ligne_active + nb_ref_ident, 1) <> Cells(ligne_active, 1)
                            total_colC = total_colC + Cells(ligne_active + nb_ref_ident, 3)
                        nb_ref_ident = nb_ref_ident + 1
                        Loop
               'si somme colC est > premiere ref col F
                If total_colC > Cells(ligne_active, 6) Then
                  
               'conserver les doublons (ou en réduire le nombre)
                ligne_active = nb_ref_ident + ligne_active - 1
                Else
               'supprimer tous les doublons
                Range(Cells(ligne_active + 1, 1), Cells(ligne_active + nb_ref_ident - 1, 10)).ClearContents
                ligne_active = nb_ref_ident + ligne_active - 1
                End If
        End If
    ligne_active = ligne_active + 1
    Loop

'*********tri par composants et par dates descendantes **********
Cells.Select
        Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
        Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

Application.CutCopyMode = False
Range("D8").Select

End Sub
 

Discussions similaires

Réponses
11
Affichages
354
Réponses
12
Affichages
288

Membres actuellement en ligne

Statistiques des forums

Discussions
312 505
Messages
2 089 071
Membres
104 020
dernier inscrit
Mzghal