[VBA]Prendre en compte un interval de dates

Prendre en compte un interval de dates [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 21-08-2007 à 10:35:18    

Bonjour,  
je chercher à faire une somme conditionnelle en prenant en compte un interval de dates, je m'explique :  
 
mon tableau est tout simple: 1ere colonne des dates, 2nd colonne des valeurs associées aux dates.  
 
Je dois faire en sorte que sur la Feuil1, en entrant deux dates (ex:01/01/2006 et 31/01/2006, en gros le mois de janvier), on puisse avoir la somme des valeurs correspondantes au mois de janvier.  
 
pour ce faire j'ai une macro qui ressemble à ca :  
 
Sub Rectangle1_QuandClic()  
 
Dim test As Variant  
Dim i As Integer  
 
test = 0  
 
For i = 1 To ThisWorkbook.Worksheets.Count  
 
test = test + Worksheets(i).[SUMIF(A:A,Feuil1!E2,B:B)]  
 
Next  
Worksheets(1).Range("E10" ) = test  
 
End Sub  
 
 
Pour l'instant je teste seulement avec une seule valeur (ex:si en colonne 1 j'ai "3" alors je somme les valeurs de la colonne 2 correspondante). La valeur "3" est entrée dans la cellule E2.  
 
J'ai pas mal parcouru les forums et j'ai rien trouvé pour faire cette somme conditionnelle. J'ai essayé SUMIF mais ca prend pas en compte les intervalles on dirait. Je viens d'essayer SOMMEPROD mais je ne comprends pas trop l'intéret. Et j'ai également essayé des trucs comme ca :  
'If Cells(e, 4).Value <= Range("A:A" ).Value Then  
'If Range("A:A" ).Value <= Cells(f, 4).Value Then  
 
mais aucun succès.  
 
 
C'est pourquoi je vous demande un petit coup de pouce.  
 
Merci d'avance.  
 
P.S/si je n'ai pas été assez clair n'hésitez pas à me demander d'éclairsir...
P.S²/je veux utiliser le VBA car je dois faire ce total à partir de plusieurs feuilles (environ 100)
 

Reply

Marsh Posté le 21-08-2007 à 10:35:18   

Reply

Marsh Posté le 21-08-2007 à 13:24:03    

peut etre utiliser une structure comme ca
 
for i=1 to nombredeligne  
if A(i)> datemin and A(i)<datemax then
somme=somme+valeurdelacellule
end if
next
 
a+

Reply

Marsh Posté le 21-08-2007 à 13:28:33    

merci je vais essayer ca de suite.
je te tiens informé

Reply

Marsh Posté le 21-08-2007 à 13:37:31    

la macro comprend pa

Reply

Marsh Posté le 21-08-2007 à 13:38:31    

pardon :
la macro ne comprend pas le A(i)
 
et que dois-je mettre à la place de "valeurdelacellule"?

Reply

Marsh Posté le 21-08-2007 à 13:45:41    

effectivement c normal
 
nbl=range("a5555" ).end(xlup).row    --> j'en suis pas sur a verifier
for i=1 to nbl
if cells(i,1).value>=datemin and cells(i,1).value<=datemax then
somme=somme+cells(i,2).value
end if
next

Reply

Marsh Posté le 21-08-2007 à 13:55:33    

je viens de taper ceci mais j'obtiens toujours 0 en résultat..
 
nbl = Range("a5555" ).End(xlUp).Row
For i = 14 To nbl
If Cells(i, 1).Value >= 12 / 1 / 2006 And Cells(i, 1).Value <= 12 / 31 / 2006 Then
test = test + Cells(i, 2).Value
End If
next

Reply

Marsh Posté le 21-08-2007 à 13:57:44    

étant novice je ne sais pas à quoi sert :  
 
nbl = Range("a5555" ).End(xlUp).Row
 
et je ne saurais le corriger si éventuellement il y a une faute.
 
de plus je ne comprends pas les cells (i, 1) et cells (i, 2)

Reply

Marsh Posté le 21-08-2007 à 13:59:16    

"12/01/2006" et "12/31/2006"
ca change un truc ?!
 
je suis de retour vers 17h si ta tj pa trouve de solution

Reply

Marsh Posté le 21-08-2007 à 14:01:21    

ok
je serais encore là mais pas pr longtps
 
pour ta question, j'ai découvers qu'il faut mettre les dates en anglais, donc mm/jj/aaaa

Reply

Marsh Posté le 21-08-2007 à 14:01:21   

Reply

Marsh Posté le 21-08-2007 à 16:42:21    

j'ai trouvé un autre moyen :
 
res = 0
For i = 14 To 50
'If Year(Cells(i, 1) = 2006) Then
If Month(Cells(i, 1)) = 9 Then
res = res + Cells(i, 2)
'End If
End If
Next
 
 
ca marche bien avec les mois mais j'ai également essayé de faire avec les années (car il faut différencier 2005 et 2006 par exemple) mais la fonction "year"  ne marche pas semble t-il. C-à-d que quand j'utilise :
 
'If Year(Cells(i, 1) = 2006) Then
 
il prend en compte dans mon total toutes les dates sans faire la distinction entre 2005 et 2006...
 
je ne sais pas quoi faire pour y remédier.
 
Par ailleurs j'ai remarqué que quant je mets dans la colonne A autre chose que des dates (ex: "total", bref si je mets du texte) et que je mets dans ma macro :
 
For i = 14 To 50
 
(je prends un "i" assez large pour prendre en compte toutes les dates de mes différentes feuilles (et oui le nombre de dates diffère de feuille en feuille)
cela m'indique une erreur. Je pense qu'il faut filtrer en amont et lui dire de traiter que les dates. Qu'en penses tu?

Reply

Marsh Posté le 21-08-2007 à 17:18:54    

j'ai pensé à mettre ca pour prendre en compte que les dates :
 
If Cells(i, 1) = Date
 
mais le résultat est tjs 0. La syntaxe doit etre mauvaise mais vu mes connaissances en VBA je tourne en rond.

Reply

Marsh Posté le 21-08-2007 à 17:22:40    

Bonjour,
voilà peut être de quoi t'aider
 
Private Sub CommandButton1_Click()
    Dim DateDeb As Date
    Dim DateFin As Date
    Dim LaDate As Date
    Dim Res As Variant
 
    DateDeb = Sheets(1).Cells(2, 1)
    DateFin = Sheets(1).Cells(2, 2)
     
    nbl = Sheets(2).Range("a1" ).End(xlDown).Row
    Res = 0
    For i = 1 To nbl
        LaDate = Sheets(2).Cells(i, 1)
         
        If LaDate < DateFin And LaDate > DateDeb Then
            Res = Res + Int(Sheets(2).Cells(i, 2))
        End If
         
    Next
     
    Sheets(1).Cells(2, 3) = Res
End Sub
 
En fait, Dans la feuille1, En A2 tu mets la date de début de ta période, et en B2 la date de fin. La macro de retourne le réusltat en C2.
Dans la feuille2, tu mets en colonne 1 la date et en colonne 2 la valeur.
Tu créé un bouton dans ta feuille 1 auquel tu associes le code ci-dessus.
(les format des celulles sont dates - les mêmes pour toutes les celulles où des dates doivent être saisies)

Reply

Marsh Posté le 21-08-2007 à 17:59:16    

Bonjour,
je ne suis pas certain que cela convienne, mais...
 
En colonne A les dates
En           B les valeurs
 
en C1 la date début
en D1 la date fin
 
dans la case où on veut le résultat:
=SOMMEPROD((A1:A32000>=C1)*(A1:A32000<=D1);B1:B32000)
 
Cordialement

Reply

Marsh Posté le 22-08-2007 à 09:27:05    

Bonjour
je viens de tester ta macro Paul Hood et ça a l'air de fonctionner.
Je vais essayer de l'implanter dans mon fichier original.
 
Encore merci.
 
Merci également à seniorpapou mais cette formule ne peut pas s'appliquer à la centaine de pages que je dois traiter, d'où l'utilisation de macro
 
++

Reply

Marsh Posté le 22-08-2007 à 09:28:51    

Malheureusement ça ne marche pas dans mon fichier original. Il se trouve que les dates sont bien da

Reply

Marsh Posté le 22-08-2007 à 09:34:08    

Oupsss
 
Malheureusement ça ne marche pas dans mon fichier original. Il se trouve que les dates sont bien dans la colonne A mais le problème c'est que dans cette colonne il y a aussi des cellules avec du texte. Je m'explique:
sur toutes mes feuilles les dates vont de la cellule A15 à une cellele non déterminée (en gros le nombre de dates présentes n'est pas le même de feuille en feuille) et il se trouve qu'en bas des dates (tjs dans la colonne A) se trouve le mot "total" qui comptabilise mes valeurs.
 
Et la présence de ce mot entraine une erreur d'execution. La ligne de la macro mise en cause est celle ci (d'apres le débogeur)
        LaDate = Sheets(2).Cells(i, 1)
 
Comment puis-je résoudre ce problème?

Reply

Marsh Posté le 22-08-2007 à 11:16:57    

Bonjour,
Alors il te faut faire la boucle de la ligne 14 à la ligne (non comprise) sur laquelle tu lis "Total".

Reply

Marsh Posté le 22-08-2007 à 11:22:28    

j'ai réussi à prendre en compte toutes les lignes en excluant le total.
 
Mais à ma grande surprise un autre problème est apparu :
 
mes dates commencent à la ligne 15 (et je ne veux pas prendre en compte les lignes 1 à 14) et losque je mets dans la macro :
 
For i = 15 To nbl  
 
mon résultat est 0, ce qui n'est pas normal!
 
Par ailleurs j'ai remarqué que si mes dates commencent à A2 et allant jusqu'à A13 par exemple, la macro m'affiche tjs 0 comme résultat même si je mets "for i=2 to nbl". En gros faut impérativement que mes dates commencent à A1 et qu'il n'y ait pas de cellules vides dans la colonne A entre ma première et ma dernière date.
 
Comment faire?

Reply

Marsh Posté le 22-08-2007 à 11:25:01    

Tu mets quoi dans nbl ?

Reply

Marsh Posté le 22-08-2007 à 11:29:41    

je laisse ca :
    nbl = Sheets(2).Range("a1" ).End(xlDown).Row

Reply

Marsh Posté le 22-08-2007 à 11:32:29    

en fait quand je commence en A2 je mets :
 nbl = Sheets(2).Range("a2" ).End(xlDown).Row
 
et en A15 :
 nbl = Sheets(2).Range("a15" ).End(xlDown).Row
 
est-ce exact?

Reply

Marsh Posté le 22-08-2007 à 11:35:00    

Si tu n'as pas de ligne cellule vide entre ta première date et "Total", et que la cellule arpès "Total" est vide, tu peux faire :
nbl=Sheets(2).Range("a15" ).End(xlDown).Row-1
et
for i=15 to nbl
ca va te prendre toutes les lignes de la 15 à la ligne précédent la ligne "Total".
Enfin ... j'espère avoir été clair !

Reply

Marsh Posté le 22-08-2007 à 11:36:42    

Spass_pa a écrit :

en fait quand je commence en A2 je mets :
 nbl = Sheets(2).Range("a2" ).End(xlDown).Row
 
et en A15 :
 nbl = Sheets(2).Range("a15" ).End(xlDown).Row
 
est-ce exact?


En précisant "A15" dans le range("A15" ) c'st pour lui dire de chercher la dernière ligne, à partir de la ligne 15 dans la colonne A, qui n'est pas vide.


Message édité par Paul Hood le 22-08-2007 à 11:37:05
Reply

Marsh Posté le 22-08-2007 à 11:38:58    

ok
et peux tu me dire pourquoi quand il additionne les valeurs:
1
0,5
1
1
2
3
 
il trouve comme résultat: 8
il devrait trouver 8.5 !
je ne comprends pas d'ou ca vient

Reply

Marsh Posté le 22-08-2007 à 11:42:45    

Dans le code il y a  
Res = Res + Int(Sheets(2).Cells(i, 2))  
et INT signifie integer alors ton 0,5 il le prend pour 0. d'ou le 8 à la place du 8,5
 
Remplace INT par CDBL et ca doit marcher.

Reply

Marsh Posté le 22-08-2007 à 11:43:18    

je viens de trouver. Je connaissais pas la fonction 'Int' mais je l'ai enlevée et ca marche.
 
merci pour ton coup de main
++

Reply

Marsh Posté le 23-08-2007 à 14:46:04    

essaie de nommer les plages de dates, sur chaque sheet le meme nom de plage, mais le nombre de cellules qu'il contient varie.
de cette facon tu determine tes plages pour ne pas inclure les sections autres que dates
 
grosso modo ca donne:
 
 
dim s as worksheet
dim c as cell
 
for each s in worksheets
for each c in s.range("NomDePlage" ).Cells
 
' ton code ici
 
next c
next s

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed