Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1830 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA]Prendre en compte un interval de dates

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA]Prendre en compte un interval de dates

n°1601624
Spass_pa
Posté le 21-08-2007 à 10:35:18  profilanswer
 

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)
 

mood
Publicité
Posté le 21-08-2007 à 10:35:18  profilanswer
 

n°1601682
86vomito33
Posté le 21-08-2007 à 13:24:03  profilanswer
 

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+

n°1601683
Spass_pa
Posté le 21-08-2007 à 13:28:33  profilanswer
 

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

n°1601687
Spass_pa
Posté le 21-08-2007 à 13:37:31  profilanswer
 

la macro comprend pa

n°1601689
Spass_pa
Posté le 21-08-2007 à 13:38:31  profilanswer
 

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

n°1601691
86vomito33
Posté le 21-08-2007 à 13:45:41  profilanswer
 

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

n°1601695
Spass_pa
Posté le 21-08-2007 à 13:55:33  profilanswer
 

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

n°1601696
Spass_pa
Posté le 21-08-2007 à 13:57:44  profilanswer
 

é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)

n°1601699
86vomito33
Posté le 21-08-2007 à 13:59:16  profilanswer
 

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

n°1601700
Spass_pa
Posté le 21-08-2007 à 14:01:21  profilanswer
 

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

mood
Publicité
Posté le 21-08-2007 à 14:01:21  profilanswer
 

n°1601834
Spass_pa
Posté le 21-08-2007 à 16:42:21  profilanswer
 

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?

n°1601860
Spass_pa
Posté le 21-08-2007 à 17:18:54  profilanswer
 

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.

n°1601866
Paul Hood
Posté le 21-08-2007 à 17:22:40  profilanswer
 

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)

n°1601897
seniorpapo​u
Posté le 21-08-2007 à 17:59:16  profilanswer
 

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

n°1602059
Spass_pa
Posté le 22-08-2007 à 09:27:05  profilanswer
 

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
 
++

n°1602061
Spass_pa
Posté le 22-08-2007 à 09:28:51  profilanswer
 

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

n°1602069
Spass_pa
Posté le 22-08-2007 à 09:34:08  profilanswer
 

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?

n°1602194
Paul Hood
Posté le 22-08-2007 à 11:16:57  profilanswer
 

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

n°1602205
Spass_pa
Posté le 22-08-2007 à 11:22:28  profilanswer
 

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?

n°1602209
Paul Hood
Posté le 22-08-2007 à 11:25:01  profilanswer
 

Tu mets quoi dans nbl ?

n°1602221
Spass_pa
Posté le 22-08-2007 à 11:29:41  profilanswer
 

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

n°1602228
Spass_pa
Posté le 22-08-2007 à 11:32:29  profilanswer
 

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?

n°1602231
Paul Hood
Posté le 22-08-2007 à 11:35:00  profilanswer
 

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 !

n°1602232
Paul Hood
Posté le 22-08-2007 à 11:36:42  profilanswer
 

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
n°1602234
Spass_pa
Posté le 22-08-2007 à 11:38:58  profilanswer
 

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

n°1602238
Paul Hood
Posté le 22-08-2007 à 11:42:45  profilanswer
 

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.

n°1602239
Spass_pa
Posté le 22-08-2007 à 11:43:18  profilanswer
 

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
++

n°1602979
denis1979
Posté le 23-08-2007 à 14:46:04  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA]Prendre en compte un interval de dates

 

Sujets relatifs
Connextion à un annuaire LDAP (VBA vers VBS)[EXCEL] utiliser fonction excel dans VBA
[VBA] champs texte et espacesComment effectuer une condition sous Excel en VBA?
lien entre deux classeurs [VBA]A L'AIDE!!! recuperer et comparer date et heure [VBA]
[VBA] annuler boite de "mise à jour des liens"VBA ACCESS ou ACCESS(tout cours) pb creer requete avec contenu de tabl
[VBA EXCEL] Insérer lien Hypertexte avec condition[VBA]redaction du stlinkcriteria pour filtrer un formulaire
Plus de sujets relatifs à : [VBA]Prendre en compte un interval de dates


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)