Somme.si.ens (contient ou (*A*;*B*)

Marjo2

XLDnaute Occasionnel
Bonjour,
Je cherche à faire une formule qui me dirait faire la somme de mon 1er critère (date); puis qui commence par ("111*") et dans le libellé est écrit soit "AAAA", soit "BBBB" etc
L'idée est que si dans le libellé est écrit AAAA et BBBB qu'il ne me l'additionne pas en double.

=somme.si.ens(Feuil2!K:K;Feuil2!F:F;'EXPORT'!A5;Feuil2!A:A;"111*";Feuil2!D:D;"*AAAA*";Feuil2!D:D;"*BBBB*";Feuil2!D:D;"*CCCC*")

Cela ne fonctionne pas et si je passe en matricielle, il va me compter de fois aussi.

Une idée ?
 

Marjo2

XLDnaute Occasionnel
=SOMME.SI.ENS(Feuil2!D:D;Feuil2!A:A;Feuil1!A1;Feuil2!B:B;"111*";Feuil2!C:C;{"*AAAA*";"*BBBB*";"*CCCC*"})
Comme c'est du texte, je rajoute * * mais le montant renvoyé est faux.
Je ne comprends pas et j'ai l'impression d'être dans une impasse….
 

Pièces jointes

  • EXEMPLE.xlsx
    9.6 KB · Affichages: 4

eriiic

XLDnaute Barbatruc
Bonjour à tous,

avec un sommeprod() + une fonction personnalisée qui te retourne une matrice de VRAI/FAUX si une des chaine est incluse, ligne à ligne.
VB:
Function ouTxt(libel As Range, crit As Range)
    Dim data1, data2, result() As Boolean
    Dim i As Long, j As Long
    data1 = libel.Value: data2 = crit.Value
    ReDim result(1 To UBound(data1), 1 To 1)
    For i = 1 To UBound(data1)
        For j = 1 To UBound(data1)
            If data1(i, 1) Like "*" & data2(j, 1) & "*" Then result(i, 1) = True: Exit For
        Next j
    Next i
    ouTxt = result
End Function
Code:
=SOMMEPROD((A1:A5=A1)*(B1:B5=B1)*(ouTxt(C1:C5;H1:H3))*(D1:D5))
eric
 

Pièces jointes

  • Exemple.xlsm
    17.8 KB · Affichages: 12

Marjo2

XLDnaute Occasionnel
Merci pour avoir traiter le sujet mais la solution n'est pas là.
Les produits qui commencent par 111 et qui contiennent ou AAAA, BBBB, CCCC et ne pas compter en doublon mais qu'une seule fois si le libellé du produit contient AAAA BBBB par exemple
 

job75

XLDnaute Barbatruc
Bonjour Marjo2, Jocelyn, eriiiic, JB,

@ eriiiic : ça ne va pas si on efface "AAAA" en Feuil2!C1.

Mais avec une colonne auxiliaire pas besoin de VBA.

Formule en Feuil2!E1 =SOMMEPROD(--ESTNUM(CHERCHE(H$1:H$3;C1)))

Formule en Feuil1!C1 :
Code:
=SOMMEPROD((Feuil2!A1:A5=A1)*(Feuil2!B1:B5=B1)*SIGNE(Feuil2!E1:E5);Feuil2!D1:D5)
Fichier .xlsx joint.

A+
 

Pièces jointes

  • Exemple(1).xlsx
    16.9 KB · Affichages: 7

eriiic

XLDnaute Barbatruc
Bonjour,
Salut job,
effectivement, un oubli de transformer UBound(data1) en UBound(data2) suite à un copié-collé :
VB:
Function ouTxt(libel As Range, crit As Range)
    Dim data1, data2, result() As Boolean
    Dim i As Long, j As Long
    data1 = libel.Value: data2 = crit.Value
    ReDim result(1 To UBound(data1), 1 To 1)
    For i = 1 To UBound(data1)
        For j = 1 To UBound(data2)
            If data1(i, 1) Like "*" & data2(j, 1) & "*" Then result(i, 1) = True: Exit For
        Next j
    Next i
    ouTxt = result
End Function


Marjo, tu as vu ce que tu as écrit ?
Code:
=SOMMEPROD(Feuil2!A:A=Feuil1!A1)*(Feuil2!B:B="111*")*(outxt(Feuil2!C:C;Feuil2!H:H))*(Feuil2!D:D)
- il manque la parenthèse globale du Sommeprod()
- tu fais sur des colonnes entières, totalement prohibé pour un sommeprod(). Fait une recherche sur les noms dynamique, ça pourra te servir.
- Feuil2!B:B="111*" donnera toujours faux

Code:
=SOMMEPROD((Feuil2!A1:A5=Feuil1!A1)*(GAUCHE(Feuil2!B1:B5;3)="111")*(outxt(Feuil2!C1:C5;Feuil2!H1:H3))*(Feuil2!D1:D5))
sera plus correct.
eric
 

Statistiques des forums

Discussions
312 184
Messages
2 086 007
Membres
103 088
dernier inscrit
Psodam