Autres Problème Sumifs Vba avec Dates

Calvus

XLDnaute Barbatruc
Bonsoir le forum,

Tout est dit dans le titre.

Après plusieurs essais, le code "passe" finalement, mais j'obtiens inlassablement 0.

Ce qui pose problème est cette partie, dont j'ai essayé plusieurs conversions mais sans succès..
VB:
CDate(Right(t(j, 1), 4)) = madate

Et en particulier le " ="


Si je remplace le critère date par un autre, recherche sur un client par exemple, ça fonctionne.

Voici le code dans son entier.

Code:
Option Explicit
Sub Somme()
Dim derligdonnees%, t, tdep, a(), f As Worksheet, i%, n%, j%
Set f = Sheets("Feuil1")
derligdonnees = f.Range("B" & Rows.Count).End(xlUp).Row
t = f.Range("B3:H" & f.Range("B" & Rows.Count).End(xlUp).Row)
tdep = f.Range("O3:O" & f.Range("O" & Rows.Count).End(xlUp).Row)
Dim madate
madate = 2016

ReDim a(1 To UBound(tdep), 1 To 1)
n = 1
For i = 1 To UBound(tdep)
    For j = 1 To UBound(tdep)
        If t(i, 5) = tdep(j, 1) Then
            a(n, 1) = Round(WorksheetFunction.SumIfs(f.Range("h1:h" & derligdonnees), f.Range("f1:f" & derligdonnees), tdep(j, 1), f.Range("B1:B" & derligdonnees), CDate(Right(t(j, 1), 4)) = madate), 2)
            n = n + 1
        End If
    Next j
Next i
End Sub

Avez vous une idée ?

Merci
 

Pièces jointes

  • Probleme Sumifs Dates.xlsm
    24.4 KB · Affichages: 8

ChTi160

XLDnaute Barbatruc
Bonjour Calvus
une approche(il y en a surement d'autres (SumProduct etc etc)
VB:
Option Explicit
Sub SommeDpt()
Dim derligdonnees%, t, tdep, a(), f As Worksheet, i%, n%, j%
Dim PgeCA As Range, PgeDpt As Range, PgeP As Range
Dim madateFirst As Long, madateLast As Long
Dim SumP As Double
Dim YearDate As Integer
YearDate = 2016 'On initialise la Variable
             n = 0  'On initialise la Variable
        Set f = Sheets("Feuil1") 'On initialise la Variable
derligdonnees = f.Range("B" & Rows.Count).End(xlUp).Row 'On initialise la Variable
            t = f.Range("B3:H" & f.Range("B" & Rows.Count).End(xlUp).Row)
         tdep = f.Range("O3:O" & f.Range("O" & Rows.Count).End(xlUp).Row)
  madateFirst = DateSerial(YearDate, 1, 1) 'On définit la date de début de l’intervalle
   madateLast = DateSerial(YearDate, 12, 31) 'On définit la date de fin de l’intervalle
    Set PgeCA = f.Range("h1:h" & derligdonnees) 'plage a Sommer
   Set PgeDpt = f.Range("f1:f" & derligdonnees) 'première plage a évaluer
       Set PgeP = f.Range("B1:B" & derligdonnees) 'deuxième plage a évaluer
For i = 1 To UBound(tdep) 'por chaque ligne du tableau des départements
  'On va arrondir la Somme trouvée
            SumP = Round(WorksheetFunction.SumIfs(PgeCA, PgeDpt, tdep(i, 1), _
                                                                               PgeP, ">=" & madateFirst, PgeP, "<=" & madateLast), 2)
   If SumP > 0 Then 'Somme non Nulle
                   n = n + 1 'On incrémente
   ReDim Preserve a(1 To 2, 1 To n) 'On redimensionne le tableau
           a(1, n) = SumP       'On récupère la Somme
           a(2, n) = tdep(i, 1) 'Ici le Département
   End If
Next i
'Pour test On transpose le tableau
Worksheets("Feuil2").Range("A1").Resize(UBound(a, 2), UBound(a, 1)) = Application.Transpose(a)
End Sub
On peut Aussi mettre
VB:
SumP = Round(Application.Evaluate(WorksheetFunction.SumIfs(PgeCA, PgeDpt, tdep(i, 1),  _
                                                                               PgeP, ">=" & madateFirst, PgeP, "<=" & madateLast)), 2)
jeanmarie
 

Calvus

XLDnaute Barbatruc
Bonjour ChTi160,

Merci de ta réponse.
Je vais étudier ta proposition qui fonctionne très bien.

En attendant, comme je n'avais pas de réponse, j'ai procédé différemment, en insérant une colonne supplémentaire pour ne faire figurer que les années, dont la formule est : =ANNEE(B3).

J'ai besoin d'isoler plusieurs années, je vais donc voir comment adapter ton code qui a l'avantage de ne pas ajouter de colonne supplémentaire.

Je mets ici tout de même la solution que j'ai trouvée de mon coté.

VB:
Sub SomTemp()
Dim gab, derligdonnees%, t, tdep, a(), f As Worksheet, i%, n%, j%, p%
Set f = Sheets("Données")
derligdonnees = f.Range("B" & Rows.Count).End(xlUp).Row
t = f.Range("B3:H" & f.Range("B" & Rows.Count).End(xlUp).Row)
tdep = f.Range("O3:O" & f.Range("O" & Rows.Count).End(xlUp).Row)
Dim madate As String, madate2 As String, NbAns As Single
madate = 2016
madate2 = Sheets("France").Range("C1")
NbAns = madate2 - madate + 1 'Nombre d'années totales


ReDim a(1 To UBound(t), 1 To 3)
n = 1
For p = 1 To NbAns
For i = 1 To UBound(tdep)
    For j = 1 To UBound(t)
        If tdep(i, 1) = t(j, 5) Then
'            a(n, 1) = Round(WorksheetFunction.SumIf(f.Range("F1:F" & derligdonnees), tdep(j, 1), f.Range("H1:H" & derligdonnees)), 2)
            If Right(t(j, 1), 4) = madate Then
            If a(p, 1) = "" Then a(p, 1) = 1: a(n, 1) = Right(t(j, 1), 4)
            a(n, 2) = tdep(i, 1)
            a(n, 3) = Round(WorksheetFunction.SumIfs(f.Range("h1:h" & derligdonnees), f.Range("f1:f" & derligdonnees), tdep(i, 1), f.Range("v1:v" & derligdonnees), Right(t(j, 1), 4)), 2)
                n = n + 1
                Exit For
            End If
        End If
    Next j
Next i

madate = madate + 1
Next p
For i = 1 To UBound(a)
    If a(i, 1) = 1 Then a(i, 1) = ""
Next i
f.Range("O30").Resize(n - 1, 3) = a
End Sub

Merci beaucoup et bonne journée.
 

ChTi160

XLDnaute Barbatruc
Bonjour ,
vgendron ,le Forum
Donc plus besoin de CDate (xxx) dans
VB:
madate=CDate(Right(t(j, 1), 4))
puisque Right(t(j, 1), 4) donne l'année ?
ou mettre
VB:
Year(CDate(t(j, 1)))
mais bon dans la procédure ça ne donne rien Lol
jean marie
 
Dernière édition:

Calvus

XLDnaute Barbatruc
Re,

Je précise à nouveau que mon second code fonctionne très bien !!
Il n'est donc pas absolument nécessaire que vous répondiez.

Ceci étant, si c'est pour le plaisir d'offrir d'autres solutions, :) :

Ok
il faudrait que tu nous dises comment tu compte définir les dates(Années)
un petit fichier Exemple ????
jean marie

C'est indiqué dans le code, et madate2 est sur une autre feuille avec cette formule : =ANNEE(AUJOURDHUI()) et renvoie donc 2019
(madate2 = Sheets("France").Range("C1") dans le code)


et si tu essayais..
madate=CDate(Right(t(j, 1), 4))

J'ai essayé ainsi que CLng(Right(t(j, 1), 4)), mais même problème.

Merci
 

vgendron

XLDnaute Barbatruc
@ChTi160 salut
non, je me contentais juste de corriger la syntaxe qui était inversée..
après.. faire un Cdate de 4 chiffres qui sont déjà une année, ca sert pas à grand chose..
si madate est déjà une date: suffit de faire year(madate) pour récuperer l'année..
mais bon.. suis pas allé voir en détail le problème posé ici.
 

Discussions similaires

  • Question
Microsoft 365 TEXTBOX
Réponses
7
Affichages
284

Statistiques des forums

Discussions
311 737
Messages
2 082 030
Membres
101 876
dernier inscrit
JULIEN21370