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 :

Trier, suprimer les doublons en additionant les valeurs des cellules voisines


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut Trier, suprimer les doublons en additionant les valeurs des cellules voisines
    Bnojour à tous,

    Voici mon problème,

    Dans une feuille je récupere une liste ( je simplifie pour que ce soit plus compréhensible sinon il y a plus de colonne) col A " nom " col B " produits" col C "quantité"

    Je voudrai que ma macro boucle sur cette liste qu il compare les colonne A et B sont identique qu il additonne les C et supprime la ligne testé.

    pour l instant voici un peut ou j en suis !
    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
    lageFactureOuverte = "a2:a" & WSFactureOuverte.Range("a65536").End(xlUp).Row
     
                    For Each CelTestDansFactureOuvert In Range(PlageFactureOuverte)
                    For Each CelCibleFactureOuvert In Range(PlageFactureOuverte)
     
     
                    If CelTestDansFactureOuvert = CelCibleFactureOuvert.Offset(1, 0) And CelTestDansFactureOuvert.Offset(0, 2) _
                    = CelCibleFactureOuvert.Offset(1, 2) Then
     
     
     
     
     
                            CelTestDansFactureOuvert.Offset(0, 3) = CelTestDansFactureOuvert.Offset(0, 3) _
                            + CelCibleFactureOuvert.Offset(1, 3)
                            CelTestDansFactureOuvert.Offset(0, 4) = CelTestDansFactureOuvert.Offset(0, 4) _
                            + CelCibleFactureOuvert.Offset(1, 4)
                            CelTestDansFactureOuvert.Offset(0, 6) = CelTestDansFactureOuvert.Offset(0, 6) _
                            + CelCibleFactureOuvert.Offset(1, 6)
                            CelTestDansFactureOuvert.Offset(0, 7) = CelTestDansFactureOuvert.Offset(0, 7) _
                            + CelCibleFactureOuvert.Offset(1, 7)
     
     
     
                        WSFactureOuverte.Range("a" & CelCibleFactureOuvert.Offset(1, 0).Row & ":" & "z" & CelCibleFactureOuvert.Offset(1, 0).Row).ClearContents
     
                    End If
                    Next CelCibleFactureOuvert
     
            Next CelTestDansFactureOuvert

    Voila si quelqu un saurrai me re-mettre sur la bonne voie, car a force d essayé je commence a faire n importe quoi.

    d avance merci

  2. #2
    Membre régulier
    Homme Profil pro
    Médecin.
    Inscrit en
    Septembre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Médecin.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 96
    Points : 94
    Points
    94
    Par défaut
    Bonjour,
    Peux tu rajouter tes définitions de variables pour que l'on puisse tester.
    cordialement.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Bonjour faraudch,

    Voici les deux varaible plage en plus

    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
    Sub ListingFactureImpaye()
     
     
     
    Dim PlageVente As String
    Dim CelTestDansFactureOuvert As Range
    Dim PlageFactureOuverte As String
    Dim CelCibleFactureOuvert As Range
     
     
     
     
     
                    PlageVente = "a2:a" & WSvente.Range("a65536").End(xlUp).Row
     
     
                    PlageFactureOuverte = "a2:a" & WSFactureOuverte.Range("a65536").End(xlUp).Row
     
                    For Each CelTestDansFactureOuvert In Range(PlageFactureOuverte)
                    For Each CelCibleFactureOuvert In Range(PlageFactureOuverte)
     
     
     
     
                    If CelTestDansFactureOuvert = CelCibleFactureOuvert.Offset(1, 0) And CelTestDansFactureOuvert.Offset(0, 2) _
                    = CelCibleFactureOuvert.Offset(1, 2) Then
     
     
     
     
     
                            CelTestDansFactureOuvert.Offset(0, 3) = CelTestDansFactureOuvert.Offset(0, 3) _
                            + CelCibleFactureOuvert.Offset(1, 3)
                            CelTestDansFactureOuvert.Offset(0, 4) = CelTestDansFactureOuvert.Offset(0, 4) _
                            + CelCibleFactureOuvert.Offset(1, 4)
                            CelTestDansFactureOuvert.Offset(0, 6) = CelTestDansFactureOuvert.Offset(0, 6) _
                            + CelCibleFactureOuvert.Offset(1, 6)
                            CelTestDansFactureOuvert.Offset(0, 7) = CelTestDansFactureOuvert.Offset(0, 7) _
                            + CelCibleFactureOuvert.Offset(1, 7)
     
                    End If
     
                Next CelCibleFactureOuvert
            Next CelTestDansFactureOuvert

    j espere que tu y verra plus clair

  4. #4
    Membre régulier
    Homme Profil pro
    Médecin.
    Inscrit en
    Septembre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Médecin.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 96
    Points : 94
    Points
    94
    Par défaut
    WSvente, WSFactureOuverte, non definis.
    Il y en a peut être d'autres.
    ch = christian.
    A+.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    en fait WSvente et WSFactureOuverte sont les nom de mes deux feuilles en vba
    , tu peut les remplacer par feuill1 et feuill2.
    je ne pense pas que je peux les declarer.
    A+

  6. #6
    Membre régulier
    Homme Profil pro
    Médecin.
    Inscrit en
    Septembre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Médecin.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 96
    Points : 94
    Points
    94
    Par défaut
    C'est l'heure de manger.
    Par contre si ta macro était commantée, je comprendrais mieux.
    Bon app.

    Essaye ça, ça devrairt marcher.

    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
    Dim CelTestColA As Range
    Dim PlageFactureOuverteColA As String
    Dim TotalIntermediaire As Integer
    Dim DebutLigneSuppression As Integer
    Dim LastCell As Integer
     
    Sub test()
     
     'on trie sur le nom de la 1) et de la 2° colonne
     Range("a1").Select
          Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _
            , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
            False, Orientation:=xlTopToBottom
     
        'on fait les totaux en cas d'égalité de cola et colb
     
                    PlageFactureOuverteColA = "a2:a" & Range("a65536").End(xlUp).Row
                    LastCell = Range("a65536").End(xlUp).Row
     
                    For Each CelTestColA In Range(PlageFactureOuverteColA)
                        If CelTestColA = CelTestColA.Offset(1, 0) Then
                            If CelTestColA.Offset(0, 1) = CelTestColA.Offset(1, 1) Then
                        TotalIntermediaire = CelTestColA.Offset(0, 2).Value + CelTestColA.Offset(1, 2).Value
                        CelTestColA.Offset(1, 2).Value = TotalIntermediaire
                        CelTestColA.Offset(0, 2).Value = 0
                        End If
                        End If
     
                Next
     
                'on efface les lignes inutiles
            Selection.Sort Key1:=Range("C2"), Order1:=xlDescending, Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
     
        Columns("C:C").Select
     
        Selection.Find(What:="0", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False).Activate
            DebutLigneSuppression = ActiveCell.Row
     
        Range("A" & DebutLigneSuppression & ":C" & LastCell).Select
        Selection.Delete Shift:=xlUp
     
                'on retrie sur la première colonne
     
                    Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _
            , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
            False, Orientation:=xlTopToBottom
      End Sub

  7. #7
    Expert éminent sénior 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
    Points : 31 877
    Points
    31 877
    Par défaut
    Ci-joint une proposition
    on ajoute à la fin une colonne où on concatène l'ensemble des colonnes à comparer (ici colonne A: nom et colonne B: produit)
    on tri
    on fais le cumul
    on supprime les lignes en doubles
    on efface la colonne ajoutée!
    le code ci-joint est testé sur un exemple! à adapter à ton cas
    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
    Sub Cumul()
    Dim LastLig As Long, i As Long
    With Sheets("WSv")
        LastLig = .Cells(Rows.Count, 1).End(xlUp).Row
        For i = 2 To LastLig
            .Range("D" & i).Value = .Range("A" & i).Value & .Range("B" & i).Value
        Next i
        .Range("A2:D" & LastLig).Sort key1:=.Range("D2"), order1:=xlAscending, header:=xlNo
     
        For i = LastLig To 3 Step -1
            If .Range("D" & i - 1).Value = .Range("D" & i).Value Then
                .Range("C" & i - 1).Value = .Range("C" & i).Value + .Range("C" & i - 1).Value
                .Rows(i).Delete
            End If
        Next i
    .Columns("D:D").Clear
    End With
    End Sub

  8. #8
    Membre régulier
    Homme Profil pro
    Médecin.
    Inscrit en
    Septembre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Médecin.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 96
    Points : 94
    Points
    94
    Par défaut
    La même macro avec correction d'un petit bug.
    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
    51
    52
    53
    Dim CelTestColA As Range
    Dim PlageFactureOuverteColA As String
    Dim TotalIntermediaire As Integer
    Dim DebutLigneSuppression As Integer
    Dim LastCell As Integer
     
    Sub test()
     
     'on trie sur le nom de la 1) et de la 2° colonne
     Range("a1").Select
          Selection.Sort key1:=Range("A2"), order1:=xlAscending, Key2:=Range("B2") _
            , Order2:=xlAscending, header:=xlGuess, OrderCustom:=1, MatchCase:= _
            False, Orientation:=xlTopToBottom
     
        'on fait les totaux en cas d'égalité de cola et colb
     
                    PlageFactureOuverteColA = "a2:a" & Range("a65536").End(xlUp).Row
                    LastCell = Range("a65536").End(xlUp).Row
     
                    For Each CelTestColA In Range(PlageFactureOuverteColA)
                        If CelTestColA = CelTestColA.Offset(1, 0) Then
                            If CelTestColA.Offset(0, 1) = CelTestColA.Offset(1, 1) Then
                        TotalIntermediaire = CelTestColA.Offset(0, 2).Value + CelTestColA.Offset(1, 2).Value
                        CelTestColA.Offset(1, 2).Value = TotalIntermediaire
                        CelTestColA.Offset(0, 2).Value = 0
                        End If
                        End If
     
                Next
     
                'on efface les lignes inutiles
            Selection.Sort key1:=Range("C2"), order1:=xlDescending, header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
     
           'on cherche la première cellule = à 0
        For i = 2 To LastCell
            If Range("c" & i).Value = 0 Then
                    Range("c" & i).Select
                    DebutLigneSuppression = ActiveCell.Row
                    Exit For
                    End If
     
        Next
     
        Range("A" & DebutLigneSuppression & ":C" & LastCell).Select
        Selection.Delete Shift:=xlUp
     
                'on retrie sur la première colonne
     
                    Selection.Sort key1:=Range("A2"), order1:=xlAscending, Key2:=Range("B2") _
            , Order2:=xlAscending, header:=xlGuess, OrderCustom:=1, MatchCase:= _
            False, Orientation:=xlTopToBottom
    End Sub

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    jai eu une application qui ressemblait a ce que tu veux faire, et une solution simple qui enleve les doublons et additions tout tes résultats est un tableau dynamique

    pour ton tableau dans la colonne, mais tes données de la colA et les données de la ColB, et dans la case value met les valeurs de ta ColC.

    si tu utilise un bouton ou autre pour le traitement de tes données jai commencé ma macro en mettant à jour le tableau dynamique comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set pvtTable = ActiveSheet.Range("Case de ton tableau").PivotTable
    pvtTable.RefreshTable
    ensuite traite ton tableau comme bon te semble, et tes données se mettent à jour et sont classés sans doublons.

    Bonne journée !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Bonsoir à vous deux,

    désolé de n avoir pas été plus réactif mes j était absent de chez moi.
    je viens de rentrer et je me suis empresser a mettre en œuvre les solution proposé.

    Mercatog, j ai essayé le tienne en premier car elle me paraissait plus facile a mettre en ordre par rapport au vrai cellule que je trie.

    et la comme par magie tout c est mis la ou je le voulais, mon problème c est que je n avais bien compris que pour faire un tri comme cela il fallait commencer par la dernière ligne additionner et supprimer au fur et a mesure. enfin après deux jour que je m arrache les cheveux ca marche. mille merci pour ton aide.

    Faraudch

    comme tu peut le lire ci dessus j ai commencer par le code de mercatog car c était plus simple pour moi de l adapter rapidement,
    ceci dit demain je ferrai quelque essai avec le tiens.
    pour pouvoir comprendre une autre approche pour réalisé ce tri.

    merci a toi aussi de t être penchée sur mon problème.

    à bientôt et bonne soirée

    Alex

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Macro pour extraire les doublons en fusionnant les valeurs
    Par ptiloups dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/02/2013, 15h56
  2. [XL-2003] Fonction Si avec les valeurs des cellules
    Par magyaddello dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/08/2010, 13h48
  3. [XSLT 2.0] Supprimer les doublons et regroupement de valeurs
    Par Remi_Simon dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 29/04/2009, 17h08
  4. Réponses: 2
    Dernier message: 10/02/2009, 16h03
  5. Lire un fichier Excel pour modifier les valeurs des cellules
    Par Paloma dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/10/2006, 15h13

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