IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Suppression de lignes sous conditions


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Suppression de lignes sous conditions
    Bonjour à tous,

    Je dois créer un macro pour le taf et je bloque un peu pour la finaliser.

    Mon probleme est le suivant, j'ai un tableau d'envrion 20000 lignes et je voudrais supprimer les lignes qui comporte des doublons mais sous condition.

    Je m'explique, dans la colonne K j'ai mes numeros de factures, et dans la colonne AX j'ai une option concernant ces factures.

    Je voudrais que suivant l'option (colonne AX) concernant la facture (colonne K) la ligne soit comparé avec celles d'au dessus (ou dessous) et si le programme trouve le meme numéro de facture alors il efface la ligne.

    J'ai commencé à écrire un code, qui marche mais qui n'efface pas toutes les lignes. Il y a toujours des facture en doublon et comportant la meme option...

    Voici mon code et une explication supplementaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Sub Ranking()
     
    Dim Plage2 As Range
    Dim Plage3 As Range
    Dim j As Integer
     
    'Application.ScreenUpdating = True
    'Application.DisplayAlerts = False
     
    Sheets("Database").Select
     
    Set Plage2 = Range("K10:K" & Range("K10").End(xlDown).Row)
    Set Plage3 = Range("AX10:AX" & Range("AX10").End(xlDown).Row)
     
    For j = Plage3.Cells.Count To 10 Step -1
     
            Plage2.Cells(j).Value = UCase(Plage2.Cells(j).Value)
            Plage2.Cells(j - 1).Value = UCase(Plage2.Cells(j - 1).Value)
     
        If Plage3.Cells(j).Value = "QTY" Then
            If Plage2.Cells(j).Value = Plage2.Cells(j - n).Value Then
                Plage2.Cells(j - 1).EntireRow.Delete
            End If
     
     
     
        ElseIf Plage3.Cells(j).Value = "PRICE" Then
            If Plage2.Cells(j).Value = Plage2.Cells(j - 1).Value Then
                Plage2.Cells(j - 1).EntireRow.Delete
     
            End If
     
        ElseIf Plage3.Cells(j).Value = "TAX" Then
            If Plage2.Cells(j).Value = Plage2.Cells(j - 1).Value Then
                Plage2.Cells(j -1).EntireRow.Delete
     
            End If
     
        ElseIf Plage3.Cells(j).Value = "OTHER" Then
            If Plage2.Cells(j).Value = Plage2.Cells(j - 1).Value Then
                Plage2.Cells(j - n).EntireRow.Delete
     
            End If
     
        End If
    Next
     
     
     
    End Sub

    Explication: les options de la colonne AX sont les suivantes: QTY, PRICE, TAX, OTHER.
    En clair si je conserve la facture si il y a écrit QTY dans la colonne AX puis j'efface tous les doublons,peu importe l'option.
    Ainsi de suite par ordre de priorité de la colonne AX qui est le suivant 1QTY 2PRICE, 3TAX, 4 OTHER.

    J'espère avoir été clair, sinon faite moi le savoir.

    Merci par avance pour votre aide et conseils.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Si tu faisais un filtre sans doublon sur le N° de facture, ça ne faciliterait pas la suite ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Si tu faisais un filtre sans doublon sur le N° de facture, ça ne faciliterait pas la suite ?
    Eh bien malheureusement non, et c'est bien la qu'est la difficulté.....

    Lorsque je filtre apres execution du code, il me reste moins de ligne que si je delete tous les doublons dans le tableau de depart.

    Je met en piece jointe un petit fichier excel qui expliqueras peut etre mieux le probleme.

    Merci

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ok, c'est assez tordu.
    Je regarderai demain mais je pense qu'on devrait pouvoir adapter le principe retenu ici.
    Sans approfondir, ce qui pourrait peut-être simplifier le problème serait de donner un poids aux quatre options QTY, TAX, PRICE, OTHER. Par exemple mettre leur ordre d'importance sur une colonne vide. Une simple formule recopiée vers jusqu'à la dernière ligne.
    Ça peut se réaliser en deux lignes de code. Par exemple, placé sur la colonne IV (Colonne 256) ça donnerait ça. La colonne AX étant la 50.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DerLig = Split(Worksheets("Feuil1").usedrange.address, "$")(4)
    Worksheets("Feuil1").Range("IV1:IV" & DerLig).FormulaLocal = "=SI(LC(-206)=""QTY"";1;SI(LC(-206)=""PRICE"";2;SI(LC(-206)=""TAX"";3;SI(LC(-206)=""OTHER"";4;""""))))"
    Si tes données sont triées, que chaque facture a toujours 4 options, on s'en sort avec un simple test sur l'offset(1,0), (2,0), (3,0)... etc de la colonne IV (256)
    Sinon, il faudra sans doute ajouter une boucle "Tant que N° de facture ne change pas..."
    Ça t'ouvre des horizons ?
    On voit ça demain mais si tu pouvais passer une feuille partielle de données "anonymée" ce serait mieux.
    Bonne nuit.
    A+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Sans approfondir, ce qui pourrait peut-être simplifier le problème serait de donner un poids aux quatre options QTY, TAX, PRICE, OTHER.
    J'ai remplacé le nom de l'option par son poids, puis son nom. ex QTY = 1-QTY je ne sais pas si cela pourra t'aider.

    Citation Envoyé par ouskel'n'or Voir le message
    Si tes données sont triées, que chaque facture a toujours 4 options.
    Malheureusement non, le nombre d'option varie de 1 a n, c'est pour cela que je veux les pondérer et effacer les factures qui ne m'interessent plus.

    Citation Envoyé par ouskel'n'or Voir le message
    Sinon, il faudra sans doute ajouter une boucle "Tant que N° de facture ne change pas...".
    Je pense que c'est cela qu'il manque pour faire un un delete sur toutes les lignes contenant le meme numero de facture une fois l'option selectionner

    Citation Envoyé par ouskel'n'or Voir le message
    On voit ça demain mais si tu pouvais passer une feuille partielle de
    J'ai ajouté une feuille pour que tu puisse regarder ca de plus près.

    Merci

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ok, alors c'est beaucoup plus simple. Il suffit que tu fasses un double tri, le premier sur la facture et le second sur le poids de l'option.
    Ensuite, une boucle sur la colonne N° de facture en partant de la dernière ligne et "Tant que la ligne placée au-dessus est identique à la ligne précédente, on sait que la ligne courant est un doublon à supprimer ou à masquer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub Macro2()
    Dim plage As Range, i As Long, derlig As Long
        Application.ScreenUpdating = False
        derlig = Split(Worksheets("Database").UsedRange.Address, "$")(4)
        Set plage = Worksheets("Database").Range("A11:" & Split(Worksheets("Database").UsedRange.Address, ":")(1))
        With plage
            .Sort Key1:=Range("K10"), Order1:=xlAscending, Key2:=Range( _
                "AX10"), Order2:=xlAscending, Header:=xlYes, Orientation:=xlTopToBottom, _
                DataOption1:=xlSortTextAsNumbers, DataOption2:=xlSortNormal
        End With
        For NoLig = derlig To 11 Step -1
             If Cells(NoLig, 11).Offset(-1, 0) = Cells(NoLig, 11) Then _
                  Rows(NoLig).Delete
        Next
        Application.ScreenUpdating = True
    End Sub
    Y'a juste un truc qui flanque le bouzou, c'est quand on trouve "Max Ship Amount" dans la colonne AX. Dans ce cas-là, que fait-on ?
    J'ai testé mais... je rentre du ciné... Bref je n'ai fait qu'une courte vérif. Par précaution, fais une copie de ta base (!) et vérifie bien qu'on n'ait rien oublié
    Je t'avertis, le traitement est très long.
    Sur ce, bonne nuit, tu me diras demain.
    A+

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Ok d'accord j'ai tester, et ca marche sauf pour trois ligne:

    la ligne 11 numero facture 842088-050908 Duplicated
    la ligne 7630 numero facture 0805008 Duplicated
    la ligne 7632 numero facture 0805009 Duplicated

    =SI(NB.SI(K$10:K$10502;K2331)>1;"Duplicated";"") formule pour obtenir le "duplicated" dans une colonne insérée a droite de k.

    pour le test j'utilise un tri sur la colonne K puis je delete tout les doublons. Il me reste alors 9886 ligne. Après essaie du code il me reste 9889 lignes.

    J'ai essayé en remplacant les 0 par # car peut entre en changenat le format les données ne sont pas trié de la meme facon ( le 0 o debut d'un nombre ca pose souvent des probleme avec excel) et cela fonctionne pour les 2 derniere lignes mais par pour la numéro 11.

    Je ne sais pas si tu as une solution pour ca (refaire un deuxieme test et voir s'il reste des doublons?)

    A part ca j'ai des questions a teposer sur ton code, il y a des choses que je ne comprend pas:

    Citation Envoyé par ouskel'n'or Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derlig = Split(Worksheets("Database").UsedRange.Address, "$")(4)
    le dollar et le 4 a quoi servent t'il?, le split je ne connais pas non plus?

    Citation Envoyé par ouskel'n'or Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plage = Worksheets("Database").Range("A11:" & Split(Worksheets("Database").UsedRange.Address, ":")(1))
    ici je pense que le 1 a la meme utilité que le 4 mais le ":" ?


    Citation Envoyé par ouskel'n'or Voir le message
    Y'a juste un truc qui flanque le bouzou, c'est quand on trouve "Max Ship Amount" dans la colonne AX. Dans ce cas-là, que fait-on ?
    normalement il ya plusieurs autres code que je remplace avec une autre macro, pour celui la normalement ce doit etre remplacé par "1-QTY".
    Désolé je n'avais peut etre pas vérifier toutes les lignes de la feuille envoyée.

    Merci pour ton aide.

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    A propos de Split, jète un oeil dans l'aide en ligne.
    Pour la ligne de code l'incluant, regarde ici, je viens d'en donner l'explication à l'intention de tous ceux qui posent la question
    Pour le test suivant je te suggère de placer le poids des options dans la colonne "IV". Tu adaptes le tri que j'ai mis dans mon code.
    Tu dis
    A+

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Pour le test suivant je te suggère de placer le poids des options dans la colonne "IV". Tu adaptes le tri que j'ai mis dans mon code.
    Tu dis
    A+
    Ok j'ai tester avec le poids dans un autre colonne en AY et pas 4, ca facilite la tache. le probleme est toujours le meme, j'ai toujours 3 doublon.

    J'ai essayé une autre idée mais je bloque aussi. Je doit créer une autre feuille car apres j'analyse ces donnés dans un tableau dynamique.
    Donc je fait un filtre sur la colonne de l'option et un copy/paste dans la nouvelle feuille par ordre de l'option. ex: en premier toutes les lignes contenant QTY, pui celles contenant PRICE...

    Je dois pouvoir maintenant eliminer tous les doublons de la colonne en partant du bas (sans faire de tri).
    Il faut que je compare le numero de la derniere ligne colonne K avec tout les numéros qui sont au dessus dans la colonne, et s'il y a un doublon alors effacer la derniere ligne (puisque celle si contient l'option moins importante pour moi).

    Le probleme est que il me reste toujours des doublons ! !.

    J'utilise ce code (que j'ai repris de l'explication precedente):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub doublon2()
     
    Dim derlig As Long
     
    Sheets("database2").Select
     
    derlig = Split(Worksheets("Database").UsedRange.Address, "$")(4)
     
    For NoLig = derlig To 11 Step -1
             If Cells(NoLig, 11).Offset(-1, 0) = Cells(NoLig, 11) Then _
                  Rows(NoLig).Delete
    Next
     
     
    End Sub
    Je ne sais pas comment dire de comparer toute la colonne au lieu de juste la cellule de dessus.

    bon bein jespere que tu pourra m'aider.

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Vérifie que tu n'aies pas un espace indésirable dans ces trois doublons.
    Sinon, je ne comprends pas comment une macro qui supprime tous les doublons en oublie trois. Sont-ils pour un même poids ? Pour des options identiques ?
    A+

Discussions similaires

  1. [XL-2007] Suppression de ligne sous condition
    Par discus23 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/06/2012, 11h55
  2. Suppression des lignes sous conditions
    Par e08b753z dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/06/2012, 18h28
  3. Suppression de lignes sous conditions
    Par dadou42 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/07/2010, 16h23
  4. Echec de suppression de ligne sous condition
    Par didyvine dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/07/2009, 23h56
  5. Suppression des lignes sous condition multiple
    Par baptbapt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/06/2007, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo