Fonction Somme Si Ens en VBA

Signaler
Messages postés
9
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
1 août 2013
-
Messages postés
9
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
1 août 2013
-
Bonjour je suis a la recherche d'un bout de code sous VBA qui additionne les chiffres d'une colonnes uniquement si la cellule sur la meme ligne dans la colonne d'à coté est vide .Avec excel 2007 la fonction Somme.Si.Ens Fonctionne a merveille le probleme c'est qu'au boulot on est encore avec excel 2003.Merci de votre precieuse aide

8 réponses

Messages postés
31579
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mars 2021
344
Bonjour,

Pourquoi le faire en VBA ?
sous 2003, il existe des formules pour le faire.

Si tu ne souhaites faire une somme qu'avec une seule condition, tu peux utiliser la fonction
SOMME.SI

Si tu souhaites faires une somme avec plusieurs conditions (comme le Somme.si.ENS de 2007) tu peux utiliser la fonction somme prod comme ci-dessous:
=SOMMEPROD((B1:B4="")*(C1:C4="x")*(A1:A4))

Cet exemple te retourne la somme des cellules A1:A4 si en B1:B4 les cellules sont vides et qu'en A1:A4 il y à un x

par exemple mes 3 colonnes :
1 x
2 a
3 a x
4 x

Le résultat du sommeprod => 5

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
31579
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mars 2021
344
Bonjour,
petite correction :
qu'en A1:A4 il y à un x

il fallait comprendre C1:C4

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
31579
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mars 2021
344
Bonjour,
correction N°2 (désolé, je n'avais pas vu que la mise en page avait changé..)

par exemple mes 3 colonnes :
1 x
2 a
3 a x
4 x


par exemple mes 3 colonnes :
A B C
1 _ x
2 a _
3 a x
4 _ x


Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
9
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
1 août 2013

Merci beaucoup Jordane je ne pensais pas a cette formule.je vais essayer ça des que je serai au boulot
Merci encore
.
Messages postés
31579
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mars 2021
344
Bonjour,

pas de soucis.
ps: une fois testé.. si la réponse te convient pense à mettre le sujet en résolu.

Bonne journée.

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
9
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
1 août 2013

Merci Jordane ça fonctionne a merveille. A quel endroit doit je clicker pour mettre le sujet en résolu.
Mais juste pour le fun j'avais essayer de monter cette macro mais ça plante quelque part et je ne vois pas d'ou cela vient .
Merci

Sub Essai()
Dim Cell As String
Total = 0
For i = 0 To 20
If Cell(2, i) = Cell(1, i) Then
Total = Total + Cell(2, i)
End If
Next i
Cell(2, 21).Value = Total
End Sub
Messages postés
31579
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mars 2021
344
Bonjour,
pour mettre en résolu, tu as normalement, sur une des réponse donnée (en haut de chacune en fait) un bouton indiquant "réponse accéptée". il suffit de cliquer dessus.

Pour ta macro : Il y a plusieurs problèmes
Cell as string => ? correspond à quoi ?
Pour lire et écrire une valeur avec la fonction cellS il faut l'utiliser ainsi.
cells(Ligne,Colonne).value = Valeur
Valeur =cells(Ligne,Colonne).value


Ta boucle commence à 0 +> impossible dans excel La ligne ou la colonne est forcément >= à 1

Vue que CELLS s'utilise comme ceci cells(Ligne,Colonne).value ... tu constatera que ton code lui demande de scruter non pas la cellule dans la colonne 1 puis celle d'à coté mais sur les lignes 1 et 2.

Pour finir, voici comment j'aurais fais (en reprenant ton exemple):
Function Somme_perso(Plage As Range)
Dim Plage As Range
Set Plage = Range("A1:A20")

'boucle sur chaque cellule de la plage
' > on crée un "objet" cellule mais tu
' pourrais le nomer TOTO.. c'est pareil
For Each cellule In Plage
    ' test les deux cellules colonne 1 et 2 sur la meme ligne
    If cellule.Value = Cells(cellule.Row, cellule.Column + 1).Value Then
        ' test si c'est bien un nombre
        If IsNumeric(Cells(cellule.Row, cellule.Column + 1).Value) Then
            TOTAL = TOTAL + Cells(cellule.Row, cellule.Column + 1).Value
        End If
    End If
Next
'affichage du total
MsgBox (TOTAL)
End Function


Tu remarqueras que j'ai utilisé une Fonction plutot qu'un Sub. ce qui mer permet de l'utiliser dans mon classeur excel dans une formule par exemple (comme le Somme.si.ens de 2007).


Si tu regardes sur le net, tu trouveras des tutos sur l'utilisation des fonctions personnalisées en VBA. bonne lecture ^^

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
9
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
1 août 2013

Merci Jordane pour tes conseils que je vais appliquer.
Bonne soirée