Calculer la durée moyenne avec VBA

bonjour,

dans un tableau plusieurs Cologne avec la disposition comme suit :

annotation 2020 05 12 114750

je voudrais calculer le temps moyen que passe michel sur ses taches en format( JJ & " jour " & HH & "h" & HH) en VBA

et récupérer cela dans un variables se possible.

est ce que quelqu’un a une solution s'il vous plait?

dans l'attende de vous lire.

cordialement.

Bonjour hari,

Vite fait donc sans doute mal fait.

Voir le fichier joint. Le code est dans module1.

Sub Bilan()
Dim t, dico As New Dictionary, i&, clef, v#, s, jj&, hh&

t = Feuil1.Range("a1").CurrentRegion.Value2
Set dico = CreateObject("scripting.dictionary")
dico.CompareMode = TextCompare

For i = 2 To UBound(t)
   clef = Join(Array(t(i, 4), t(i, 1)), "\")
   If Not dico.Exists(clef) Then dico.Add clef, 0
   v = dico(clef) + t(i, 5) + t(i, 6) - t(i, 2) - t(i, 3)
   dico(clef) = v
Next i

With Feuil2
   .Activate
   .Range("a1").CurrentRegion.ClearContents
   ReDim r(1 To dico.Count + 1, 1 To 3)
   r(1, 1) = "Qui": r(1, 2) = "Tâche": r(1, 3) = "En jour & heure"
   i = 1
   For Each clef In dico.Keys
      i = i + 1
      s = Split(clef, "\")
      r(i, 1) = s(0): r(i, 2) = s(1)
      jj = Int(dico(clef)): hh = Int((dico(clef) - jj) / (1# / 24) + 0.5)
      If hh > 24 Then jj = jj + 1: hh = 0
      r(i, 3) = jj & " J et " & hh & "H"
   Next
   .Range("a1").Resize(UBound(r), UBound(r, 2)) = r
End With
End Sub

Re,

J'ai fait le total et non la moyenne . J'y retourne.

Re,

Avec la moyenne. A vérifier.

Sub Bilan()
Dim t, dico As New Dictionary, i&, clef, v, s, moy#, jj&, hh&

t = Feuil1.Range("a1").CurrentRegion.Value2
Set dico = CreateObject("scripting.dictionary"): dico.CompareMode = TextCompare

For i = 2 To UBound(t)
   clef = Join(Array(t(i, 4), t(i, 1)), "\")
   If Not dico.Exists(clef) Then dico.Add clef, Array(0#, 0#)
   v = dico(clef)
   v(0) = v(0) + t(i, 5) + t(i, 6) - t(i, 2) - t(i, 3): v(1) = v(1) + 1
   dico(clef) = v
Next i

With Feuil2
   .Activate
   .Range("a1").CurrentRegion.ClearContents
   ReDim r(1 To dico.Count + 1, 1 To 3)
   r(1, 1) = "Qui": r(1, 2) = "Tâche": r(1, 3) = "En jour & heure"
   i = 1
   For Each clef In dico.Keys
      i = i + 1
      s = Split(clef, "\"): r(i, 1) = s(0): r(i, 2) = s(1)
      v = dico(clef): moy = v(0) / v(1)
      jj = Int(moy): hh = Int((moy - jj) / (1# / 24) + 0.5)
      If hh > 24 Then jj = jj + 1: hh = 0
      r(i, 3) = jj & " J et " & hh & "H"
   Next
   .Range("a1").Resize(UBound(r), UBound(r, 2)) = r
End With
End Sub

Re,

Attention! Petite erreur (quand on veut aller vite).

Remplacer dans les deux codes :

If hh > 24 

par

If hh >= 24

salut,

ca marche nickel merci beaucoup.

mais ce pendant je n'ai pas entièrement compris le fonctionnement de ton code, est ce que tu pourrais m'expliquer comment il marche qu'il te plait?

je voudrais comprendre pour pouvoir l'utiliser sur des futurs projets.

dans l'attende de te lire

Re,

est ce que tu pourrais m'expliquer comment il marche qu'il te plait?

je voudrais comprendre pour pouvoir l'utiliser sur des futurs projets.

dans l'attende de te lire

Il va me falloir un peu de temps? C'est toujours plus long d'expliquer que d'écrire le code

Juste une question pour mes futures explications : Connais-tu la structure "Dictionary" ?

non pas trop, je commence en vba, et je serais ravi de l'apprendre car ça m'as l'air assez intéressant.

salut,

je me permet de te relancer a ce sujet.

si c'est trop compliqué a expliquer est ce que tu peut faire un code où je vais pouvoir adapter l’emplacement des différentes infos s'il te plait, car je risque de pas garder la même structure dans le fichier finale.

Rechercher des sujets similaires à "calculer duree moyenne vba"