Somme si en macro [Résolu]

Lameche15 112 Messages postés mardi 9 septembre 2008Date d'inscription 5 mars 2018 Dernière intervention - 29 mai 2013 à 14:15 - Dernière réponse : Lameche15 112 Messages postés mardi 9 septembre 2008Date d'inscription 5 mars 2018 Dernière intervention
- 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)
...

Merci d'avance pour votre aide
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 29 mai 2013 à 15:30
3
Merci
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.

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de ucfoutu
Meilleure réponse
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 29 mai 2013 à 18:14
3
Merci
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)

Merci cs_Jack 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Jack
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 29 mai 2013 à 15:29
0
Merci
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.
Commenter la réponse de ucfoutu
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 29 mai 2013 à 18:17
0
Merci
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
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 29 mai 2013 à 18:23
0
Merci
Oups, pour les chaines, ça ne fonctionne pas.
Faudrait approfondir/debuguer (pas le temps)
Commenter la réponse de cs_Jack
Lameche15 112 Messages postés mardi 9 septembre 2008Date d'inscription 5 mars 2018 Dernière intervention - 30 mai 2013 à 08:40
0
Merci
Merci beaucoup pour le coup de main!
Commenter la réponse de Lameche15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.