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 doublon dans une colonne après consolidation fichiers


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Par défaut Suppression doublon dans une colonne après consolidation fichiers
    Bonjour le Forum,

    Je coince depuis quelques jours sur une macro d'importation que j'ai créé en glanant des codes ici et là.

    Problème :
    1/ Je souhaiterais extraire uniquement les lignes avec des valeurs numériques dans la colonne D pour une plage définie comme suit : A12:Vx (avec X = dernière ligne non vide de la colonne A) et les coller en valeur dans l'onglet "data".

    2/ Je souhaiterais extraire uniquement les lignes avec des formules dans la colonne D pour une plage définie comme suit : A12:Vx (avec X = dernière ligne non vide de la colonne A) et les coller en valeur dans l'onglet "dataTotal".

    3/ Concernat la gestion des doublons, j'ai créé une macro qui concatène les colonnes A et C dans la colonne X. Cela me sert de clé. J'utilise ensuite le Dictionary pour identifier les doublons. Problème: il reste encore des doublons !!! Voici le code de la macro :

    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
    Sub Doublons()
     
    Columns(24).Select
        Selection.FormulaR1C1 = "=RC[-23]&"" ""&RC[-21]"
     
    Columns(24).Copy
    Columns(24).Select
    Selection.PasteSpecial Paste:=xlPasteValues
     
    Application.CutCopyMode = False
    Application.DisplayAlerts = False
     
    Dim Unique As Object, Cel As Range
     
    Set Unique = CreateObject("Scripting.Dictionary")
     
        For Each Cel In Range("x2", Range("x2").End(xlDown))
     
       If Not Unique.Exists(Cel.Value) Then Unique.Add Cel.Value, Cel.Value
     
          Cel.EntireRow.Delete Shift:=xlUp
     
        'Range("x2:x" & Unique.Count) = Application.Transpose(Unique.items)
     
     Next Cel
     
    End Sub
    Je joins un fichier pays mais le fichier de compilation est trop lourd malgré le zip.

    S'il vous le faut merci de m'envoyer un message privé.
    Je vous remercie d'avance pour toute aide que vous pourriez m'apportée.

    Cordialement,

    Gigelle
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Question basique lors de la suppression de lignes, commencer par la fin et remonter.

    Sinon pour Xl 2007 et suivant il y a RemoveDuplicates

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Par défaut
    Bonjour mercatog,

    Je viens de découvrir le RemoveDuplicates.
    Mais comment demander à Excel de faire un RemoveDuplicates en commençant par la fin ? Auriez-vous un code à me communiquer ?

    Merci beaucoup,

    Cordialement

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Le remove duplicates n'a pas besoin de commencer par la fin.

    Edit: No souci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Doublons()
    Columns(26).removeduplicates
    End sub

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    mercatog te disait ça au cas où tu passes par une boucle, avec le "RemoveDuplicates", tu sélectionnes ta plage et c'est tout

    Edit : pas vu ta réponse EngueEngue
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    J'avais donné 2 variantes: Si en boucle, commencer par la dernière ligne et remonter.
    Une autre approche pour Xl 2007 et suivants, utiliser RemoveDuplicates:

    Exemple, pour supprimer les lignes en double en prenant la colonne 1 et 3 comme critère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub SupprDoub()
    Dim LastLig As Long
     
    With Feuil1
        LastLig = .Cells(.Rows.Count, 3).End(xlUp).Row
        If LastLig > 12 Then .Range("A11:V" & LastLig).RemoveDuplicates Columns:=Array(1, 3), Header:=xlYes
    End With
    End Sub

  7. #7
    Membre habitué
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Par défaut
    J'ai essayé ce code

    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
    Sub doublons()
     ' concatene les données de la col A et C
     
     
        Columns("w:w").Select
        Selection.FormulaR1C1 = "=RC[-22]&"" ""&RC[-20]"
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues
     
    Application.CutCopyMode = False
    Application.DisplayAlerts = False
     
     
      Dim DernLigne As Long, n1 As Long
     
      DernLigne = Worksheets("data").Range("x" & Rows.Count).End(xlUp).Row
     
      For n1 = 1 To DernLigne
        With Worksheets("data").Cells(n1, 1)
          ' supprime les doublons
    ThisWorkbook.Sheets("data").Range("a1").CurrentRegion.RemoveDuplicates Columns:=23, Header:=xlGuess
     
       End With
      Next n1
     
      End Sub
    Cependant, il ne prend pas en compte l'indication de bas en haut que j'ai traduit par With Worksheets("data").Cells(n1, 1).

    Quelqu'un aurait-il la gentillesse de m'aider ?

    D'avance, je vous en remercie.

  8. #8
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    et ça, ça ne suffirait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Worksheets("data")
      DernLigne = .Range("x" & .Rows.Count).End(xlUp).Row
      .Range("a1").CurrentRegion.RemoveDuplicates Columns:=23, Header:=xlGuess
    End With
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  9. #9
    Membre habitué
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Par défaut
    Re. En fait, j'importe des fichiers qui peuvent être amenés à changer. Ce que je voudrais c'est garder les doublons qui correspondent au dernier fichier importé.
    Exemple :
    A1 Anne B1 15
    A2 Vincent B2 13
    A3 Claire B3 10
    A4 Nicolas B4 9
    A5 Vincent B5 14

    En colonne A, les prénoms et en B les notes. Si je réinporte le fichier de l'élève Vincent, sa note a été corrigée à 14 au lieu de 13. Je veux garder le doublon correspondant à la ligne 5 et non à la ligne 2.

    Or avec le remove duplicate, Excel supprime les doublons de haut en bas. Et dans ma macro d'importation, les nouveaux fichiers sont collés les un après les autres. Donc pour prendre en compte les mises à jours des fichiers importés, il faudrait que Excel supprime les doublons de bas en haut.

    J'espère que c'est plus clair ?

    Merci d'avance.

  10. #10
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut suppression doublon
    Bonjour,

    Ci joint le fichier.

    en feuil1, un code élémentaire pour essai qui suppose les numéros de ligne connus. ce qui n'est bien évidemment pas le cas

    en feuil2, votre code que j'ai adapté. J'ai mis des points d'arrêts et des messages volontairement pour que vous suiviez la progression.

    J'ai pris la colonne C comme référence (toutes les lignes du tableau remplies).

    Je pense que Mercatog reviendra sur ce sujet pour améliorer ce code d'amateur autant que nécessaire.

    Cordialement,
    Fichiers attachés Fichiers attachés

  11. #11
    Membre habitué
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Par défaut
    Bonjour Nibledispo, Bonjour le Forum,

    Je pense que je ne vous ai pas envoyé le bon fichier, car celui que vous m'avez envoyé correspond à un fichier pays. Mon objectif est d'importer plusieurs fichiers pays à la fois dans un fichier compil.

    Cela dit, je pense avoir trouvé une macro qui fonctionne et qui procède comme suit :
    a) Ouverture des fichiers pays
    b) Sélection de la plage à copier
    c) Collage de la plage dans le fichier Compil
    d) Indexation des numéros de lignes jusqu’à la dernière ligne non vide
    e) Tri décroissant sur la colonne Index
    f) Suppression des doublons en prenant en compte le résultat de la concaténation des colonnes A et C
    g) Tri croissant de la colonne Index

    Concernant le point b), j’aimerais maintenant poser la double condition suivante :
    1) Si la cellule A est différente de 0, alors sélectionner le CurrentRegion (ctrl *) et décaler de 9 lignes vers le haut (afin de ne pas prendre les lignes de Total, Checks et Total YTD)

    2) Si la colonne D (Janvier) contient des valeurs (nombres), pour la sélection correspondant au 1) sélectionner toutes les lignes.
    Par exemple pour le fichier Algérie, cela reviendrait à sélectionner les plages contiguës suivantes : A12 à V17 ; A19 à V24 ; A26 à V31 ; A33 à V38 ; A40 à V45 ; A47 à V52, etc ; et si les valeurs 0 étaient inscrites dans les cellules A75 à A81, la plage A75 à V80 n’aurait pas été sélectionnée.
    Comment puis -je procéder sachant que je voudrais également copier /coller les lignes de sous-total c’est-à-dire les lignes 18, 25, 32, etc dans un autre onglet du fichier Compil ??

    Je joins mon fichier Compil avec le code de la macro et deux fichiers pays pour exemple.

    La macro 3 correspond à la macro d'importation et la macro 12 correspond à la macro de suppression des doublons.


    Je vous remercie d’avance de votre aide.
    Fichiers attachés Fichiers attachés

  12. #12
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut suppression doublon
    Bonjour,

    Tout cela ne me dit pas si le code suppression doublon répond à ton attente.

    Par ailleurs, les tris devront, selon moi, être fait sans les sous-totaux, lesquels, je suppose, seront le résultat de la fonction "sub-total".
    Ceci implique qu'ils seront supprimés avant l'opération doublons et remis ensuite. Ce qui n'est pas compliqué.

    Enfin, je n'ai pas compris la sauvegarde avant la remise en ordre des enregistrements. je l'ai donc supprimé pour mes essais mais je pense que tu l'as remarqué.

    Cordialement

  13. #13
    Membre habitué
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Par défaut
    Re:

    Concernant les sous totaux vous avez raison. Je suis en ce moment même entrain de trouver un code avec Resize qui me permettrait de redimensionner ma plage sans les totaux et un autre code me permettant de ne sélectionner uniquement les lignes avec des valeurs numériques car les sous totaux contiennent des formules somme.

    Concernant le code suppression doublon de la feuille 2, cela ne répond pas à mon besoin car la colonne C est trié en ordre décroissant, or quand j'importe d'autre fichiers, cette colonne est trié dans l'ordre croissant. Par contre, j'aime bien l'idée de la progression et le message box. Ce serait bien de rajouter cela dans le code de la feuille 1.

    Concernant le code suppression doublon de la feuille 1, cela répond à mon besoin. Idéalement, j'y rajouterais l'idée de la progression et surtout l'indexation des ligne automatique par la fonction suivante:

    While numero <= LastLig 'TANT QUE la variable numero est <= à la dernière ligne, la boucle est répétée
    Cells(numero, 23) = numero 'Numérotation
    numero = numero + 1 'Le numéro est augmenté de 1 à chaque boucle
    Wend

    Enfin, concernant la sauvegarde, elle est inutile en effet.

    En revanche, comme je vous le disais dans mon dernier message, votre code (feuill 1) aurait dû figurer dans mon fichier de compil et non dans le fichier pays. Je vais donc copier votre macro dans le fichier Compil pour voir si cela fonctionne.

    Merci beaucoup de votre aide !

  14. #14
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut suppression doublon
    Bonsoir,

    Je me demande si vous ne vous compliquez pas l'existence inutilement.

    Je suppose que les sous-totaux sont fait avec la fonction "subtotal".
    par conséquent pourquoi :

    - ne pas les enlever temporairement pour récupérer les valeurs numériques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range("B1:I19").RemoveSubtotal   'range à adapter bien sûr
    - les remettre ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Range("B1:I19").Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(7), _
            Replace:=True, PageBreaks:=False, SummaryBelowData:=True
    J'ai proposé ce matin un code de ce genre (plus ou moins satisfaisant) à demahom08 (voyez s'il peut partiellement répondre à votre problème).

    cordialement,

Discussions similaires

  1. Marquer les doublons dans une colonne
    Par webfranc dans le forum SQL
    Réponses: 2
    Dernier message: 30/04/2008, 20h10
  2. Liste de choix sans doublons dans une colonne
    Par LouFels dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2008, 22h58
  3. SELECT sur doublons dans une colonne
    Par vador972 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/01/2008, 14h21
  4. Selection si doublons dans une colonne
    Par PhilMarcellus dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/05/2007, 12h21
  5. [EXCEL] Mise en évidence des doublons dans une colonne
    Par dacid dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/10/2006, 19h14

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