Somme sous condition sur toutes les feuilles d'un classeur

Bonjour je cherche, sans trouver, la bonne formule

pour faire une somme sous condition sur l'ensemble des feuilles d'un classeur.

Plus précisément je veux additionner le contenu des cellules D41 à D400

avec un test, par exemple "=toto", dans les cellules C41 à C400

pour l'ensemble des feuilles du classeur (du type A:Z!)

Merci de votre aide.

Bonjour,

Quels sont les noms de vos feuilles ? Par exemple, si vous en avez 26 qui s’appellent (précisément) A, B, C,…,Z, cette formule-ci matricielle vous donnera le résultat souhaité :

=SOMME(SOMME.SI(INDIRECT(CAR(65+LIGNE($1:$25)-1)&"!C41:C400");"toto";INDIRECT(CAR(65+LIGNE($1:$25)-1)&"!D41:D400")))

Cordialement

Merci pour cette réponse.

J'ai une centaine de feuilles avec des noms de feuilles différents ...

Et ces noms de feuilles ne sont pas similaires en aucune façon (par exemple, Feuil1, Feuil2, …, Feuil100 ou FeuilA, FeuilB,…, FeuilCV)?

Si non, la formule qui en fera la somme sera composée d'autant de parties qu'il y a de feuilles…

Cordialement

Non, je vais donc les renommer....


... mais comment les renommer de façon simple et changer la formule ?

Combien y en a-t-il ? 100 ? Quinze minutes à peu près ?

Si non, peut-être qu’il existe une méthode VBA pour les changer en masse, mais là, malheureusement, je ne pourrai pas vous aider.

Cordialement

Pour le moment il y en 87 mais ce n'est pas fixe ...

Je peux les appeler F1, F2,F3, ...

Alors:

=SOMME(SIERREUR(SOMME.SI(INDIRECT("F"&LIGNE($1:$100)&"!C41:C400");"toto";INDIRECT("F"&LIGNE($1:$100)&"!D41:D400"));0))

Modifiez la valeur 100 (en rouge) à un nombre suffisamment grand de sorte qu’il soit toujours supérieur au nombre de feuilles.

Cordialement

Le total obtenu n'est celui que de la feuille F1,

les autres feuilles ne sont pas prises en compte ...

Je vais répéter ma déclaration précédente si, par hasard, vous ne faisiez pas attention :

"...cette formule-ci matricielle vous donnera le résultat..."

Cordialement

Edit Amadéus: Cette formule matricielle est à valider avec les 3 touches Ctrl+Maj+Entrée

Cela fonctionne.

MERCI beaucoup pour votre aide très utile

Je vous en prie (et merci Amadéus pour la clarification sur les matricielles que j'ai omise! )

Oui, je n'avais pas compris sans cette précision !

Bonjour,

Voir fichier exemple à adapter en fonction de tes besoins

Option Explicit
Public Sub Somme_feuilles()
'Ctrl + w
Dim calcState As Integer
Dim eventsState As Boolean, screenUpdateState As Boolean, statusBarState As Boolean
Dim Ws As Worksheet
Dim c As Range
Dim Mondico
Dim t As Single

    t = Timer
    On Error GoTo gestion_erreur
    '------------------------------------------------------------------------------------
    screenUpdateState = Application.ScreenUpdating
    statusBarState = Application.DisplayStatusBar
    calcState = Application.Calculation
    eventsState = Application.EnableEvents
    '------------------------------------------------------------------------------------
    With Application
        .Calculation = xlCalculationManual
        .DisplayStatusBar = False
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    '------------------------------------------------------------------------------------
    Set Mondico = CreateObject("Scripting.Dictionary")
    For Each Ws In ActiveWorkbook.Worksheets
        For Each c In Ws.Range("A1:A10")
            If c = "toto" Then Mondico(c.Value) = Mondico(c.Value) + c.Offset(, 1).Value
        Next c
    Next Ws
    MsgBox Format(Timer - t, "0.000") & " seconde(s)"
    MsgBox "Total toto = " & Application.Sum(Mondico.items)
    '------------------------------------------------------------------------------------
     With Application
        .Calculation = calcState
        .DisplayStatusBar = statusBarState
        .EnableEvents = eventsState
        .ScreenUpdating = screenUpdateState
    End With

    Set Mondico = Nothing: Set Plage = Nothing

gestion_erreur:
    With Application
        .Calculation = calcState
        .EnableEvents = eventsState
    End With

End Sub

Encore une fois merci pour votre aide très précieuse.

J'ai une autre question ...

Qu'elle serait la formule pour cette fois non pas faire la somme

mais pour compter dans l'ensemble du classeur

"toto" dans les cellules C41 à C400 des feuilles F1 à F100 ?

Bonjour,

Tes souhaits sont exaucés

Option Explicit
Public Sub Somme_feuilles()
'Ctrl + w
Dim calcState As Integer, Cpt As Long
Dim eventsState As Boolean, screenUpdateState As Boolean, statusBarState As Boolean
Dim Ws1 As Worksheet, Ws2 As Worksheet
Dim c As Range
Dim Mondico
Dim t As Single

    t = Timer
    On Error GoTo gestion_erreur
    '------------------------------------------------------------------------------------
    screenUpdateState = Application.ScreenUpdating
    statusBarState = Application.DisplayStatusBar
    calcState = Application.Calculation
    eventsState = Application.EnableEvents
    '------------------------------------------------------------------------------------
    With Application
        .Calculation = xlCalculationManual
        .DisplayStatusBar = False
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    '------------------------------------------------------------------------------------
    Set Ws1 = Worksheets("Résultat")
    Set Mondico = CreateObject("Scripting.Dictionary")
    Cpt = 0
    For Each Ws2 In ActiveWorkbook.Worksheets
        If Ws2.Name <> Ws1.Name Then
            For Each c In Ws2.Range("A1:A10")
                If c = "toto" Then
                    ' on compte les toto
                    Cpt = Cpt + 1
                    ' on somme les toto
                    Mondico(c.Value) = Mondico(c.Value) + c.Offset(, 1).Value
                End If
            Next c
        End If
    Next Ws2

    With Ws1
        .[B2] = Cpt
        .[B3] = Application.Sum(Mondico.items)
    End With
    '------------------------------------------------------------------------------------
     With Application
        .Calculation = calcState
        .DisplayStatusBar = statusBarState
        .EnableEvents = eventsState
        .ScreenUpdating = screenUpdateState
    End With

    Set Ws1 = Nothing: Set Mondico = Nothing
    MsgBox Format(Timer - t, "0.000") & " seconde(s)"

gestion_erreur:
    With Application
        .Calculation = calcState
        .EnableEvents = eventsState
    End With

End Sub

Merci beaucoup la macro fonctionne parfaitement

Mais comment adapter la formule suivante

=SOMME(SIERREUR(SOMME.SI(INDIRECT("F"&LIGNE($1:$100)&"!C41:C400");"toto";INDIRECT("F"&LIGNE($1:$100)&"!D41:D400"));0))

qui fait le total des cases D41:D400 si "toto" se trouve en case C41:C400

pour avoir le nombre d'occurrences "toto" en case C1:C400 si la valeur correspondante en case D est >0 ?

Re-bonjour,

Encore forme matricielle (!):

=SOMME(SIERREUR(NB.SI.ENS(INDIRECT("F"&LIGNE($1:$100)&"!D41:D400");">0";INDIRECT("F"&LIGNE($1:$100)&"!C41:C400");"toto");0))

Cordialement

Merci beaucoup.

J'en apprend tous les jours ...

Re,

Soit 87 feuilles "mini", 400 lignes par feuille. On a un total "mini" de 34800 cellules.

Avec une formule matricielle, quel est le temps de re-calcul pour une modification?

Dans "mes" propositions, il y a un "timer" pour mesurer le temps de calcul de la procédure.

Est-il supérieur ou inférieur à la solution matricielle?

Seul le questionneur qui dispose d'un classeur de 87 feuilles "mini", de 400 lignes par feuille à traiter, etc... peut nous répondre

nb: si il n'est pas allergique au VBA

Rechercher des sujets similaires à "somme condition toutes feuilles classeur"