Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 La fonction SOMME.SI.ENS() me renvoie l'erreur #VALEUR!

IxeX

XLDnaute Nouveau
Bonjour à tous !

Je me permets de vous soumettre un petit problème concernant la fonction somme.si.en(). La formule ci-dessous me retourne l'erreur #VALEUR!

VB:
=(SOMME.SI.ENS('D1:F1'!$B$1:B999999;'D1:F1'!$A$1:A999999;">"&Résultat!A1))

J'effectue mon traitement dans les onglets Feuil1, Feuil2, Feuil3. Ces onglets se situent entre les onglets D1 et F1.

Depuis mon fichier d'exemple (ci-joint), J'affiche mon résultat en B1 (depuis l'onglet "Résultat") où j'additionne toutes les valeurs en B (des feuilles contenues entre les onglets D1 et F1) si les dates en A (des feuilles contenues entre les onglets D1 et F1) sont supérieures à la date de recherche, à savoir en A (depuis l'onglet "Résultat").

PS : Si j'effectue mon traitement sur une seule feuille, la formule fonctionne.......

Avez-vous une solution/explication à me proposer et/ou une alternative commode afin de contourner ce problème ?

Merci d'avance !
 

Pièces jointes

  • exemple_04.xlsx
    11.7 KB · Affichages: 15

IxeX

XLDnaute Nouveau
Bonjour IxeX,

La formule en B1 n'a pas de sens mais vous pouvez faire la somme de 3 formules telles que B2.

A+
Bonjour job75 et merci de votre retour.

L'intérêt de la formule en B1 (et de cette fonction SOMME.SI.ENS()) est de pallier à l'ajout et/ou retrait de feuilles entre les onglets D1 et F1... sans pour autant revenir à la formule même en B1.

Après, s'il est impossible d'organiser une formule dans ce sens, je passerai par votre solution d'appoint.
 

chris

XLDnaute Barbatruc
Bonjour à tous

Pour faire une formule 3 D avec SOMME.SI il faut une liste des onglets ou des tableaux structurés (il serait peut-être temps de les utiliser...) et combiner avec SOMMEPROD
 

job75

XLDnaute Barbatruc
Re, bonjour vgendron, chris,

S'il y a beaucoup de feuilles à tester le plus simple est d'utiliser cette fonction VBA :
VB:
Function MaSomme#(coltest%, colresu%, test$)
Application.Volatile
Dim nf$, w As Worksheet, r As Range, e As Boolean
nf = Application.Caller.Parent.Name
On Error Resume Next 'si e n'est pas booléenne
For Each w In Worksheets
    If w.Name <> nf Then
        For Each r In w.UsedRange.Rows
            e = False
            e = Evaluate(r.Cells(coltest).Value2 & test)
            If e Then MaSomme = MaSomme + CDbl(r.Cells(colresu))
        Next r
    End If
Next w
End Function
Voyez le fichier joint, le code doit être placé impérativement dans un module standard.

Formule en A1 de la feuille "Résultat" =MaSomme(1;2;">"&A1)

A+
 

Pièces jointes

  • exemple(1).xlsm
    22 KB · Affichages: 3

job75

XLDnaute Barbatruc
Cela dit la fonction précédente n'est pas très rapide car chaque ligne est testée avec Evaluate.
Voyez le fichier (2), avec ce nouveau code qui utilise SOMME.SI le calcul est très rapide :
VB:
Function MaSomme#(coltest%, colresu%, test$)
Application.Volatile
Dim nf$, w As Worksheet
nf = Application.Caller.Parent.Name
For Each w In Worksheets
    If w.Name <> nf Then MaSomme = MaSomme + _
        Evaluate("SUMIF(" & w.Columns(coltest).Address(External:=True) & ",""" & test & """," & w.Columns(colresu).Address(External:=True) & ")")
Next
End Function
 

Pièces jointes

  • exemple(2).xlsm
    22.1 KB · Affichages: 5

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…