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

Signaler
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006
-
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006
-
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

36 réponses

Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut,

Dim i As Integer
Dim MaVal As Double

MaVal = 0

For i = 9 To 999
If Cells(i, 4) tacondition1 AND Cells(i, 6) tacondition2 AND _
Cells(i, 5) tacondition3 Cells(i, 8) tacondition4 Then
MaVal = MaVal + Cells(i, 2).Value
End If
Next i

Cells(1001, 2).Value = MaVal

@++
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Selon la complexité de tes conditions, tu pourrais simplement écrire
une formule dans une autre colonne (i, par exemple) avec vérification
des 4 conditions.


SI(ET(D9"Condition 1";E9="Condition 3";F9="Condition 2";H9="Condition 4");B9;0)


et tu fais la somme de la colonne "i" (cette colonne pourrait être masquée au besoin.

MPi
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006

Merci à tous les 2 de m'avoir répondu.
Tout d'abord, pour répondre MPi, j'ai pensé effectivement à la solution "fonction SI" mais j'ai trop d'arguments à traiter, excel ne gère pas plus de 30 conditions (or j'ai 999 lignes à tester).

j'ai donc pris le code du "chevalier" (cf son portrait !) que j'ai adapté à mes conditions et ça ne marche toujours pas. Par contre il n'y a aucun message d'erreur ou de bogue.
Je ne comprend pas pourquoi rien ne s'inscrit dans la cells (1001,2) ?
Pouvez-vous m'aider ?

Sub ventil()


Dim i As Integer
Dim MaVal As Double
Dim CH As String
Dim payé As String
Dim m As Double
m = InputBox("Entrez le numéro du mois à éditer")
MaVal = 0
For i = 9 To 999If Cells(i, 4) m And Cells(i, 6) CH And _    Cells(i, 5) CH And Cells(i, 8) payé Then
MaVal = MaVal + Cells(i, 2).Value
End If
Next i
cells(1001, 2).Value = MaVal
End Sub

drine des iles
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut,

essaie comme ceci (et vérifie ce que je t'ai mis en commentaires) :

Sub ventil()

Dim i     As Integer
Dim MaVal As Double
Dim CH    As String
Dim payé  As String
Dim m     As Byte   ' ***(pas Double)

' *** payé est déclaré, mais ne possède aucune affectation de caractères !!
' *** idem pour CH

m = InputBox("Entrez le numéro du mois à éditer")
MaVal = 0

For i = 9 To 999
  If Cstr(Cells(i, 4).Value) = Cstr(m) And _
     Cstr(Cells(i, 6).Value) = cStr(CH) And _
     Cstr(Cells(i, 5).Value) = Cstr(CH) And _
     Cstr(Cells(i, 8).Value) = payé Then
        MaVal = MaVal + CDbl(Cells(i, 2).Value)
  End If
Next i
cells(1001, 2).Value = MaVal
End Sub

<small>Coloration syntaxique automatique</small>

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
L'important, ce n'est pas le nombre de lignes mais le nombre de conditions que tu as à chaque ligne.


D'après ce que je comprends, sur la ligne 9, tu veux vérifier les
valeurs de D9, E9, F9 et H9 ,donc 4 conditions. Puis sur la ligne 10,
tu veux vérifier D10, E10, F10 et H10, donc 4 autres conditions.


Donc, avec le genre de formule que je t'ai inscrite, tu n'as qu'à la
créer une fois sur la ligne 9, dans une colonne vierge, puis la copier
sur les autres lignes en-dessous. Si les 4 conditions sont vérifiées,
ça inscrit la valeur de B, sinon 0. Tu pourras donc faire le total de
cette colonne aisément.

MPi
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut MPi,

je confirme ce que tu dis, il suffit de coller ta formule sur la première ligne (la 9ème), de la sélectionnée, et de faire glisser la sélection jusqu'à la ligne 999.
Les valeurs s'incrémenteront par rapport à leurs positions dans les lignes.

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006

Oui je suis d'accord avec vous. j'ai simplifié la formule pour qu'elle soit plus facileà expliquer mais en fait j'ai des conditions assez complexe à gérer. J'aurais dû vous le dire dés le début pour ne pas vous faire perdre de temps. Sorry

condition 1 = il faut que le mois inscrit dans la cellule corresponde au mois inscrit dans la input box
condition 2 = Ch
condtion 3 = si la cellule est vide, se rendre dans la cellule voisine à gauche (ça je sait faire avec les réfénce offset...) pour voir si la condition se réalise
condition 4= payé

puis je recommence les mêmes conditions en changeant Ch par ES, puis je recommence en changeant ES par VR et enfin, en changeant VR par PRL.

et ceci dans se répeter dans 6 listes différentes pour au final ne donner qu'un seul montant.

mon souci est que je n'arrive pas à déclarer les variables comme il faut.
D'ailleurs merci Mortalino, tu m'a montré la variable byte que je n'avais jamais vu.
Malheureusemen ta dernière proposition de code ne fonctionne pas non plus.

Je ne vois vraiment pas où est le problème ? Vous qui étes plus expérimentés le trouverez certainement maitenant que je vous ai tout détaillé .

drine des iles
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Juste pour vérifier une chose, met toi sur la bonne feuille, affiche l'éditeur VB, insère un module et place ceci :

Sub Test()
  MsgBox Cells(i, 4).Value
End Sub
 <small>Coloration syntaxique automatique</small>

Appuie sur F5 et dis moi ce que te dit la message box

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Remplace i par 9  (désolé, suis allé trop vite)

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006

la msgbox me répond 9.





drine des iles
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Le problème ne vient pas du mois donc, mais vient, je pense de tes conditions.
Par exemple, dans le code que je t'ai mis (celui coloré), tu as donc CH et payé comme variables, mais techniquement, elles sont vides.

Et d'après tes explications, CH est une condition où je sais pas raiment quoi.
En fait, SI dans tes cellules, c'est marqué CH et payé, tel quel, dans ce cas là, pas besoins de variables dans ton code mais d'une chaine de caractères :

Sub ventil()

Dim i     As Integer
Dim MaVal As Double
' *** variables ici supprimés (CH et payé)
Dim m     As Byte   ' ***(pas Double)

' *** payé est déclaré, mais ne possède aucune affectation de caractères !!
' *** idem pour CH

m = InputBox("Entrez le numéro du mois à éditer")
MaVal = 0

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
End Sub
 <small>Coloration syntaxique automatique</small>

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006

Désolée ça ne fonctionne toujours pas. Par contre cette fois il me donne toutes ces lignes en surlignés jaune pour m'indiquer que l'erreur est par là. J'ai essayé quelques modifications "à l'instinct" mais là je suis dépassée. Je ne comprend toujours pas ou ça coince !

 If CStr(Cells(i, 4).Value) = m And _
     CStr(Cells(i, 6).Value) = "CH" And _
     CStr(Cells(i, 5).Value) = "CH" And _
     CStr(Cells(i, 8).Value) = "payé" Then




drine des iles
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Supprime  mes commentaires à droite des  _   (underscore)
Sans toucher la mise en forme du code (un espace de moins et c'est foutu).

Je veins de faire le test, un copier coller du code suivant sera plus facile :

Sub ventil()

Dim i     As Integer
Dim MaVal As Double
' *** variables ici supprimés (CH et payé)
Dim m     As Byte   ' ***(pas Double)

' *** payé est déclaré, mais ne possède aucune affectation de caractères !!
' *** idem pour CH

m = InputBox("Entrez le numéro du mois à éditer")
MaVal = 0

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

 <small>Coloration syntaxique automatique</small>

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006

je l'avais déjà fait. le problème ne vient pas de là ! c'est à y perdre son latin !

drine des iles
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Là franchement je sèche et faut que j'aille me coucher (je me lève à 5h) mais en cas, mets moi ce qui à dans tes cellules exemple :
(écrie en courier New pour l'espacement des caractères) :

   Colonne A        Colonne B        Colonne C  
L1     1             Bonjour         =NB.SI(...)     
L2     2            Au revoir       =mainntenant()     
L3     3             Bonjour       =autres formules

je regarde ça demain matin 

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006

Génial, merci beaucoup. je vais faire ça et pour ma part, je continue de chercher. bonne nuit !

drine des iles
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006

<colgroup>
<col style=\"WIDTH: 52pt; mso-width-source: userset; mso-width-alt: 2208\" width=\"69\" />
<col style=\"WIDTH: 52pt; mso-width-source: userset; mso-width-alt: 2208\" width=\"69\" />
<col style=\"WIDTH: 25pt; mso-width-source: userset; mso-width-alt: 1056\" width=\"33\" />
<col style=\"WIDTH: 26pt; mso-width-source: userset; mso-width-alt: 1120\" width=\"35\" />
<col style=\"WIDTH: 35pt; mso-width-source: userset; mso-width-alt: 1472\" width=\"46\" />
<col style=\"WIDTH: 38pt; mso-width-source: userset; mso-width-alt: 1600\" width=\"50\" />
<col style=\"WIDTH: 130pt; mso-width-source: userset; mso-width-alt: 5536\" width=\"173\" />
<col style=\"WIDTH: 27pt; mso-width-source: userset; mso-width-alt: 1152\" width=\"36\" />
</colgroup>

----

n° facture
,

Montt 1
,

Jour 1
,

Mois 1
,

Règl. 1 

,

Règl. 1 modifié par
,

Notes 1
,

Payé 1
,

----

1040706M,
100,00 ?,
05,
09,
CH,
CH,
aze,
Payé,

----

1050706M,
200,00 ?,
10,
06,
CH,
CH,
Ch.Bourdio remplacé par SG n° 1236 au nom :Desgrottes,
Payé,

----

1060906M,
100,00 ?,
10,
06,
ES,
 ,
réglé à réception,
Payé,

----

 1070906M,
50 ? ,
 15,
 07,
 CH,
 ,
 à déposer le 30 sept.,
 


voici ls 3 1ères lignes du tableau. cette même liste se reproduit 6 fois (en tant qu'association nous sommes larges avec les adhérents et nous proposons jusqu'à 6 échéances). Voilà pourquoi au bout d'un moment , il est difficile de savoir qui a payé à quel moment et par quel moyen.

si tu peux m'aider dans la macro ça résoudra mon problème : sur le mois x, combien de chéques ont été porté en banque, et pour quel montant (idem pour les ES, CB...) ?
drine des iles
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Ok, je pense avoir trouvé :

les Cells(i, X).Value récupèrent les formules, et non les valeurs.
Pour tous les Cells(i, X).Value, remplace le mot Value par Text

++
Messages postés
42
Date d'inscription
mardi 10 janvier 2006
Statut
Membre
Dernière intervention
26 septembre 2006

Désolée ça ne fonctionne pas non plus.
A ton avis, est-ce que le fait que les cellules soient dans une liste peut être la source du problème ?

drine des iles
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut Drine,

désolé, je ne vois pas ce que tu veux dire avec tes cellules dans une liste.


Si chaque cellule possède des coordonnées, il ne devrait pas y avoir de problèmes, mais j'ai déjà rencontrer des difficultés, surtout avec les dates, pour comparer entre le format excel et le format vb, qques fois c'est difficile.

@++





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

  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>