Somme vers un autre fichier si la date est inférieur à une semaine

Bonjour,

Je suis entrain de faire un fichier excel et je bloque un peu, je viens donc demander votre aide :)

La première est d'ouvrir un autre fichier et de faire la somme des cellules présentes en colonne G, si la date est affichées en colonne A est inférieure à 7 jours ( 1 semaine ).

Cette somme se trouverait ainsi affichée dans la cellule F4 de mon fichier

Pour information, la date affichée en colonne A est du type : JJ/MM/AAAA

Merci d'avoir prit le temps de me lire, Nathan

Bonjour,

Un code générique à adapter :

Sub SommeSemaine()

Workbooks.Open Filename:="C:\Users\Machin\Classeur1.xlsx" 'Ouvre fichier 2
With ActiveWorkbook.Sheets(1)
    ThisWorkbook.Sheets(1).Range("F4") = Application.SumIfs(.Range("G:G"),.Range("A:A"),">"&Date-7,.Range("A:A"),"<="&Date) 'Somme sur 7 derniers jours
End With
ActiveWorkbook.Close 'Ferme fichier 2

End Sub

Merci pour votre réponse,

le vba fonctionne mais affiche 0

Je suppose qu'il ne comprends pas correctement la date.

Je vais tâcher de me dépatouiller avec !

Je comprends que la demande soit flou, mais je ne peux pas joindre les fichiers pour raison de confidentialité...

Je vous remercie pour le temps accordé, Nathan

le vba fonctionne mais affiche 0

Les dates en colonne A et nombres en colonne G doivent être valides (c.à.d correctement reconnus par Excel)

Je comprends, ce n'est pas le cas, la date est affiché grâce à =SI ..... et les valeurs aussi

Peux tu fournir ce fichier, en retirant/anonymisant tout ce qui doit l'être ?

Malheureusement non, les valeurs et données ne peuvent pas sortir de l'entreprise :/ ..

Les données dont je veux faire la somme sont-elles même copier d'un autre fichier dont je n'avais la connaissance. Je vais donc plutôt utiliser celui de référence !

Sur celui-ci, les valeurs dont il faut faire la somme sont en colonne Z, et le jour / Mois / Année sont respectivement en colonne AB / AC / AD

Ce sera certainement plus simple à coder en vba, je vais essayer :)

Ok, dans ce cas le plus pertinent à mon avis est de balayer une première fois les données pour créer une colonne de date valide à partir des 3 champs (jour, mois et année), puis ensuite d'adapter le code précédent pour le calcul final. Il suffit ensuite de préciser False dans l'instruction de fermeture du fichier pour ne pas enregistrer la modification effectuée pour le calcul de la date.

Exemple :

Sub SommeSemaine()

Workbooks.Open Filename:="C:\Users\Machin\Classeur1.xlsx" 'Ouvre fichier 2
With ActiveWorkbook.Sheets(1)
    For Lig = 2 To .Range("AB" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes
        .Range("A" & Lig) = DateSerial(.Range("AD" & Lig), .Range("AC" & Lig), .Range("AB" & Lig)) 'calcul de la date
    Next Lig
    ThisWorkbook.Sheets(1).Range("F4") = Application.SumIfs(.Range("Z:Z"),.Range("A:A"),">"&Date-7,.Range("A:A"),"<="&Date) 'Somme sur 7 derniers jours
End With
ActiveWorkbook.Close False 'Ferme fichier 2 sans sauvegarder

End Sub

Attention, le calcul de la date réalisé ici repose sur des valeurs numériques en colonnes AB, AC et AD (ex : 27 | 4 | 2022 pour la date d'aujourd'hui)

Le calcul de la date se mets en erreur,

les colonnes sur lesquels les valeurs des dates se trouvent sont verrouillés, je pense que le problème vient de la.

Merci pour le temps accordé, c'est très gentil de votre part !

Je crains qu'en l'absence de fichier je ne puisse pas en faire davantage, en espérant que ça vous aura déjà aidé !

J'ai compris la raison de l'erreur du code,

la boucle se met en erreur sur une ligne de la recherche de la date la plus récente car cette ligne est en #VALEUR

Je vais essayer de faire une ligne pour sauter ce défaut

Une possibilité :

Sub SommeSemaine()

Workbooks.Open Filename:="C:\Users\Machin\Classeur1.xlsx" 'Ouvre fichier 2
With ActiveWorkbook.Sheets(1)
    For Lig = 2 To .Range("AB" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes
        If IsNumeric(.Range("AD" & Lig)) Then .Range("A" & Lig) = DateSerial(.Range("AD" & Lig), .Range("AC" & Lig), .Range("AB" & Lig)) 'calcul de la date
    Next Lig
    ThisWorkbook.Sheets(1).Range("F4") = Application.SumIfs(.Range("Z:Z"),.Range("A:A"),">"&Date-7,.Range("A:A"),"<="&Date) 'Somme sur 7 derniers jours
End With
ActiveWorkbook.Close False 'Ferme fichier 2 sans sauvegarder

End Sub

Après réflexion, la boucle for ne me sert pas à grand chose si j'utilise la date actuelle.

Il faut juste que je modifie cette ligne :

ThisWorkbook.Sheets("AZERTY").Range("F4") = Application.SumIfs(.Range("Z:Z"), .Range("A:A"), ">" & Date - 7, .Range("A:A"), "<=" & Date) 'Somme sur 7 derniers jours

Puisque la date ne se trouve plus sur la colonne A mais sur les colonnes AB, AC et AD sur le fichier d'origine

En utilisant la date actuelle et en lui retirant 7 jours à celles affichées dans les colonnes, je devrais pouvoir faire la somme facilement,

pensez vous que cela soit une solution viable ?

Oui mais la date est sur 3 colonnes, comment vous gérer le calcul ?

L'objectif de la boucle de créer une date unique et valide avec 3 infos séparées : le jour, le mois et l'année. On ne parle pas de format d'affichage, on est bien d'accord ? Le contenu de chacune des 3 colonnes n'est pas une date valide avec une format d'affichage spécifique, mais juste un nombre ?

Oui, mais la banque de données fait plus de 20 000 lignes,

La boucle for mets énormément de temps à s’exécuter.

Je pense que je vais chercher l'essentiel en codant pour qu'il fasse la somme de toutes les cellules du jour précédent ( J-1 au lieu de J-7 ),

Cela sera plus adapté à mon niveau en VBA :)

Merci pour votre aide !

Pour gagner en temps d'exécution :

Sub SommeSemaine()

Application.ScreenUpdating = False : Application.Calculation = xlCalculationManual
Workbooks.Open Filename:="C:\Users\Machin\Classeur1.xlsx" 'Ouvre fichier 2
With ActiveWorkbook.Sheets(1)
    For Lig = 2 To .Range("AB" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes
        If IsNumeric(.Range("AD" & Lig)) Then .Range("A" & Lig) = DateSerial(.Range("AD" & Lig), .Range("AC" & Lig), .Range("AB" & Lig)) 'calcul de la date
    Next Lig
    ThisWorkbook.Sheets(1).Range("F4") = Application.SumIfs(.Range("Z:Z"),.Range("A:A"),">"&Date-7,.Range("A:A"),"<="&Date) 'Somme sur 7 derniers jours
End With
ActiveWorkbook.Close False 'Ferme fichier 2 sans sauvegarder
Application.Calculation = xlCalculationAutomatic

End Sub

Votre code marche mais j'ai toujours un 0 comme résultat, les cellules dont je souhaite faire la somme sont elles aussi des sommes, je pense que cela peut être la cause, j'ai essayé de rajouter un .Value, mais au lieu de 0 en F4 j'ai #Valeur

Dans la banque de donnée, les lignes non complétés ( qui vont se compléter au fur et a mesure des jours, mois et années ), les cellules ne sont pas vierges, elles affichent : 0/01/1900

Je pense que cela trompe la boucle for qui les comptabilise. J'aurais bien aimé inhiber cette valeur dans la boucle for, le soucis étant que cette valeur apparait parfois dans des lignes de la banque de données.

Par exemple, des personnes ont complété hier la banque mais n'ont pas rempli la case jour mois et année, ce qui fait qu'elle reste vierge et par défaut à cette valeur la 0/01/1900.

Tout cela est relativement compliqué à expliquer, je ne vais pas m'en sortir ... :'(

Ces dates ne posent pas de problème, puisqu'elles ne correspondent pas ensuite dans le calcul à la semaine passée. Donc le problème ne vient pas de là.

A quoi sert le Range("A:A") ? Cela signifie la colonne A mais je ne comprends pas son utilité ?

Rechercher des sujets similaires à "somme fichier date inferieur semaine"