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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    13 182
    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 : 13 182
    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.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    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
    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
    Membre Expert
    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
    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 confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    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 confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    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

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Membre averti
    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
    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

  8. #8
    Membre éprouvé
    Inscrit en
    Janvier 2011
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Janvier 2011
    Messages : 106
    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é

  9. #9
    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 : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Et il serait bon de déclarer m As Range
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  10. #10
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Il me semblait bien avoir un effet de déjà vu

    Pourquoi avoir ouvert un nouveau post?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

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, 18h07
  2. Réponses: 0
    Dernier message: 02/11/2011, 16h41
  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, 15h03
  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, 10h27
  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, 13h48

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