Prendre en compte un interval de dates [VBA] - VB/VBA/VBS - Programmation
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+
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"?
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
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
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)
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
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
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?
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.
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)
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
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
++
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
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?
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".
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?
Marsh Posté le 22-08-2007 à 11:29:41
je laisse ca :
nbl = Sheets(2).Range("a1" ).End(xlDown).Row
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?
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 !
Marsh Posté le 22-08-2007 à 11:36:42
Spass_pa a écrit : en fait quand je commence en A2 je mets : |
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.
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
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.
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
++
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
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)