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 :

Compter/Supprimer les lignes ayant les mêmes attributs [XL-2010]


Sujet :

Macros et VBA Excel

  1. #21
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    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
        Application.ScreenUpdating = False
        With Feuil2
            .Range("F2:F" & derniere_ligne).Formula = "=SOMMEPROD(($A$2:$A$" & derniere_ligne & "=A2)*($B$2:$B$" & derniere_ligne & "=B2)*($C$2:$C$" & derniere_ligne & "=C2)*($D$2:$D$" & derniere_ligne & "=D2)*($E$2:$E$" & derniere_ligne & "=E2))" _
                : .Range("F2:F" & derniere_ligne).Value = .Range("F2:F" & derniere_ligne).Value
            .Range("I2:I" & derniere_ligne).Formula = "=SI(NB.SI.ENS($A$2:$A2;A2;$B$2:$B2;B2;$C$2:$C2;C2;$D$2:$D2;D2;$E$2:$E2;E2;)>1;1;0)": .Range("I2:I" & derniere_ligne).Value = .Range("I2:I" & derniere_ligne).Value
            With .Cells(1).CurrentRegion
                .Sort Cells(9), Order1:=xlAscending, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, Header:=xlYes
                V = Application.Match(1, .Columns(9), 0) 'repérage du 1er doublons après tri
                If Not IsError(V) Then
                    Rows("A1", "I" & ":" & .Rows.Count).EntireRow.Delete
                End If
                .Columns(9).Clear
            End With
        End With
        Application.ScreenUpdating = True
    Salut, je suis arrivé à me poser plusieurs questions :

    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "=SI(NB.SI.ENS($A$2:$A2;A2;$B$2:$B2;B2;$C$2:$C2;C2;$D$2:$D2;D2;$E$2:$E2;E2)>1;1;0)"
    Je n'arrive pas à compiler cette formule "Erreur définie par l'application ou par l'objet", mais je n'arrive surtout pas à comprendre son but.
    Le but Est-ce de donner la valeur 1 si la "clé" définie par A B C D E a déjà été repéré, puis ensuite supprimer la ligne si un 1 est présent dans la colonne ? avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    V = Application.Match(1, .Columns(9), 0) 'repérage du 1er doublons après tri
                If Not IsError(V) Then
                    Rows("A1", "I" & ":" & .Rows.Count).EntireRow.Delete
                End If



    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "=SOMMEPROD(($A$2:$A$" & derniere_ligne & "=A2)*($B$2:$B$" & derniere_ligne & "=B2)*($C$2:$C$" & derniere_ligne & "=C2)*($D$2:$D$" & derniere_ligne & "=D2)*($E$2:$E$" & derniere_ligne & "=E2))" _
                : .Range("F2:F" & derniere_ligne).Value = .Range("F2:F" & derniere_ligne).Value
    Pour cette formule, elle se compile mais ne s'applique pas dans la feuille EXCEL, pourtant la formule fonctionne correctement si je la copie dans la feuille.

  2. #22
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re,
    J'ai utilisé Formula afin de pouvoir utiliser la formule en anglais et quel soit adapté à Excel quelque soit le pays
    - sélectionne la 1ère cellule où doit se trouver ta formule
    - Fait apparaître ta fenêtre d'exécution vba et écrit dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Selection.Formula
    Puis valide avec la touche retour, voilà la formule en anglais avec laquelle tu dois travailler dans le code vba
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  3. #23
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    De mon côté selon la présentation initiale et comme annoncé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Demo1()
        With [A1].CurrentRegion.Rows
                 .Sort .Cells(4), xlDescending, Header:=xlYes
            With .Item("2:" & .Count).Columns
                 .Item(3).Formula = "=SUMPRODUCT((" & .Item(1).Address & "=A2)*(" & .Item(2).Address & "=B2))"
                 .Item(3).Formula = .Item(3).Value
            End With
                 .RemoveDuplicates [{1,2}], xlYes
        End With
    End Sub
    ___________________________________________________________________________________________________________

          Merci de cliquer sur en bas à droite de chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #24
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re,

    Le code de Marc est celui qui est le plus optimisé, mais si tu utilises le code aussi sur Mac, tu peux rencontrer des soucis et dans ce cas là vaut mieux utiliser celui que j'ai fait qui fonctionnera sans problème sur PC et Mac
    J'y ai fait de légères modifications.
    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
    Sub CompteurDoublons()
    Application.ScreenUpdating = False
        With Feuil1
            .Cells(1).CurrentRegion.Sort .Cells(4), xlDescending, Header:=xlYes ' pour le tri des dates
            DL = .Cells(.Rows.Count, 1).End(xlUp).Row ' Dernière ligne
            'on met les formules pour ne garder que les valeur ensuite
            .Range("C2:C" & DL).Formula = "=SUMPRODUCT(($A$2:$A$" & DL & "=A2)*($B$2:$B$" & DL & " =B2))": .Range("C2:C" & DL).Formula = .Range("C2:C" & DL).Value ' concerne le nombre de doublons
            .Range("E2:E" & DL).Formula = "=IF(COUNTIFS($A$2:$A2,A2,$B$2:$B2,B2)>1,1,0)": .Range("E2:E" & DL).Formula = .Range("E2:E" & DL).Value ' repérage des doublons afin de les supprimer
            With .Cells(1).CurrentRegion
                .Sort Cells(5), xlAscending, Header:=xlYes 'tri sur la colonne E
                V = Application.Match(1, .Columns(5), 0) 'repérage du 1er doublons après tri
                If Not IsError(V) Then
                    Rows(V & ":" & .Rows.Count).EntireRow.Delete 'effacement des doublons
                End If
                .Columns(5).Clear 'on efface la colonne E
            End With
        End With
    Application.ScreenUpdating = True
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  5. #25
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Pour une version MAC / PC (toutes versions car COUNTIFS n'étant pas supporté avant la version 2007)
    c'est possible avec une seule formule en jouant bien du tri avant et après, en une quinzaine de lignes de code …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #26
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Re,

    Premièrement merci pour la fenêtre d'exécution je ne connaissais pas du tout et c'est vraiment pratique !

    Ensuite la formule avec le COUNTIFS ne fonctionne pas, ni dans le Excel ni dans le Vba, pourtant je suis travail bien avec Excel 2010 qui est supérieur à 2007 comme a préciser Marc-L.
    Dans le Excel il m'affiche #NOM?, même après avoir filtré manuellement.

    Pour ce qu'il en est du tri il ne fonctionne pas non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(1).CurrentRegion.Sort .Cells(8), xlDescending, Header:=xlYes
    j'ai essayer avec des classes Range ou en remplaçant .Cells(8) par .Cells(, 8) ou encore avec des Key ou DataOption, mais aucune de ces solutions n'ont fonctionné.

  7. #27
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Mon code fonctionnant bien de mon côté avec la première cellule "item1" en A1,
    le tester dans les mêmes conditions dans un nouveau classeur en y recopiant les données de la présentation initiale !
    Idem pour le code de Ryu …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #28
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Il marcherai correctement sous PC ?
    Je vais l'essayer aussi je vous retiens au courant.

  9. #29
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    J'ai édité mon précédent message, à relire …

    Oui mon code fonctionne uniquement sur Windows à partir de la version 2007 !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #30
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Exact j'avais mal lu le post, alors c'est parti !

  11. #31
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    Aucun souci de mon côté comme Marc (coucou ) sachant que l'on est parti de l'exemple du post #1
    sur un nouveau fichier à partir de A1
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  12. #32
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Alors j'ai copier exactement le même tableau que dans le post#1 mais ton code RYU ne fonctionne toujours pas, toujours la même erreur:
    sur le premier trie :
    la méthode sort de la class range a échoué
    sur le deuxieme :
    la méthode sort de la class range a échoué
    En reprenant exactement ton code.

    Je viens d'essayer celui de Marc tout fonctionne le compteur c'est bien incrémenté mais le RemoveDuplicates m'indique une erreur
    l'indice n'appartient pas à la selection.
    Question à part mais, d'où peuvent venir ces erreurs alors que nous travaillons sur la même base ?

  13. #33
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re,
    J'utilise le codename de la feuille qui lors de mon test s'appelle "Feuil1"

    Après le "With" remplace Feuil1 par Sheets("NomDeLaFeuille")
    Bien sûr NomDeLaFeuille est à remplacer
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  14. #34
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    J'ai remplacé ton Feuil1 par Worksheets("Feuil1") et ca marche nickel, merci à toi pour cette solution

  15. #35
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    C'est bon c'est exactement ce que je recherchais merci à vous deux je n'aurai pas trouvé autrement !

  16. #36
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Voici une démonstration for MAC valable aussi pour toute version Windows même avant 2007
    n'utilisant pas de colonne supplémentaire juste avec une unique formule de calculs :

    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 Demo4MAC()
            Const F = "=IF(A2&""¤""&B2=A1&""¤""&B1,0,SUMPRODUCT((#1=A2)*(#2=B2)))"
                  Application.ScreenUpdating = False
        With [A1].CurrentRegion.Rows
                 .Sort .Cells(1), xlAscending, .Cells(2), , xlAscending, .Cells(4), xlDescending, xlYes
            With .Item("2:" & .Count).Columns
                 .Item(3).Formula = Replace(Replace(F, "#1", .Item(1).Address), "#2", .Item(2).Address)
                 .Item(3).Formula = .Item(3).Value
            End With
                 .Sort .Cells(3), xlDescending
                  V = Application.Match(0, .Columns(3), 0)
                  If IsNumeric(V) Then .Item(V & ":" & .Count).Clear
                 .Sort .Cells(1), xlAscending, .Cells(2), Header:=xlYes
        End With
                  Application.ScreenUpdating = True
    End Sub
    Le tri de la ligne de code n°13 étant accessoire …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #37
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Marc
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/02/2015, 09h17
  2. Réponses: 1
    Dernier message: 03/12/2011, 00h46
  3. Réponses: 4
    Dernier message: 05/09/2008, 11h03
  4. numéroter les lignes ayant la même valeur dans une requête
    Par raiamanu dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 12/10/2007, 10h49

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