Problème de critère date dans fonction SUMIFS

Bonjour au forum,

j'ai besoin de votre aide concernant un problème sur la fonction somme ifs en vba.

J'ai dans une colonne A des nombres et en colonne B des dates chronologiques (du bas vers le haut) et j'aimerai calculer la somme des nombres de la colonne A selon mon critère date. ( calcul des sommes qui sont supérieure a cette date)

voici mon exemple qui ne marche pas avec les caractères "<" ">"

somme = WorksheetFunction.SumIfs(Range("A:A"), Range("B:B"), ">10/08/2018" )

J'ai essayé plusieurs fois, voir énormément de combinaisons sans pour autant que ce soit concluant.

Merci de m'éclairer, je vous remercie.

Fakerr.

Bonjour au forum,

j'ai besoin de votre aide concernant un problème sur la fonction somme ifs en vba.

J'ai dans une colonne A des nombres et en colonne B des dates chronologiques (du bas vers le haut) et j'aimerai calculer la somme des nombres de la colonne A selon mon critère date. ( calcul des sommes qui sont supérieure a cette date)

voici mon exemple qui ne marche pas avec les caractères "<" ">"

somme = WorksheetFunction.SumIfs(Range("A:A"), Range("B:B"), ">10/08/2018" )

J'ai essayé plusieurs fois, voir énormément de combinaisons sans pour autant que ce soit concluant.

Merci de m'éclairer, je vous remercie.

Fakerr.

Bonjour,

Pour VBA comme pour Excel, l'utilisation des guillemets est réservé à du texte, que le logiciel n'interprète donc pas. En clair, "10/08/2018", c'est du texte. Les dates sous cette forme ne sont qu'un format d'une valeur qui est en réalité un nombre de jours. C'est à dire que pour Excel, 10/08/2018 correspond à 43 222 jours.

Pour que la formule fonctionne, tu peux donc utiliser ce nombre, ou convertir le texte "10/08/2018" en date grâce à CDate(DateEnTexte)

Bonjour Pedro, et merci de ta réponse.

Le problème c'est que la formule marche mais ne me renvoie pas la bonne valeur :

somme = WorksheetFunction.SumIfs(Range("A:A"), Range("B:B"), "<CDATE(24/10/2018")

Bonjour Pedro, et merci de ta réponse.

Le problème c'est que la formule marche mais ne me renvoie pas la bonne valeur :

somme = WorksheetFunction.SumIfs(Range("A:A"), Range("B:B"), "<CDATE(24/10/2018")

Ta syntaxe est incorrecte, voilà donc une correction :

somme = WorksheetFunction.SumIf(Range("A:A"), Range("B:B"), "<"&CDate("24/10/2018"))

En rentrant la correction, excel me dit erreur d'exécution 13 : incompatibilité de type

mes dates en colonne B sont bien en date, le format n'est peut être pas le bon ?

En rentrant la correction, excel me dit erreur d'exécution 13 : incompatibilité de type

mes dates en colonne B sont bien en date, le format n'est peut être pas le bon ?

Comme tu n'avais qu'une condition, j'ai remplacé ta fonction SumIfs par SumIf, ce qui revient à remplacer SOMME.SI.ENS par SOMME.SI, sauf que l'ordre des arguments n'est pas identique sur les 2 fonctions.

Tu peux utiliser les 2 mais il faut adapter la position des arguments dans la fonction.

Le résultat que me retourne "somme" n'est pas bon.

je recherche les sommes de la colonne A dont les sont supérieures à mon critères.

somme(colonne A) < 24/10/2108 ou > 24/10/2018

Je joints le un fichier, je pense que ce sera beaucoup plus explicite.

19fakerr.xlsx (9.41 Ko)

J'ai besoin de la fonction "sommeifs" car j'ai plusieurs autres critères après celui de la date, mais je bloque avec cet argument date qui m'empêche d'avancer.

Merci

J'ai bien compris ton problème initial, mais je ne vois aucune formule ni macro dans ton fichier pour voir ce qui te pose maintenant problème. Aussi, je pense que mon premier message répond à ta problématique initiale, c'est à dire comprendre pourquoi ta première formule ne renvoie pas le résultat attendu.

Aussi, les conditions imbriquées dans une même fonction SOMME.SI.ENS ne sont pas testées indépendamment les unes des autres (pas comme "OU"). Le calcul fonctionne uniquement sur les lignes dont les conditions sont toutes vérifiées (comme un "ET").

En clair, si tu cherches les dates différentes du 24/10/2018, tu peux écrires :

=SOMME.SI(B:B;"<>"&DATEVAL("24/10/2018");A:A) =SOMME.SI.ENS(A:A;B:B;"<>"&DATEVAL("24/10/2018")) =SOMME(A:A)-SOMME.SI.ENS(A:A;B:B;DATEVAL("24/10/2018"))

Mais pas :

=SOMME.SI.ENS(A:A;B:B;">"&DATEVAL("24/10/2018");B:B;"<"&DATEVAL("24/10/2018"))

Puisqu'une date ne peut à la fois être inférieure et supérieure en même temps à une autre date

j'ai joint le fichier pour vous montrer ce que je recherche exactement.

je ne trouve pas les mêmes résultats avec un=somme sans critères mais qui correspond a la plage qui comprend le critère de la date et le résultat somme en vba avec sommeifs avec le critères de date "<" et ">".

25fakerr.xlsm (15.68 Ko)

j'ai joint le fichier pour vous montrer ce que je recherche exactement.

je ne trouve pas les mêmes résultats avec un=somme sans critères mais qui correspond a la plage qui comprend le critère de la date et le résultat somme en vba avec sommeifs avec le critères de date "<" et ">".

Bonjour,

Pour comprendre l'origine du problème, il aurait été plus judicieux de comparer des formules comparables... Sous Excel, ta somme est faite manuellement, donc sans référence directe à la plage de dates. En testant directement sur le tableau une formule SOMME.SI, tu aurais aussi obtenu un autre résultat que celui attendu. En effet, dans ta plage, seules 2 dates sont au format DATE, les autres ne sont pas reconnues.

1ère étape :

Ajouter une colonne avec la formule =DATEVAL(B2) à étendre jusqu'à la dernière ligne, puis coller en valeur le résultat obtenu. Un passage de la colonne date au format NOMBRE doit te permettre de repérer immédiatement si la date est bien reconnue.

2ème étape :

Bien que je ne saisisse pas bien l'utilité de VBA pour ton problème, j'ai remarqué que l'utilisation de CDate() dans la formule ne fonctionnait pas. Il y a alors plusieurs possibilités, par exemple :

En déclarant une variable contenant la date, au format numérique (Long = gros nombre entier) :

Dim MaDate As Long
MaDate = CDate("24/10/2018")
Range("E7") = Application.SumIfs(Range("A:A"), Range("B:B"), "<" & MaDate)

Ou de faire référence directement à une cellule contenant la date en question :

Range("E7") = Application.SumIfs(Range("A:A"), Range("B:B"), "<" & Range("C2"))

Bonjour Pedro,

Je me suis aussi rendu compte que le problème était le format de ma colonne B il y'avait un mélange de format date et texte et forcément toutes les valeurs étaient pas prises en comptes.

Cependant je ne peux pas rajouter de colonne à coté parce que cette colonne fait en réalité partie d'un ensemble d'autres colonnes ( c'est qu'une partie du fichier).

L'utilité de vba est que ma macro travaille sur 29 autres classeurs comme celui ci avec des colonnes semblables.

J'ai donc rajouté cette partie (avec l'enregistreur de macro) : données convertir les données :

Dim madate As Long

madate = CDate("21/11/2018")

Columns("B:B").Select

Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _

TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _

Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _

:=Array(1, 4), TrailingMinusNumbers:=True

MsgBox WorksheetFunction.SumIfs(Range("A:A"), Range("B:B"), "<=" & madate)

Je ne sais pas s'il y'a des choses à épurer dans le textocolumns. ?

Merci de ton aide, ça m'a beaucoup aider !!

J'attends ta réponse et je valide le post [v]

Bonjour,

L'enregistreur peut-être utile pour t'aider sur la syntaxe d'instructions inconnues ou particulières, mais prends l'habitude de ne jamais utiliser le code brut. En effet, l'enregistreur reproduit "bêtement" et exactement tes actions en temps qu'utilisateur (y compris actions indésirables ou inutiles, tel que l'utilisation de la barre de défilement, ou le fait de "Sélectionner" les cellules, comme on le fait sur Excel).

Par exemple, dans TextToColumns, il te mets toutes une panoplie d'options qui te sont parfaitement inutiles. En utilisant l'aide (F1) ou le site de MSDN, tu pourras voir quelles sont les valeurs par défaut, et supprimer celles qui ne changent pas dans ton cas (le code gagnera en clareté).

Aussi, ton code sera plus allégé et rapide d'exécution en supprimant les instructions "Select" :

Columns("B:B").TextToColumns Destination:=Range("B1"),Tab:=True

Concernant les plages, si ta macro est amené à travailler sur plusieurs feuilles ou classeurs, il serait judicieux de préciser la référence de chaque plage :

Sheets("Feuil1").Activate
Range("A1") .Select
Selection.Instruction
Sheets("Feuil2").Activate
Range("A1") .Select
Selection.Instruction

devient :

Sheets("Feuil1").Range("A1") .Instruction
Sheets("Feuil2").Range("A1") .Instruction
Rechercher des sujets similaires à "probleme critere date fonction sumifs"