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 :

Faire un somme dans une boucle for each


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Faire un somme dans une boucle for each
    Bonsoir!

    Débutant en vba, je souhaite faire la somme des cellules en v qui seront dans les critéres de la boucle for each suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim couts As Integer
     
    liste = Range("p1:p" & nfait)
    For Each m In liste()
       If m >= date1 And m <= date2 Then
          'Faire la somme des cellule en V dans une variable 
       End If
    Next
    Je ne sais même pas si j'utilise la bonne démarche pour réaliser ce que je souhaite et je n'y arrive pas de toute façon.

    D'avance merci de prendre le temps de m'aider.

    Cordialement

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Je ne sais pas ce que c'est qu'une somme en V. Pourrais-tu m'éclairer.
    Mis à part cela
    J'ai détecté trois erreurs dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Dim m As Range, Liste As Range
     Set Liste = Range("p1:p" & nfait)
     For Each m In Liste
       If m >= date1 And m <= date2 Then
          'Faire la somme des cellule en V dans une variable
       End If
     Next
    m et Liste dans ton code représente un objet Range donc pour assigner une référence au Range il faut utiliser Set.
    Pour assigner une valeur à une variable, on utilise le signe égal.
    Pour assigner à une variable une référence à un objet, on fait précéder l'instruction du mot clé Set

    De plus tu as ajouté une parenthèse après le nom de ta variable Liste dans la boucle.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Bonsoir

    Merci de me venir en aide et aussi rapidement.

    Tout d'abords merci de corriger mon code qui été faux.

    Ensuite ma somme en P: en fait je souhaite additionné toutes les cellules de la colonne P mais dont la ligne est comprise entre les 2 dates.

    Dans la première parti de mon code j'arrive à compter le nombre de ligne qui corresponde à mon critère, mais dans la deuxième partie (ma somme en P) j'aimerais additionner les cellule de la colonne P qui ont été compté dans mon premier code.
    Mais mes capacités sur vba sont très limitées donc le je bloque.

    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
    Dim nfait As Integer, liste() As Variant, m
     Dim fait As Integer
     Dim cours As Integer
     
    ' recherche le nombre réalisé les 7 derniers jours
     
        Sheets("HISTO.SYSTEMATIQUE").Select
        ActiveSheet.Unprotect Password:="remi"
     
    nfait = Range("p" & Rows.Count).End(xlUp).Row
    set liste = Range("p1:p" & nfait)
    For Each m In liste()
       If m >= date1 And m <= date2 Then
          fait = fait + 1
       End If
    Next
     
    ' recherche le couts des SM réalisé les 7 derniers jours
     
      Dim couts As Integer
     
    set liste = Range("p1:p" & nfait)
    For Each m In liste()
       If m >= date1 And m <= date2 Then
          'Faire la somme dans côuts en main d'ouevre dans une variable
          'Faire la somme des côuts en materiel dans une variable
       End If
    Next

    Encore merci de prendre le temps de m'aider

  4. #4
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Histoire de s'assurer que tout ira bien, ne pas oublier d'ajouter
    afin de libérer la mémoire car lorsqu'on assigne un objet à une variable, celui ci continue d'occuper la mémoire même lorsque la procédure ou la fonction est terminée.

    Alors si vous ne voulez pas vous retrouver avec des débordements...

    Ce que tu cherches à faire se fait facilement en utilisant un filtre, il me semble.

  5. #5
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Le mieux serait de faire les sommes dans le premier passage
    Comme tu ne dis pas dans quelle colonne se trouve les coûts, dans l'exemple j'ai pris la colonne 5 soit E

    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
    Dim nfait As Integer, liste() As Variant, m
     Dim fait As Integer
     Dim cours As Integer
     Dim couts As Integer
    
    ' recherche le nombre réalisé les 7 derniers jours
        
        Sheets("HISTO.SYSTEMATIQUE").Select
        ActiveSheet.Unprotect Password:="remi"
     
    nfait = Range("p" & Rows.Count).End(xlUp).Row
    set liste = Range("p1:p" & nfait)
    For Each m In liste()
       If m >= date1 And m <= date2 Then
          fait = fait + 1
          couts = couts + cells(m.row,5).value   '
       End If
    Next

  6. #6
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Héhé, maintenant que je "sais" l'utiliser (merci Mercatog )

    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
    Sub test()
    Dim Couts As Double
    Dim List As Range
    Dim Date1 As Date, Date2 As Date
    Dim Nfait As Long
     
    'Init variables
    Nfait = 40 'juste pour faire des essais
    Set List = Range("p1:p" & Nfait)
    Date1 = CDate("01/01/2011")
    Date2 = CDate("31/01/2011")
     
     
    'Avec les couts à sommer en colonne V (donc 6 colonnes de plus que Liste)
    Couts = Evaluate("SUMPRODUCT((" & List.Address & ">=" & CStr(CLng(Date1)) & ")*(" & List.Address & "<=" & CStr(CLng(Date2)) & ")*" & List.Offset(0, 6).Address & ")")
     
    End Sub
    ++
    Qwaz

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Bonsoir

    Merci de me venir en aide.
    J'ai essayé la méthode de jfontaine qui me parait sympa et courte, cependant ça bug au niveau de la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    couts = couts + (Cells(m.Row, 22).Value)
    Erreur d'exécusion 424 : objet requis

    Je ne comprend pas pourquoi.

    Encore merci de m'aider

    Re Bonsoir,

    J'ai aussi testé la méthode de qwazerty , elle ne fonctionne pas non plus et bug à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Couts = Evaluate("SUMPRODUCT((" & List.Address & ">=" & CStr(CLng(Date1)) & ")*(" & List.Address & "<=" & CStr(CLng(Date2)) & ")*" & List.Offset(0, 6).Address & ")")
    Avec comme erreur 13 incompatibilité de type.

    D'avance merci aussi de m'aider.

    Cordialement

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Met les codes complets, tu dois avoir une variable qui est mal définie
    ++
    Qwaz

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Somme sous condition de 2 dates
    Bonjour,

    J'aimerais faire la somme des nombres dans une variable mais sous 2 conditions de date.

    Ma source de données fonctionne en lignes, une ligne est une action.

    Si l'action est comprise entre 2 dates : ex : >01/01/2011 mais < 10/01/2011
    Alors je somme les couts de toutes les actions comprises entre les 2 dates dans une variable.
    Donc toutes les lignes comprises entre ces 2 dates : j'additionne les cellules "V" dans une variable.
    Mes dates sont dans la colonne "P"

    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
    Dim nfait As Integer, liste() As Variant, m
     Dim couts As Integer
     
    ' recherche le nombre réalisé les 7 derniers jours
     
        Sheets("HISTO.SYSTEMATIQUE").Select
        ActiveSheet.Unprotect Password:="remi"
     
    nfait = Range("p" & Rows.Count).End(xlUp).Row
    set liste = Range("p1:p" & nfait)
    For Each m In liste()
       If m >= date1 And m <= date2 Then
          couts = couts + cells(m.row,5).value   '
       End If
     
    Sheets("INDICATEURS").Select
    Range("E13").Value = couts
     
    Next

    Mes deux dates sont définies plus tôt dans le programme
    Mais le problème bloque à ce niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    couts = couts + cells(m.row,5).value
    Avec : Erreur d'exécusion 424 : objet requis

    D'avance merci de prendre le temps de m'aider.

    Cordialement

  10. #10
    Membre habitué
    Inscrit en
    Janvier 2011
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 63

    Informations forums :
    Inscription : Janvier 2011
    Messages : 106
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    Le "sous-forum" macros et VBA aurait sans doute été plus adapté ... ?
    Le problème ne viendrait-il pas des parenthèses à la fin de la ligne suivante:
    U. Milité

  11. #11
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Et il serait bon de déclarer m As Range

  12. #12
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Il me semblait bien avoir un effet de déjà vu

    Pourquoi avoir ouvert un nouveau post?

    ++
    Qwaz

Discussions similaires

  1. Utilisation de condition dans une boucle for-each
    Par siro1 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/03/2012, 17h07
  2. Réponses: 0
    Dernier message: 02/11/2011, 15h41
  3. ligne d'unecellule dans une boucle "for each"
    Par JohnNC115 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/01/2011, 14h03
  4. test avant d'entrer dans une boucle For each cell in selection
    Par totoro02 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/01/2009, 09h27
  5. comment effacer un element dans un collection dans une boucle for each
    Par medkarim dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/10/2008, 12h48

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