histogramme avec condition sur les colonnes

nintendo

XLDnaute Nouveau
Bonjour à tous,

Je me permets de resolliciter votre aide car je voudrais faire une macro s’appliquant sur des colonnes déjà créées.

En fait, j’ai 3 colonnes, une avec des dates de la forme j/m/aaaa, une deuxième avec des noms mais on saura leur nombre et leur « valeur » à l’avance. Pour l’exemple de la macro appelons les toto1 et toto2. La troisième colonne donnera des durées.
Je voudrais que pour chaque jour entre la première et dernière date (en enlevant les samedis et dimanches) que l’on calcule la durée totale durant une journée pour une personne.

Et ensuite exprimer ces résultats sous forme de graphiques, un par personne. Dans l’exemple ça fera 2 graphiques.
Pour chaque personne, je voudrais donc tracer un graphique (histogramme ?) qui donne son temps journalier avec les dates en abscisse , je voudrais aussi comparer ce temps avec la somme de toutes les durées de toutes les personnes, donc faire une colonne donnant le temps d’une personne et une autre donnant le temps pour toutes les personnes et cela pour tous les jours.

J’espère avoir été clair.
Je ne sais pas trop comment débuter...

Merci d’avance pour toute l’aide que vous m’apporterait :)
 

nintendo

XLDnaute Nouveau
Re : histogramme avec condition sur les colonnes

Bonjour julberto,

Merci de t'être attardé sur mon code touffu.

Ta macro marchait très bien mais faisait le total des temps en ne tenant pas compte du nom de la personne. J'ai donc voulu rajouter une condition pour que la macro calcule la somme des durées mais en tenant compte de la personne.
Il y a 3 personnes: nom1 nom2 et nom3 qui sont dans la colonne B, dans A on a la date et dans C les durées. J'espère que j'ai été plus clair.

Ta formule à étendre directement dans la feuille excel marchait mais je voudrais la faire sous forme d'une macro.

merci encore pour le temps que tu prends pour répondre à mes problèmes.
 

julberto

XLDnaute Occasionnel
Re : histogramme avec condition sur les colonnes

Bonjour nintendo,

J'ai joint une macro qui j'espère sera explicite. Elle est divisée en section; chaque section est indépendante.
C'est évidemment répétitif mais elle devrait contribuer à te faciliter la tâche.

Pour réaliser tes macros, n'utilise que des variables décimales pour les durées. Tu ne passeras en format HEURE que pour finaliser.

cordialement
 

Pièces jointes

  • nitendo-1.xls
    71 KB · Affichages: 59

nintendo

XLDnaute Nouveau
Re : histogramme avec condition sur les colonnes

Bonjour julberto,

Merci énormément pour cette aide précieuse et pour le temps que tu as passé à concevoir ces macros! Je vais regarder le code de plus près mais à première vue quand je lance la macro temps je n'ai rien qui s'affiche dans le cumul toutes dates confondures et dans l'onglet récap. Je ne sais pas si c'est normal

Encore merci!
 

julberto

XLDnaute Occasionnel
Re : histogramme avec condition sur les colonnes

Bonjour nintendo,

Je ne comprends pas pourquoi -> voila ce que j'obtiens avec le fichier envoyé au post #17 à partir du fichier joint.
cordialement
 

Pièces jointes

  • Copie de nitendo-1.xls
    77.5 KB · Affichages: 53

nintendo

XLDnaute Nouveau
Re : histogramme avec condition sur les colonnes

Bonjour,

Je me permets de vous redemander de l'aide car je suis en train de retravailler le fichier de julberto et j'aimerais qu'au lieu de faire la somme de tous les temps par mois et par semaine, qu'il fasse la moyenne. Donc on calcule d'abord le temps total, ce qui est déjà fait et après on divise par le nombre d'occurence du nom dans la période donnée.

Voici par exemple ce que j'ai modifié pour le calcul du temps par mois mais ça ne marche pas.
j'ai déclaré le tableau T2 comme un tableau de date et LesNoms contient 6 personnes.



Set Dest4 = Worksheets("Sheet4").Range("A65000").End(xlUp).Offset(1, 0)
Dest4.Resize(1, UBound(LesNoms) + 1) = LesNoms
ReDim T2(UBound(LesNoms))
i = LBound(T1, 1)
ligne = 0
Do
début_période = Month(T1(i, 1))
T2(0) = 0: T2(1) = 0: T2(2) = 0: T2(3) = 0: T2(4) = 0: T2(5) = 0: T2(6) = 0


Do While Month(T1(i, 1)) = début_période
Select Case T1(i, 4)
Case LesNoms(1)
f = f + 1
T2(1) = T2(1) + T1(i, 3)

Case LesNoms(2)
a = a + 1
T2(2) = T2(2) + T1(i, 3)
Case LesNoms(3)
b = b + 1
T2(3) = T2(3) + T1(i, 3)


Case LesNoms(4)
c = c + 1
T2(4) = T2(4) + T1(i, 3)

Case LesNoms(5)
d = d + 1
T2(5) = T2(5) + T1(i, 3)

Case LesNoms(6)
e = e + 1
T2(6) = T2(6) + T1(i, 3)


End Select
i = i + 1:
If i > UBound(T1, 1) Then
Exit Do

If a = 0 Then a = 1
If b = 0 Then b = 1
If c = 0 Then c = 1
If d = 0 Then d = 1
If e = 0 Then e = 1
If f = 0 Then f = 1

T2(1) = T2(1) / f
T2(2) = T2(2) / a
T2(3) = T2(3) / b
T2(4) = T2(4) / c
T2(5) = T2(5) / d
T2(6) = T2(6) / e

End If
Loop


ligne = ligne + 1
Dest4.Offset(ligne, 0).Resize(1, UBound(T2) + 1) = (T2)
Dest4.Offset(ligne, 0).Value = "mois " & début_période
Loop Until i > UBound(T1, 1)
Erase T2

Merci d'avance pour votre aide.
 

julberto

XLDnaute Occasionnel
Re : histogramme avec condition sur les colonnes

Bonjour nintendo,

nintendo
Il y a 3 personnes: nom1 nom2 et nom3 qui sont dans la colonne B, dans A on a la date et dans C les durées.
Si tu avais dit qu'il y avait 6 personnes ou plus je n'aurais pas codé comme je l'ai fait !! Bon pas grave.

Pour répondre à ta question du 27/6, voila le code modifié relatif à la Section -- 5 -- 'cumul par mois du post #19
VB:
'Section -- 5 --   'Moyenne par mois des temps de chacune des 3 personnes

  Dim Frq()
  Set Dest4 = Worksheets("Récap").Range("K65000").End(xlUp).Offset(1, 0)
  Dest4.Resize(1, UBound(LesNoms) + 1) = LesNoms
  ReDim T2(UBound(LesNoms))
  ReDim Frq(UBound(LesNoms))
  i = LBound(T1, 1)
  ligne = 0
  Do
    début_période = Month(T1(i, 1))
    T2(0) = 0: T2(1) = 0: T2(2) = 0: T2(3) = 0
    Frq(1) = 0: Frq(2) = 0: Frq(3) = 0
    Do While Month(T1(i, 1)) = début_période
      Select Case T1(i, 2)
        Case LesNoms(1)
          T2(1) = T2(1) + T1(i, 3)
          Frq(1) = Frq(1) + 1
        Case LesNoms(2)
          T2(2) = T2(2) + T1(i, 3)
          Frq(2) = Frq(2) + 1
        Case LesNoms(3)
          T2(3) = T2(3) + T1(i, 3)
          Frq(3) = Frq(3) + 1
      End Select
        i = i + 1: If i > UBound(T1, 1) Then Exit Do
    Loop
    For j = 1 To UBound(LesNoms)
      If Frq(j) > 0 Then T2(j) = T2(j) / Frq(j) Else T2(j) = "--"
    Next j
    ligne = ligne + 1
    Dest4.Offset(ligne, 0).Resize(1, UBound(T2) + 1) = (T2)
    Dest4.Offset(ligne, 0).Value = "mois " & début_période
  Loop Until i > UBound(T1, 1)
  Erase T2
N.B. si dans la période une personne est absente, on ne peut faire de moyenne. Ce code est transposable aux autres sections, bien entendu.

cordialement
 
Dernière édition:

nintendo

XLDnaute Nouveau
Re : histogramme avec condition sur les colonnes

bonjour julberto,

merci beaucoup!
je vais aller analyser ce code.

Au fait, pour le nombre de personnes, j'avais dit 3 au début dans le but de prendre un exemple mais il peut varier, je suis en train de me demander s'il est assez facile de créer une macro permettant d'ajouter ou supprimer une personne et qui modifierait directement le tableau. Tu crois que c'est facilement implémentable?

Cordialement
 
Dernière édition:

julberto

XLDnaute Occasionnel
Re : histogramme avec condition sur les colonnes

Bonjour nintendo,

-- Il faudra renseigner le variant "LesNoms" avec la dénomination de TOUTES les personnes :
par exemple pour un quatrième nom :
'Array pour créer une liste d'éléments prédéfinis
LesNoms = Array("", "André", "Hubert", "Jéronimo", "Léa")
-- Puisque tous les tableaux utilisés sont dynamiques, il n'ont pas à être modifiés.

-- Il faudra ajouter autant de "Case" qu'il y a de noms définis dans "LesNoms"
par exemple pour un quatrième nom :
Case LesNoms(4)
T2(4) = T2(4) + T1(i, 4)
Frq(4) = Frq(4) + 1

-- L'initialisation des tableaux
T2(0) = 0: T2(1) = 0: T2(2) = 0: T2(3) = 0
Frq(1) = 0: Frq(2) = 0: Frq(3) = 0
sera préférablement remplacé par :

For j = 1 To UBound(LesNoms)
T2(j) = 0: Frq(j) = 0
Next j
cordialement
 

nintendo

XLDnaute Nouveau
Re : histogramme avec condition sur les colonnes

Bonjour Julberto,
Merci beaucoup pour tous ces détails!

Crois-tu qu'il serait possible d'automatiser cette creation de code? par exemple pour l'ajout d'un case supplémentaire?
En fait, l'idéal serait que j'ai un bouton ajouter personne et un autre supprimer sur une feuille excel et qu'une fenetre s'affiche pour rentrer la personne à ajouter ou supprimer et que cela s'implémente automatiquement sans aller remodifier le code vba.

En tout cas merci beaucoup, j'apprends beaucoup de choses sur ce forum et plus particulièrement grâce à toi!
 

julberto

XLDnaute Occasionnel
Re : histogramme avec condition sur les colonnes

Bonjour nintendo,


de nintendo,
Crois-tu qu'il serait possible d'automatiser cette creation de code? par exemple pour l'ajout d'un case supplémentaire?
J'ai lu sur ce forum que cela est réalisable, mais cela dépasse mes compétences. A mon avis et d'expérience, dans la majorité des cas, il est préférable qu'un projet (qui au final sera codé) doit être au préalable parfaitement défini. L'évolution d'un projet nécessite en général une modification du code.
Présentement, j'avais codé ta demande de façon assez basique afin que tu puisses comprendre le code et le modifier à ta guise.

de nintendo, (post #12)
J’ai pris le cas de 3 utilisateurs avec nom1 nom2 et nom3. Je n’en aurais pas beaucoup plus donc je peux me permettre d’adapter les boucles à la main en cas d’ajout ou de suppression d’utilisateurs.

Mon code satisfaisait à cette demande initiale. Et c'est une des raisons pour laquelle j'avais utilisé des "Select Case". La modification proposée post #24 permet d'ajouter (manuellement) autant de case qu'il est nécessaire. Un surplus de case n'est pas un obstacle au bon déroulement de la macro.

de nintendo,
En fait, l'idéal serait que j'ai un bouton ajouter personne et un autre supprimer sur une feuille Excel et qu'une fenêtre s'affiche pour rentrer la personne à ajouter ou supprimer

Je ne partage pas ce point de vue......car tu t'ajoutes une contrainte forte. Je te proposerais à la place de remplir la liste des noms automatiquement (= la variable "LesNoms" de la macro) sur la base des noms déjà présents dans la liste de ta base de données.
Autre point que je ne partage pas non plus : l'usage d'un bouton.
Un bouton de feuille est très facilement mis en œuvre, certes, et permet de répondre de façon efficace et rapide sur un forum. Mais en contre partie il n'est visible (accessible) que de la feuille auquel il est attaché.
Par contre un menu déroulant, présent dans la barre d'outil d'Excel est accessible quelque soit la feuille active.

Pour les options futures à prendre c'est toi qui vois c'est toi le demandeur.

cordialement

N.B. Un exemple de menu déroulant ici (post #15)
 
Dernière édition:

nintendo

XLDnaute Nouveau
Re : histogramme avec condition sur les colonnes

Bonjour Julberto,

Merci beaucoup pour ta réponse détaillée, je vais donc réfléchir comment je vais poursuivre.. et désolé pour ma lenteur de réponse

Je suis en train de construire des graphiques et je bloque sur un petit problème. En fait je voudrais faire un graphique sur la denière ligne non vide de plusieurs colonnes (ici 3 mais la dernière ligne aura le même numéro pour chaque colonne)

Sub gra()

Dim k As Integer

k = Sheets("recap").Range("F65000").End(xlUp).Row

Sheets("recap").Select
o = Sheets("recap").Range("G" & k & ":I" & k).Select

ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=o (cette ligne ne marche pas, en fait j'ai analysé le code qu'il faut mettre quand on a un champ fixe mais ici mon champ est variable donc je ne sais pas trop gérer mon "k")
ActiveChart.ChartType = xlColumnClustered

Si tu avais une idée pour résoudre mon problème.

Merci beaucoup pour toute l'aide et le temps que tu m'accordes

Cordialement
 

julberto

XLDnaute Occasionnel
Re : histogramme avec condition sur les colonnes

Re,

Il fallait que "o" soit un range. L'instruction "Set" défini la variable "o" en tant que "Range".
J'ai mis "With / End With" pour éviter les répétitions et rendre le code plus clair.
VB:
Sub gra()

Dim k As Integer, o As Range

With Sheets("Récap")
  .Select
  k = .Range("F65000").End(xlUp).Row
  Set o = .Range("G" & k & ":I" & k)
  ActiveSheet.Shapes.AddChart.Select
  ActiveChart.SetSourceData Source:=o
  ActiveChart.ChartType = xlColumnClustered
End With

End Sub

N'hésite pas à utiliser les balises "Quote" quand tu postes du code c'est plus lisible.
Merci. A +
 

Discussions similaires

Réponses
4
Affichages
195
Réponses
16
Affichages
528

Statistiques des forums

Discussions
312 243
Messages
2 086 550
Membres
103 245
dernier inscrit
gdesign