Code pour addition KM par semaine, mois et an

Résolu
cs_pnt Messages postés 21 Date d'inscription mardi 26 décembre 2006 Statut Membre Dernière intervention 6 décembre 2009 - 30 déc. 2006 à 07:27
cs_pnt Messages postés 21 Date d'inscription mardi 26 décembre 2006 Statut Membre Dernière intervention 6 décembre 2009 - 1 janv. 2007 à 11:39
Bonjour,
A partir d'une liste dans laquelle sont notés:
colonne A les date et colonne B le KM réalisé pour ces dates.
Comment peut on écrire en VBA les éléments suivants:
La somme de KM par semaine
La somme de KM par Mois
La somme de KM par An
Merci pour votre aide et passez de bonnes fêtes!!!

7 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
30 déc. 2006 à 18:49
Salut,

je pars du principe que tes données Date se trouvent dans la colonne A, et les KM dans la colonne B (et le résultat se mettront dans les colonnes E et F).
Pour tester, ouvre un fichier vierge et place tes données en colonnes A et B, sachant que pour la recherche et l'affichage des résultat, dans ton fichier réel, il faudra que tu fasses 2 ou 3 modifs :

Sub Calcul()
'= ==================================================================================
'                               Traitement par an / mois :
'===================================================================================

Dim i               As Integer
Dim j               As Integer
Dim PLV             As Integer
Dim NbKM            As Long
Dim DateDebutAnnee      As Date
Dim DateFinAnnee        As Date
Dim DateDebutMois       As Date
Dim DateFinMois         As Date

DateDebutAnnee = CDate("01-01-" & Year(Date))
DateFinAnnee = CDate("31-12-" & Year(Date))
NbKMannuel = 0
PLV = PremiereLigneVide(1) 'recherche la première ligne vide dans la colonne A
'                           afin de limiter la boucle aux besoins

For i = 1 To PLV
    If Range("A" & i).Value >= DateDebutAnnee And Range("A" & i).Value <= DateFinAnnee Then
        NbKM = NbKM + CLng(Range("B" & i).Value)
    End If
Next i

Range("E1").Value = "KM Annuel :"
Range("F1").Value = NbKM

For j = 1 To 12
    If j <> 12 Then
        DateDebutMois = CDate("01-" & Format(j, "00") & "-" & Year(Date))
        DateFinMois = CDate("01-" & Format(j + 1, "00") & "-" & Year(Date)) - 1
        ' ici ça prendra en compte si le dernier jour est le 28 ou 29 février
    Else
        DateDebutMois = CDate("01-" & Format(j, "00") & "-" & Year(Date))
        DateFinMois = CDate("01-" & Format(j + 1, "00") & "-" & Year(Date) + 1) - 1
    End If
    
    NbKM = 0

    For i = 1 To PLV
        If Range("A" & i).Value >= DateDebutMois And Range("A" & i).Value <= DateFinMois Then
            NbKM = NbKM + CLng(Range("B" & i).Value)
        End If
    Next i
    
    Range("E" & j + 1).Value = "KM Mois de " & Format(DateDebutMois, "mmmm") & " :"
    Range("F" & j + 1).Value = NbKM

Next j

End Sub

Public Function PremiereLigneVide(Colonne As Integer) As Long
    PremiereLigneVide = Columns(Colonne).Find("", , , , xlByRows, xlNext).Row
End Function

~ <small> Mortalino </small> ~

Je te laisse le soin de chercher pour les calcul par semaine, sachant que je te donne une bonne info : tu as ici des fonctions toutes prêtes concernant la recherche du numéro de la semaine :
http://www.codyx.org/snippet_calculer-numero-semaine-date_152.aspx

(aperçu de ma fonction) :

Function WeekNumber(Optional ByVal vDate As Variant) As Byte
    If IsMissing(vDate) Then vDate  = Date
    
        Dim iNbJour     As Integer
        Dim iWeekDay    As Integer
        Dim bValTemp    As Byte
        Dim a           As String
        Dim b()         As String
    
    iWeekDay =  Weekday(CDate("01/01/" & DatePart("yyyy", vDate)))
    
    Select Case iWeekDay
        Case 1: bValTemp = 5: Case 2: bValTemp = 6: Case 3: bValTemp = 0: Case 4: bValTemp = 1: _
        Case 5: bValTemp = 2: Case 6: bValTemp = 3: Case 7: bValTemp = 4
    End Select
    
    iNbJour = CLng(DateDiff("d", CDate("31/12/" & DatePart("yyyy", vDate) - 1), vDate))
    a = IIf((iNbJour + bValTemp) / 7 < 1, 53, CStr((iNbJour + bValTemp) / 7))
    If VarType(a) = vbString Then b() = Split(a, ","): WeekNumber = b(0): Erase b Else WeekNumber = a
End Function

Sub Exemple_Utilisation()
    MsgBox WeekNumber(#1/8/1990#)
    MsgBox WeekNumber()
End Sub

~ <small> Mortalino </small> ~

@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
30 déc. 2006 à 20:45
Je viens de remarquer que j'avais fait une erreur, voici la correction :

    If j <> 12 Then
        DateDebutMois =  CDate("01-" & Format(j, "00") & "-" & Year(Date))
        DateFinMois = CDate("01-" & Format(j + 1, "00") & "-" & Year(Date)) - 1
        ' ici ça prendra en compte si le dernier jour est le 28 ou 29 février
    Else
        DateDebutMois = CDate("01-" & Format(j, "00") & "-" & Year(Date))
        ' *** CORRECTION SUR LA PROCHAINE LIGNE :
        DateFinMois = CDate("01-01-" & Year(Date) + 1) - 1
    End If
~ <small> Mortalino </small> ~

Sinon la date de fin était le 12/01 de l'année suivante, là au moins c'est bien le 31/12

@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 déc. 2006 à 14:14
C'est drôle ! pour moi le KM est le "Knowledge Managenet" !...

Bon ...
Que ce soit du KM ou des cacahuètes, peu importe, s'il faut compter...

Mais il y a une chose essentielle que tu ne nous dis pas : le type du contrôle utilisé pour cette liste à 2 colonnes et le format de ce qu'elle contient (avec précision, s'il te plait, ... et si tu veux qu'on puisse t'aider en connaissance de cause ...).
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 déc. 2006 à 14:15
Pardon lire "management" et pas "managenet" 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
30 déc. 2006 à 14:47
Salut,

il faut trier tes dates en cherchant le premier jour de l'année, par exemple :

c'est simple, c'est "01/01/ & Year(Date)
(pareil pour le dernier jour de l'année avec "31/12/")
après c'est qu'une histoire de condition (If Telle valeur de cellule > "01/01/" & Year(Date) And Telle valeur de cellule < "01/01/" & Year(Date) Then ...)

Pour les mois, c'est "01/01/" & Year(Date) au "31/01/" & Year(Date)
et pour février, afin de savoir si il y a le 29 :
"01/02/" & Year(Date) au CDate("01/03/" & Year(Date)) - 1

Voilà, tu as les grandes lignes.. (n'hésite pas non plus à utiliser les formules excel, dont les valeurs seront stockées dans des cellules, ça sert énormément, t'auras plus qu'à imbriqué tes fonctions)

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
cs_pnt Messages postés 21 Date d'inscription mardi 26 décembre 2006 Statut Membre Dernière intervention 6 décembre 2009 1
30 déc. 2006 à 17:44
Pourrais tu être plus explicite car j'ai du mal à suivre.
Voici mon tableau
<col style=\"width: 60pt;\" span=\"2\" width=\"80\" />----
Dates, KM, ----
01-01-06, 10, ----
05-01-06, 15, ----
15-01-06, 20, ----
02-02-06, 50
Comment puis je faire la somme du mois de janvier, puis par an et par semaine.
J'ai essayé cela mais cela ne fonctionne pas:

Sub MacroSomme_Mois()

Range("A2").SelectIf acticell.Value >"01/01/" & Year(Date) and< "31/01/" & Year(Date) Then
SommeJanvier = ActiveCell.Offset(0, 1).Value
Activecell.Offset(1,0).selectIf acticell.Value >"01/01/" & Year(Date) and< "31/01/" & Year(Date) Then

SommeJanvier = ActiveCell.Offset(0, 1).Value
End If

End Sub

Puis si la liste est longue, il faudrait envisager une boucle que je ne suis pas arrivé à écrire.
Merci à tous
0
cs_pnt Messages postés 21 Date d'inscription mardi 26 décembre 2006 Statut Membre Dernière intervention 6 décembre 2009 1
1 janv. 2007 à 11:39
Ouf, je ne m'attendais pas à quelque chose d'aussi caustaud!!!!!.
Merci encore d'avoir bien voulu partager tes connaissances qui vont me permettre de faire avancer mon projet.
J'en profite pour adresser à tous et toutes mes meilleurs voeux de santé, bonheur et prospérité.
0
Rejoignez-nous