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 :

macro de somme si on remplit les critères


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Par défaut macro de somme si on remplit les critères
    Bonjour,

    Je débute tout juste dans les macro excel (en fait régulièrement je copie les maco que je trouve et je les adapte et ne comprends pas trop ce que je fais).

    Là je ne trouve pas d'exemple, aussi je post pour la première fois

    Voilà, je cherche à automatiser les formules très simples qui calculent les sommes. Comme j'ai beaucoup de lignes et que le nombre de lignes intervenant dans le calcul de la somme varie, c'est très fastidieux à la main.

    Ce que je cherche à faire (voir le fichier en copie), c'est :
    - dans la colonne E, si nombre de caractères dans la colonne D = 3 (par exemple A.a), faire la somme des cellules suivantes dont le nombre de caractères de la colonne D est = à 4
    - bien sûr, la somme du nombre de jours ne concerne qu'une seule tâche donc dès que le nombre de caractères dans la colonne D repasse à 3 (ou 2, ou 1, ou quoi que se soit qui ne soit pas 4), on recommence.

    Soit :
    - NBCAR(D3) = 3 donc dans E3 je fais la somme de toutes les cellules sous E3 tant que NBCAR = 4.
    - Dès que NBCAR dans la colonne D est différent de 4, j'arrête de sommer le contenu des cellules de la colonne E
    - et je cherche ensuite ligne après ligne une ligne où le nombre de caractères de la colonne D =3
    - etc etc

    Il faudrait donc dans l'idéal que le programme agisse de façon linéaire et qu'il considère la feuille ligne après ligne.

    Je ne sais pas si je suis très claire, mais je peux clarifier si besoin

    Bien sûr dans l'idéal, on ferait ce type de calcul pour chaque niveau hiérarchique (colonne D). Mais bon, on verra après

    Merci beaucoup de votre aide !!
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Essaie :

    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 Somme()
        Dim c As Range
        For Each c In Range([D2], Cells(Rows.Count, 4).End(xlUp))
            If Len(c.Value) = 3 Then
                For i = c.Row + 1 To Cells(Rows.Count, 4).End(xlUp).Row
                    If Len(Cells(i, 4)) = 4 Then
                        c.Offset(, 1).Formula = "=sum(" & Cells(c.Row + 1, 5).Address & _
                        ":" & Cells(i, 5).Address & ")"
                    Else
                        Exit For
                    End If
                Next i
            End If
        Next c
    End Sub
    Si ça fonctionne comme tu veux, je te mettrais les explications.

  3. #3
    Candidat au Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Par défaut
    Ouah, c'est top !!
    Merci beaucoup ça marche nikel, la macro se lance hyper vite c'est vraiment bien !

    Merci beaucoup pour la rapidité de ta réponse

    J'ajoute bien sûr que l'explication m'intéresse, histoire de comprendre un peu mieux le mystère VBA.
    J'ai commencé à regarder un petit peu, la ligne la plus difficile me semble-t-il est la ligne 7.

    Par exemple, si la colonne contenant les chiffres à sommer se trouve plus loin (au lieu d'être la colonne à côté de celle qui vérifie le nombre de caractère, elle est une colonne après, est-ce dans offset que je change le nombre indiqué ?).

    "Len" sert d'équivalent à NBCAR, c'est exact ?
    "Cells(row,count, x)", le chiffre x indique le nombre de la colonne (donc si x = 4 on parle de la colonne D), on dirait.

    puis la ligne 5 dit que dans la l'instruction i on a la ligne suivant c, toujours dans la colonne 4 (xlUp, en revanche, je ne sais pas).

    Bon voilà pour ma maigre compréhension !

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    J'ai mis quelques commentaires. N'hésite pas à en redemander.
    Tu comprendras mieux en exécutant la macro ligne par ligne en te servant de la touche F8 et en affichant la fenêtre des variables locales dans l'éditeur VB.

    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
    Sub Somme()
        Dim c As Range
        '"Cells(Rows.Count, 4)" est la dernière cellule de la colonne D
        '"Cells(Rows.Count, 4).End(xlUp)" est la dernière cellule remplie de la colonne D
        '"Range([D2], Cells(Rows.Count, 4).End(xlUp))" est la plage qui va de D2
        'à la dernière cellule rermplie de la colonne D (ici, D17)
        'on examine chaque cellule de cette plage
        For Each c In Range([D2], Cells(Rows.Count, 4).End(xlUp))
            'si il y a 3 caractères
            If Len(c.Value) = 3 Then
                'on retrouve "Cells(Rows.Count, 4).End(xlUp)" dernière cellule remplie
                '"Cells(Rows.Count, 4).End(xlUp).Row" est le numéro de ligne de cette cellule
                'on boucle sur les cellules à partir de la celluule au dessous de la cellule représentée par "c"
                For i = c.Row + 1 To Cells(Rows.Count, 4).End(xlUp).Row
                    'si la cellule Cells(i, 4) a 4 caractères
                    If Len(Cells(i, 4)) = 4 Then
                        '"c.Offset(, 1)" ou "c.Offset(0, 1)" représente le décalage par rapport à c.
                        '"0" est le décalage en nombre de lignes et 1 en nombre de colonnes
                        ' donc "c.Offset(, 1)" est la cellule à droite de la cellule c.
                        '"c.Offset(, 1).Formula" représente la formule de cette cellule
                        ' "sum" représente la fonction Excel SOMME
                        '"Cells(c.Row + 1, 5).Address" est l'adresse de la cellule sous la cellule examinée
                        '"Cells(i, 5).Address" est l'adresse de la cellule définie par "i"
                        c.Offset(, 1).Formula = "=sum(" & Cells(c.Row + 1, 5).Address & _
                        ":" & Cells(i, 5).Address & ")"
                    Else
                        'sinon on sort de la boucle commencée par "For i = ..."
                        Exit For
                    End If
                Next i
            End If
        Next c
    End Sub

  5. #5
    Candidat au Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Par défaut
    Merci beaucoup pour tes commentaires, grâce à eux je peux dupliquer le code pour l'appliquer à d'autres colonnes et à d'autres cas, c'est nikel !

    Si je comprends bien la philosophie de ton code, il consiste à sommer une plage quand on arrive à répondre à un critère défini. Qu'en est-il si je souhaite sommer les éléments répondant à ce critère même si j'ai des lignes intermédiaires ? Ce n'est donc plus la somme d'une plage mais de plusieurs cellules que l'on cherche à obtenir.

    Je m'explique avec mon fichier "test" :
    - si en E2 (où D2 = 1), je veux la somme de tous les E dont D = 3 tant que D <> 1 ? En gros si je veux la somme des jours des tâches, sans prendre en compte le nombre de jours du détail, car ceux-ci ont déjà été sommés.

    J'ai tenté avec des "while" des "and if", des ">" et des "<>" mais ma syntaxe est fausse. J'ai regardé aussi dans la fenêtre des variables locales mais cela ne m'a pas trop aidé pour débuguer (= je ne sais pas m'en servir comme il faut)...

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    C'est un peu plus compliqué. J'ai combiné le code avec le précédent. N'hésite pas à poser des questions.

    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
    Sub Somme()
        Dim c As Range, Plage As Range
        '"Cells(Rows.Count, 4)" est la dernière cellule de la colonne D
        '"Cells(Rows.Count, 4).End(xlUp)" est la dernière cellule remplie de la colonne D
        '"Range([D2], Cells(Rows.Count, 4).End(xlUp))" est la plage qui va de D2
        'à la dernière cellule rermplie de la colonne D (ici, D17)
        'on examine chaque cellule de cette plage
        For Each c In Range([D2], Cells(Rows.Count, 4).End(xlUp))
            'si il y a 3 caractères
            If Len(c.Value) = 3 Then
                'on retrouve "Cells(Rows.Count, 4).End(xlUp)" dernière cellule remplie
                '"Cells(Rows.Count, 4).End(xlUp).Row" est le numéro de ligne de cette cellule
                'on boucle sur les cellules à partir de la celluule au dessous de la cellule représentée par "c"
                For i = c.Row + 1 To Cells(Rows.Count, 4).End(xlUp).Row
                    'si la cellule Cells(i, 4) a 4 caractères
                    If Len(Cells(i, 4)) = 4 Then
                        '"c.Offset(, 1)" ou "c.Offset(0, 1)" représente le décalage par rapport à c.
                        '"0" est le décalage en nombre de lignes et 1 en nombre de colonnes
                        ' donc "c.Offset(, 1)" est la cellule à droite de la cellule c.
                        '"c.Offset(, 1).Formula" représente la formule de cette cellule
                        ' "sum" représente la fonction Excel SOMME
                        '"Cells(c.Row + 1, 5).Address" est l'adresse de la cellule sous la cellule examinée
                        '"Cells(i, 5).Address" est l'adresse de la cellule définie par "i"
                        c.Offset(, 1).Formula = "=sum(" & Cells(c.Row + 1, 5).Address & _
                        ":" & Cells(i, 5).Address & ")"
                    Else
                        'sinon on sort de la boucle commencée par "For i = ..."
                        Exit For
                    End If
                Next i
            ElseIf Len(c.Value) = 1 Then
                Set Plage = Nothing
                i = c.Row + 1
                Do While Len(Cells(i, 4)) > 1
                    If Len(Cells(i, 4)) = 3 Then
                        If Plage Is Nothing Then
                            Set Plage = Cells(i, 5)
                        Else
                            Set Plage = Union(Plage, Cells(i, 5))
                        End If
                    End If
                    i = i + 1
                Loop
                c.Offset(, 1).Formula = "=sum(" & Plage.Address & ")"
            End If
        Next c
    End Sub

Discussions similaires

  1. [XL-2010] Regrouper les critères pour une somme NB.SI
    Par Leakof dans le forum Excel
    Réponses: 4
    Dernier message: 22/11/2014, 23h32
  2. [XL-2010] SOMME.SI.ENS() avec les deux 1ers caractères d'un critère
    Par Daejung dans le forum Excel
    Réponses: 8
    Dernier message: 17/10/2014, 09h33
  3. Réponses: 0
    Dernier message: 29/10/2013, 16h58
  4. Réponses: 1
    Dernier message: 24/03/2006, 10h20

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