Microsoft 365 Trouver une somme en fonction d'une date

Itchythemouse

XLDnaute Nouveau
Bonjour,
J'ai une base de données qui fait plus de 1 000 lignes et 30 colonnes, ces colonnes indiquent le numéro de situ, la date, le % de facture et le solde.
Je dois synthétiser dans un autre tableau le total financier de la dernière situ par client et par détail, par exemple le client tata a une facture de 6€ pour les pêches achetées avant le 01/09/2016.
Je n'arrive à rien .... Est ce que quelqu'un peut m'aider
 

Pièces jointes

  • Classeur1.xlsx
    16 KB · Affichages: 10

excfl

XLDnaute Barbatruc
Bonjour le forum,

Proposition :

E29 :
=SOMMEPROD((A2:A25=D29)*(F2:F25<=C29)*(B2:B25="peche")*(H2:H25))+SOMMEPROD((A2:A25=D29)*(K2:K25<=C29)*(B2:B25="peche")*(M2:M25))+SOMMEPROD((A2:A25=D29)*(Q2:Q25<=C29)*(B2:B25="peche")*(S2:S25))

Bonjour job75
 

Itchythemouse

XLDnaute Nouveau
Bonjour le forum,

Proposition :

E29 :
=SOMMEPROD((A2:A25=D29)*(F2:F25<=C29)*(B2:B25="peche")*(H2:H25))+SOMMEPROD((A2:A25=D29)*(K2:K25<=C29)*(B2:B25="peche")*(M2:M25))+SOMMEPROD((A2:A25=D29)*(Q2:Q25<=C29)*(B2:B25="peche")*(S2:S25))

Bonjour job75

Super ça marche merci de votre retour, mais comme je suis un peu pénible j'ai plus de 30 colonnes sur 1000 lignes est ce qu'il n'y a pas une formule "plus simple" ?
 

job75

XLDnaute Barbatruc
Je ne comprends toujours pas !

1) Vous dites que la formule de excfl convient alors qu'elle fait la somme de 3 SOMMEPROD portant sur les colonnes L M S qui sont elles-mêmes des totaux cumulés. Testez-la avec le mot "POIRE", elle donne 13,50 € alors que le résultat doit être 7,50 €.

2) Dans votre fichier du post #4 Feuil2 vous indiquez le mois "AVRIL" alors qu'auparavant il s'agissait de la date d'observation 01/09/2016.

3) Votre tableau de résultats n'a qu'une ligne : faut-il lister tous les DETAILS du client "TATA" ?
 

Itchythemouse

XLDnaute Nouveau
Je ne comprends toujours pas !

1) Vous dites que la formule de excfl convient alors qu'elle fait la somme de 3 SOMMEPROD portant sur les colonnes L M S qui sont elles-mêmes des totaux cumulés. Testez-la avec le mot "POIRE", elle donne 13,50 € alors que le résultat doit être 7,50 €.

2) Dans votre fichier du post #4 Feuil2 vous indiquez le mois "AVRIL" alors qu'auparavant il s'agissait de la date d'observation 01/09/2016.

3) Votre tableau de résultats n'a qu'une ligne : faut-il lister tous les DETAILS du client "TATA" ?



Je l'ai testé à mon tour sur poire et je trouve bien le total des situ pour n'importe quel client et n'importe quel détails je vous joins le tableau
 

Pièces jointes

  • Classeur2.xlsx
    16.3 KB · Affichages: 5

chris

XLDnaute Barbatruc
Bonjour à tous

Si les 30 colonnes correspondent à des groupes de situations, cela va faire beaucoup de SOMMEPROD à additionner

Il est possible de normaliser le tableau par une requête PowerQuery, intégré à Excel, puis d'extraire ce qui correspond aux choix.

Comme job75 je m'interroge sur le résultat unique ou la demande initiale "Je dois synthétiser dans un autre tableau le total financier de la dernière situ par client et par détail"

Tu parlais de dernière situ et pas d'un choix de date et "par client et par détail" et non selon des choix...
 

job75

XLDnaute Barbatruc
Bonjour Itchythemouse, excfl, chris,

Une solution VBA dans le fichier joint avec ces macros dans le code de la 2ème feuille (clic droit sur l'onglet et Visualiser le code) :
VB:
Private Sub Worksheet_Activate()
Worksheet_Change [A1] 'lance la macro
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim dat, client$, ncol%, tablo, resu(), i&, n&, datmax&, j%, x As Variant
dat = [B1]: client = [B2] 'à adapter
If IsDate(dat) And client <> "" Then
    With Sheets("BDD").[A1].CurrentRegion 'à adapter
        ncol = .Columns.Count
        If ncol = 1 Then ncol = 2
        tablo = .Resize(, ncol) 'matrice, plus rapide, au moins 2 éléments
    End With
    ReDim resu(1 To UBound(tablo), 1 To 2)
    For i = 1 To UBound(tablo)
        If tablo(i, 1) = client And tablo(i, 2) <> "" Then
            n = n + 1
            resu(n, 1) = tablo(i, 2)
            datmax = 0
            For j = 2 To ncol
                x = tablo(i, j)
                If IsDate(x) Then If x <= dat Then If x > datmax Then datmax = x: resu(n, 2) = tablo(i, j + 2) 'décalage de 2 colonnes
            Next
        End If
    Next i
End If
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A5] '1ère cellule, à adapter
    Application.EnableEvents = False 'désactive les évènements
    If n Then
        .Resize(n, 2) = resu
        .Resize(n, 2).Interior.ColorIndex = 19 'jaune clair
        .Resize(n, 2).Borders.Weight = xlHairline 'bordures
        .EntireColumn.AutoFit 'ajustement largeur
    End If
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 2).Delete xlUp
    Application.EnableEvents = True 'réactive les évènements
End With
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Les macros se déclenchent quand on active la feuille ou quand on modifie une cellule quelconque.

Edit : pour tester j'ai recopié le tableau source sur 50 000 lignes, la durée d'exécution de la macro est de 1,1 (TOTO) à 1,4 (BIBI) seconde.

A+
 

Pièces jointes

  • Classeur VBA(1).xlsm
    33.6 KB · Affichages: 6
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16