Comment additionner des cellules si d'autres cellules de la même ligne répondent

drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006 - 20 sept. 2006 à 05:36
drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006 - 26 sept. 2006 à 05:09
Bonjour,


dans la plage B9:H999
je voudrais faire une boucle qui teste chaque ligne . si les conditions spécifiées dans chaque ligne sont remplies alors on additionne les cellules en tête de ligne et on inscrit le total en B1001.

exemple:
si la cellule D9=condition1 et la cellule F9=condition2 et la cellule E9=condition3 et la cellule H9=condition4 alors je retiens la valeur de la cellule B9 pour l'addition finale.
ligne suivante
si la cellule D10=condition1 et la cellule F10=condition2 et la cellule E10=condition3 et la cellule H10=condition4 alors je retiens la valeur de la cellule B10 pour l'additionner à B9.
etc.

par contre, si l'une des conditions n'est pas remplie = je passe à la ligne suivante sans rien retenir à additionner.

Je n'arrive pas à écrire ce code, il y  a toujours une variable ou un autre truc qui cloche !
quelqu'un peut-il m'aider ?

drine des iles
A voir également:

36 réponses

drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006
23 sept. 2006 à 01:04
C'est une liste qui sert à extraire des tableaux en croisé dynamique . C'est donc un outil spécial d'excel;
peut-être cette liste bloque -t-elle certaine fonctionnalité VBA ?
drine des iles
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 sept. 2006 à 02:23
Peut-être, je suis pas un pro dans les TCD mais si, avec l'arborescence ouverte, les cellules ont bien une adresse (ex : D5), beh il ne devrait pas y avoir de problèmes.


Il faut travailler avec les données dans le tableur, si ta liste est un module spécial, là effectivement ça ne marchera pas.

@++





<hr width="100%" size="2" />

  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006
23 sept. 2006 à 18:02
Bonjour Mortalino
J'ai réécrit le code comme ci-dessous et j'obtient un résultat.
Le problème c'est que ça affiche le montant total de toute les cellules (i,3) sans tenir compte des conditions préalablement énoncées.
Si

Sub ventil_encaiss()
Dim mois As Variant
Dim maval As Double
Dim CH As String
Dim payé As String
Dim i As Integer
mois = InputBox("Entrez le numéro du mois à éditer.")
maval = 0


For i = 9 To 999   If Cells(i, 5) mois And Cells(i, 9) payé And _   Cells(i, 6) CH And Cells(i, 7) "" Then
   EndIf                                                                                                                            '(si '(si je place le next i ou le total maval avant le end if ça ne marche plus !)
                                                      
   Next i
    Range("B1001") = maval + Cells(i, 3).Value
End Sub
drine des iles
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
23 sept. 2006 à 18:39
For i = 9 To 999

   If Cells(i, 5) mois And Cells(i, 9) "payé" And _

      Cells(i, 6) "CH" And Cells(i, 7) "" Then

      maval = maval + Cells(i, 3)

   End If


Next i


    Range("B1001") = maval

End Sub


Attention de mettre des guillemets autour des valeurs de texte qui ne sont pas des variables. Si mois est une variable, il n'est pas nécessaire d'en mettre pusiqu'elle les contient par défaut.

Attention aussi à la casse: CH est différent de ch ou Ch

MPi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006
23 sept. 2006 à 19:31
effectivement j'ai oublié les ". Mais ça ne permet pas de prendre en compte les conditions que j'ennonce ! la boucle continue d'additionner toutes les cellules de la colonne sans tenir compte des conditions annoncées !

drine des iles
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 sept. 2006 à 20:40
alors teste condition par condition, afin de déterminer où ça ne va pas :

For i = 9 To 999
   MsgBox Cells(i, 5).Value & " - " & mois   '*** il me semblait avoir mis Value ^^
End If    

For i = 9 To 999
   MsgBox Cells(i, 9).Value & " - " & Cells(i, 6).Value & " - " &  Cells(i, 7).Value
End If 

Vérifie que tes données sois bonnes !

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006
23 sept. 2006 à 22:53
Je crois que j'ai une piste mais je ne sais pas comment écrire le code.

1/ j'ai testé toutes les conditions comme tu me l'as dit et tout à l'air bon.
2/ j'en déduit qu'il tient donc compte des conditions émises au moment où il les lit
3/ le problème viendrait donc du fait que je ne lui ai pas dit ce qu'il faut faire si la condition n'est pas réalisée.
4/ donc, ne sachant pas quoi faire , condition réalisée ou pas il passe à la ligne suivante et additionne toutes les cells (i,3) sans sourciller !


5/ donc, j'ai essayé de lui écrire que si cells (i,5)= mois n'est pas VRAI il faut directement passer à la ligne suivante .
puis, si condition 1 est VRAI mais condition 2 est fausse, alors il faut passer à la ligne suivante etc.

6 / comment lui dire que si et seulement si toutes les conditions sont remplies il peut additionner les valeurs correspondantes ?

as tu une idée ?

drine des iles
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 sept. 2006 à 23:01
Oui, confère mon code page 1 :

For i =  9 To 999
  If Cstr(Cells(i, 4).Value) = m And _
     Cstr(Cells(i, 6).Value) = "CH" And _  ' *** CH est à mettre entre ""
     Cstr(Cells(i, 5).Value) = "CH" And _  ' *** CH est à mettre entre ""
     Cstr(Cells(i, 8).Value) = "payé" Then ' *** payé est à mettre entre ""
         MaVal   = MaVal + CDbl(Cells(i, 2).Value)
  End If
Next i
cells(1001, 2).Value =  MaVal

MaVal   que ne prend la valeur que si la condition est vrai.

En gros, si tes 4 conditions sont vrais, MaVal égal lui même (donc 0 la première fois) + la valeur de la cellule Bi (i vaut pour 9 à 999).


Si les conditions ne sont pas vraies, pas il passe à la ligne suivante

@++





<hr width ="100%" size="2" />

  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006
23 sept. 2006 à 23:27
effectivement j'avais essayé ce code que tu m'avais déjà donné.
Il y a un problème au moment d'afficher le total.
si je laisse maval = maval+ CDbl(Cells(i, 3).Value) avant l'instruction end if : il ne m'affiche aucun montant.
si je place maval = maval+ CDbl(Cells(i, 3).Value) aprés end if il me donne le montant total de toute la colone sans tenir compte des conditions !!!!

c'est à devenir FOU !!!

Sub ventil()Dim m As Variant
Dim maval As Double
Dim CH As String
Dim payé As String
Dim i As Long
m = InputBox("Entrez le numéro du mois à éditer.Exemple : 05 (mai)")
maval = 0


For i = 9 To 999
  If CStr(Cells(i, 5).Value) = m And _
     CStr(Cells(i, 7).Value) = "CH" And _
     CStr(Cells(i, 6).Value) = "CH" And _
     CStr(Cells(i, 9).Value) = "payé" Then
     '   maval = maval + CDbl(Cells(i, 3).Value)
  End If
  maval = maval + CDbl(Cells(i, 3).Value)
Next i
 
Range("b1001").Value = maval
End Sub
drine des iles
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 sept. 2006 à 23:55
Beh en fait, on en revient toujours au même problème : tes conditions ne se vérifient pas.
Sache, que lorsque tu testes comme tout à l'heure (avec les message box), tu as une valeur qui apparait, je reprends mon test :

MsgBox Cells(i, 5).Value & " - " & mois

Si il apparait :

10 - 10
c'est bon, les valeurs sont les mêmes,

par contre s'il apparait :

"10" - 10
bah c'est pas bon, la première valeur est de type String (chaines de caractères) alors que la seconde est de type numérique.

Il faut que les données soient concordantes, d'où le fait de bien déclarer ses variables, et l'importances des "".

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006
24 sept. 2006 à 00:19
Désolée, j'ai refait le test et les messages donne tous des valeurs identiques.

je crois que je vais laisser tomber  et trouver un autre moyen d'arriver à ce résultat sans passer par une macro parceque je n'en vois plus le bout.

si un jour je trouve la solution (quand je serais devenue "forte" en VBA), je ne manquerais pas de te dire le résultat.
je te remercie ENORMEMENT pour tous le temps que tu m'a accordé.
Je pense qu'en provence il doit être l'heure d'aller dormir alors : BONNE NUIT ET MERCI ENCORE POUR TOUT;

drine des iles
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
24 sept. 2006 à 16:21
Drine, tu dois absolument procéder comme te l'indique Mortalino

For i =  9 To 999

  If Cstr(Cells(i, 4).Value) = m And _

     Cstr(Cells(i, 6).Value) = "CH" And _  ' *** CH est à mettre entre ""

     Cstr(Cells(i, 5).Value) = "CH" And _  ' *** CH est à mettre entre ""

     Cstr(Cells(i, 8).Value) = "payé" Then ' *** payé est à mettre entre ""

         MaVal   = MaVal + CDbl(Cells(i, 2).Value)

  End If
Next i
cells(1001, 2).Value =  MaVal
------------------------------------------------------
MaVal   = MaVal + CDbl(Cells(i, 2).Value)
doit être à l'intérieur du If ... End If

Si la valeur est 0 lorsque la boucle se termine, c'est que toutes les
conditions n'ont pas été vraies. Si, d'après toi, certaines lignes
contiennent les 4 conditions vraies, il faut alors vérifier les valeurs
des cellules.


Comme j'ai dit CH est différent de Ch et de ch, mais aussi "CH " est différent de "CH".

Il y a peut-être des espaces dans les valeurs de tes cellules. Il faudrait alors utiliser Instr() ou Trim()

For i =  9 To 999


  If Cstr(Cells(i, 4).Value) = m And _


     Trim(Cells(i, 6).Value) = "CH" And _  ' *** CH est à mettre entre ""


     Trim(Cells(i, 5).Value) = "CH" And _  ' *** CH est à mettre entre ""


     Trim(Cells(i, 8).Value) = "payé" Then ' *** payé est à mettre entre ""


         MaVal   = MaVal + CDbl(Cells(i, 2).Value)  ' *** à laisser là


  End If
Next i
cells(1001, 2).Value = MaVal

MPi
0
drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006
24 sept. 2006 à 20:19
Bonjour MPi, merci de ton coup de main à toi aussi;

Bien, j'ai tout repris. j'ai vérifier, comme Mortalino me l'avait expliqué la valeur des cellule grace à une msgbox. A chaque fois le résultat annoncé dans la msgbox est égal à celle du code. Mais effectivement le résultat de la boucle est 0. Donc je me suis surement trompée dans les déclarations. Voilà ce que j'ai saisi ( les références des cellules ont un peu changé car j'ai modifié un brin le tableau qui contient les données.
Qu'en penses-tu ?

Sub ventil()
Dim i As Long
Dim payé As String
Dim CH As String
Dim m As Byte
Dim maval As Double


maval = 0
m = InputBox("Entrez le numéro du mois à éditer")
For i = 9 To 999
  If CStr(Cells(i, 5).Value) = m And _
     CStr(Cells(i, 7).Value) = "CH" And _
     CStr(Cells(i, 6).Value) = "CH" And _
     CStr(Cells(i, 9).Value) = "payé" Then
        maval = maval + CDbl(Cells(i, 3).Value)
  End If
Next i
Range("j4").Value = maval
drine des iles
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
24 sept. 2006 à 20:53
Ces déclarations ne servent à rien

Dim payé As String

Dim CH As String

Les termes "payé" et "CH" que tu recherches sont des valeurs de cellules et non des variables.


Si tu veux, tu peux m'envoyer le contenu de ta feuille. Ça peut être dû
à un détail idiot qu'on ne voit pas. La façon dont le code est écrit
semble correcte, mais c'est difficile pour nous de voir où peut être
l'erreur ou le problème...


m_pi@videotron.ca

MPi
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
26 sept. 2006 à 00:09
Pour ceux qui ont suivi (et participé) le post... Une seule lettre faisait que ça ne fonctionnait pas: un simple P(ayé)

C'est du moins ma conclusion après avoir vu le fichier et les diverses interventions...


Sub CalculSelonConditions()

    Dim I As Long, Total As Double

    Dim nbLignes As Long

    Dim Mois As Integer

   

    Mois = CInt(InputBox("Entrer le mois à vérifier"))

   

    'Trouver le nombre de lignes à vérifier en se basant sur la colonne E

    'Changer les 3 E pour vérifier une autre colonne

    nbLignes = Columns("E:E").Find("*", Range("E1"), , , xlByRows, xlPrevious).Row

   

    For I = 9 To nbLignes

        If Range("E" & I) = Mois And _

            Range("F" & I) = "CH" And _

            Range("G" & I) = "CH" And _

            Range("I" & I) = " P ayé" Then

           

            Total = Total + Range("C" & I)

        End If

    Next

    Range("I5") = Format(Total, "currency")

   

End Sub


Et pour s'assurer que les comparaisons sont toujours efficaces, il vaut encore mieux y aller comme suit:

   
For I = 9 To nbLignes
        If CStr(Range("E"
& I)) = CStr(Mois) And _    
           
UCase(Range("F" & I)) = "CH" And _        
            UCase(Range("G" & I)) = "CH"
And _       
            UCase(Range("I" & I)) =
"PAYÉ" Then      
           
            Total = Total + Range("C" &
I)
        End If
    Next


Et on pourrait beurrer encore plus épais en mettant

   
For I = 9 To nbLignes
        If Val(Range("E"
& I)) = Val(Mois) And _    
           
Trim(UCase(Range("F" & I))) = "CH" And _        
            Trim(UCase(Range("G" & I))) = "CH"
And _       
            Trim(UCase(Range("I" & I))) =
"PAYÉ" Then      
           
            Total = Total + Range("C" &
I)
        End If
    Next

MPi
0
drine des iles Messages postés 42 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 26 septembre 2006
26 sept. 2006 à 05:09
Merci encore mille fois à Mortalino et à MPi.
j'avoue que j'avais laché prise et pour cause, j'étais bien loin d'arriver à écrire ce code seule (ça dépasse largement le contenu de mon "VBA pour les nuls"!!!)!!!
Merci aussi aux concepteurs du site car j'avoue que ces quelques jours d'échanges autour d'un code qui me posait problème auront été trés riches d'enseignements.

drine des iles
0
Rejoignez-nous