Faire un SOMME.SI.ENS sur un enssemble de feuilles (3D)

Désolé du retard j'ai eu une journée de fou

J'ai pu appliquer la methode de Theze et .... ça marche du tonnerre. Merci beaucoup c'est parfait !!!

mais genre PARFAIT !!!

Merci merci merci merci merci !!!!!

Vous etes les meilleurs!

Et une mention spéciale pour Theze

Bonjour,

Merci et content de t'avoir aidé

Re

Toujours sur le même sujet, j'ajoute des fonctions supplémentaires du même type et donc je joue a l’apprenti sorcier avec le code que Theze a donné lol

Mais j'y arrive pas

Je voulais simplement faire une deuxième macro mais changer la colonne qu'on somme. Au lieu de sommer les quantités d'un produit a travers mon classeur je veux sommer la valeur dans la colonne total donc ça revient a changer juste un terme a la formule...

(la colonne ou sont mes quantités D deviendrais ma collonne ou sont mes prix TTC E)

J'ai réussi a créer une nouvelle macro, j'ai collé le code donné plus haut et j'ai changé le nom SOMMEPRODUITS en SOMMEPRODUITSR ... (déja j'espere que j'ai pas fait de bétise ) et je cherche a dire a la macro de prendre la colonne E et pas la D mais je ne trouve pas ou c'est dans le code ...

Voici le code que j'ai a l'écran :

Function SOMMEPRODUITSR(Produit As String) As Long

End Function

    Dim FE As Worksheet
    Dim Plage As Range
    Dim Cel As Range
    Dim Total As Long

    Application.Volatile

    For Each FE In Worksheets

        Select Case FE.Name
            Case "Tableau recapitulatif", "BDC_Type", "Clients Forever", "Produits par prix"

            Case Else
                With FE: Set Plage = .Range(.Cells(21, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

                For Each Cel In Plage
                    If Cel.Value = Produit Then Total = Total + Cel.Offset(, 2).Value
                Next Cel

        End Select

    Next FE

    SOMMEPRODUITSR = Total

Que dois je faire svp?

Bonjour,

Il te faut juste décaler de colonne, c'est à dire de remplacer 2 par 3 à la ligne de code :

If Cel.Value = Produit Then Total = Total + Cel.Offset(, 3).Value

Le code complet :

Function SOMMEPRODUITSR(Produit As String) As Long

    Dim FE As Worksheet
    Dim Plage As Range
    Dim Cel As Range
    Dim Total As Long

    Application.Volatile

    For Each FE In Worksheets

        Select Case FE.Name
            Case "Tableau recapitulatif", "BDC_Type", "Clients Forever", "Produits par prix"

            Case Else
                With FE: Set Plage = .Range(.Cells(21, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

                For Each Cel In Plage '                                      | ici passer de 2 à 3 pour le décalage !
                    If Cel.Value = Produit Then Total = Total + Cel.Offset(, 3).Value
                Next Cel

        End Select

    Next FE

    SOMMEPRODUITSR = Total

End Function

que tu utilises de la même façon :

=SOMMEPRODUITSR(__xlnm._FilterDatabase[[#Cette ligne];[Nom]])

Maintenant, si tu dois utiliser cette fonction sur plusieurs colonnes, il serait préférable d'ajouter un argument à cette dernière afin de n'avoir qu'une seule fonction pour tout !

Merci Theze

ça marche !

par contre il ne me met que des valeurs entières, je n'ai pas les chiffres après la virgule c'est normal?

Je ne veux pas semer la zizanie, mais au bout de 3 pages, j'ai tendance à croire davantage aux solutions sans macro (cf djidji ou tulipe sur laquelle j'avais rebondi)

Spoiler
rebond

Bonjour,

La proposition de Chris n'a pas été retenue, mais il semble bien qu'elle répondait parfaitement à la question posée.

Cdlt.

Si si j'ai regardé sa proposition, mais celle de Theze etait plus sexy

La solution avec la macro correspond parfaitement a ce que je cherchais. Avec ça, pas besoin de tableau supplementaire ou de mise a jour ou autre manip. La j'ai relancé le sujet juste parceque je connais pas du tout la programation et que du coup pour appliquer sa solution a une autre colonne j'avais besoin d'un petit coup de pouce

Voici le code modifié :

Function SOMMEPRODUITSR(Produit As String) As Double

    Dim FE As Worksheet
    Dim Plage As Range
    Dim Cel As Range
    Dim Total As Double

    Application.Volatile

    For Each FE In Worksheets

        Select Case FE.Name
            Case "Tableau recapitulatif", "BDC_Type", "Clients Forever", "Produits par prix"

            Case Else
                With FE: Set Plage = .Range(.Cells(21, 2), .Cells(.Rows.Count, 2).End(xlUp)): End With

                For Each Cel In Plage '                                      | ici passer de 2 à 3 pour le décalage !
                    If Cel.Value = Produit Then Total = Total + Cel.Offset(, 3).Value
                Next Cel

        End Select

    Next FE

    SOMMEPRODUITSR = Total

End Function

Humm... la valeur renvoyé est toujours un entier.

alors que je devrais avoir 12,6 ça me donne le résultat 13

Est ce que dans le programme il y a une fonction "entier"??

ou est ce qu'on a pas le choix et c'est comme ça?

Bonjour,

Ton fichier original avec la fonction "" qui retourne bien des valeurs avec décimales "SOMMEPRODUITSR()" :

8fichier-test.xlsm (49.54 Ko)

Salut

Oui c'est exactement ce que je veux faire

merci

Mais quand je compare les lignes du programmes avant et apres je vois pas de différence, elle est ou l'option pour avoir les décimales?

Parceque j'ai beaucoup travaillé sur mon fichier et il est bien plus complexe maintenant que le fichier test que j'avais envoyé au début. Donc j'aimerais pouvoir appliquer ta solution sans devoir refaire un fichier a partir du fichier test que tu m'as renvoyé

... et aussi parceque j'ai tres envie de comprendre

Bonjour,

La différence entre le code qui ne retourne pas les valeurs avec décimales et celui qui les retourne est indiquée ci-dessous :

Le typage pour le code sans décimale :

Function SOMMEPRODUITSR(Produit As String) As Long
'...
'...
Dim Total As Long

et le qui permet de retourner les valeurs décimales :

Function SOMMEPRODUITSR(Produit As String) As Double
'...
'...
Dim Total As Double

la modification du typage est de passer de type Long à type Double

Bonjour,

Super, ça marche nickel Merci

Un grand merci pour ton aide et ta patience

Heureux d'avoir pu t'aider

Rechercher des sujets similaires à "somme ens enssemble feuilles"