Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022
-
29 mai 2013 à 14:15
Lameche15
Messages postés156Date d'inscriptionmardi 9 septembre 2008StatutMembreDernière intervention15 septembre 2022
-
30 mai 2013 à 08:40
Bonjour,
C'est encore le casse couille,
Je ne sais pas comment faire une somme si condition en macro sans faire de boucle.
J'aimerais faire la somme de la colonne H en fonction de la valeur dans la colonne B (5 valeurs possible)
en gros:
sommecot somme.si(col B COT)
sommegav somme.si(col B GAV)
...
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 29 mai 2013 à 15:30
Ou alors : utiliser la fonction WorkSheetFunction.sumif (ce qui revient à utiliser finalement SOMME.SI, mais depuis VBA).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 mai 2013 à 18:14
Salut
C'est rigolo à tenter de refaire :
En supposant, dans cet exemple, que la plage sur laquelle faire le test, se trouve en B3 à B9 et que, optionnellement, les chiffres à additionner se trouvent deux colonnes plus loin :
Option Explicit
Private Sub xxx()
Dim oRangePlage As Range
Dim oRangeChiffres As Range
Set oRangePlage = Range("B3:B9") ' plage sur laquelle faire le test
Set oRangeChiffres = Range("D3:D9") ' plage des chiffres à additionner
Debug.Print SommeSi(oRangePlage, ">10", oRangeChiffres)
Debug.Print SommeSi(oRangePlage, ">10")
End Sub
Private Function SommeSi(ByRef Plage As Range, _
ByRef Critère As String, _
Optional ByRef Somme_Plage As Range = Nothing) As Double
Dim oRange As Range
Dim oCalcul As Range
Dim mSumm As Double
mSumm = 0
Set oCalcul = Range("P1") ' Cellule de calcul intermédiaire (à cacher)
For Each oRange In Plage
oCalcul.Formula = "= (" & oRange.Value & Critère & ")"
If oCalcul.Value = True Then
If Not Somme_Plage Is Nothing Then
mSumm = mSumm + oRange.Offset(0, Somme_Plage.Column - oRange.Column)
Else
mSumm = mSumm + oRange.Value
End If
End If
Next
SommeSi = mSumm
End Function
La grosse différence avec la fonction interne Somme.Si, c'est qu'elle est bardée de test sur le contenu des cellules.
Par exemple, si une des cellules ne contient rien et que tu la testes "inférieure à", ma fonction risque de donner des résultats bizarres.
Idem si le contenu à additionner n'est pas un chiffre, etc, etc
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 29 mai 2013 à 15:29
Bonjour,
Sans faire de boucle, ce n'est pas possible.
Seront inévitables : le parcours en boucle, une expression conditionnelle et une addition chaque fois que critère vérifié.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 mai 2013 à 18:17
PS : Si tu devais comparer des textes et non des chiffres, il faudrait prendre les précautions d'usage quand on place une chaine à l'intérieur d'une chaine :
Debug.Print SommeSi(oRangePlage, "=""Coucou""")
en doublant le nombre de " qui encadrent la chaine de comparaison
Vous n’avez pas trouvé la réponse que vous recherchez ?