1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
| Option Compare Database
Option Explicit
Private vlChart As Graph.Chart, vlDataSheet As Graph.DataSheet
Private Const cstRqt As String = "TRANSFORM round(Sum(totalReel),0) AS totalH " & _
"SELECT Left([nomMois],4) AS Mois, calculMoyenneGraph([IDmois]) as Moyenne " & _
"FROM R_tableauMensuel " & _
"GROUP BY Left([nomMois],4), IDmois " & _
"ORDER BY IDmois "
Private Sub AffPourcent()
Dim X As Integer, i As Integer, j As Integer, totalMois As Long
' Pour chaque série du graph
For X = 1 To vlChart.SeriesCollection.Count
With vlChart.SeriesCollection(X)
' Si on est sur une analyse mensuelle (histogrammes)
If Forms("F_exploitation").fra_analyse = 1 Then
' Si on a coché la case permettant d'afficher les pourcentages et que la série n'est pas la courbe
If Me.chk_pourcent And .ChartType <> 4 Then
.HasDataLabels = True ' On affiche les étiquettes
For i = 1 To .DataLabels.Count ' Pour chaque étiquette
If Forms("F_exploitation").fra_donnees = 3 Then ' Si il s'agit d'afficher les performances
.DataLabels(i).ShowValue = True ' L'étiquette affichera les valeurs
Else ' Sinon
' On calcule la somme du mois
totalMois = 0
For j = 2 To vlChart.SeriesCollection.Count
totalMois = totalMois + vlDataSheet.Range(VBA.Chr(64 + j) & i).Value
Next j
' Si cette somme est nulle, on lui attribue zéro sinon on lui attribue le %
If totalMois <> 0 Then
.DataLabels(i).Caption = round(100 * (vlDataSheet.Range(VBA.Chr(64 + X) & i).Value / totalMois), 0) & " %"
Else
.DataLabels(i).Caption = "0 %"
End If
End If
' Mise en forme des étiquettes
.DataLabels(i).Font.Size = 8
.DataLabels(i).Font.Background = xlBackgroundOpaque
.DataLabels(i).Interior.ColorIndex = 2
Next i
Else ' Sinon
.HasDataLabels = False ' On masque les étiquettes
End If
Else ' Sinon (si on est sur une analyse annuelle : courbes)
.HasDataLabels = Not .HasDataLabels
If .HasDataLabels Then
' Mise en forme des étiquettes
.DataLabels.Font.Size = 8
.DataLabels.Font.Background = xlBackgroundOpaque
.DataLabels.Interior.ColorIndex = 2
End If
End If
End With
Next X
End Sub
Private Sub chk_pourcent_Click()
AffPourcent ' Voir plus haut
End Sub
Private Sub Form_Open(Cancel As Integer)
Dim strSQL As String, strService As String, i As Integer
ajustFenetre
CommandBars("MenuForm").Enabled = True ' Active la barre de menus personnalisée
Set vlChart = Me.ole_graph.Object.Application.Chart
Set vlDataSheet = vlChart.Application.DataSheet
boolEditGraph = False
strService = " : Global QC"
' Modification de la source du graph en fonction des choix de l'utilisateur
With Forms("F_exploitation")
Select Case .fra_analyse
Case 1 ' Mensuelle => Histogramme
Me.lbl_etiquettes.Caption = "Afficher les pourcentages"
Select Case .fra_donnees
Case 1 ' Heures
vlChart.ChartType = xlColumnStacked
strSQL = cstRqt
Case 3 ' Performances
vlChart.ChartType = xlColumnClustered
strSQL = "TRANSFORM IIf(Sum([totalReel])=0,0,Round((Sum([Theorique])/Sum([totalReel]))*100,0)) & '%' AS Perf " & _
"SELECT Left([nomMois],4) AS Mois, '100 %' AS [100%] " & _
"FROM R_tableauMensuel " & _
"GROUP BY Left([nomMois],4), IDmois " & _
"ORDER BY IDmois "
End Select
If .fra_etat = 2 Then
strSQL = strSQL & "PIVOT nomService;"
Else
strSQL = strSQL & "PIVOT categorie;"
End If
Case 2 ' Annuelle => Courbe
vlChart.ChartType = xlLine
Me.lbl_etiquettes.Caption = "Afficher les valeurs"
Select Case .fra_donnees
Case 1 ' Heures
strSQL = "SELECT Left([nomMois],4) AS Mois, " & _
"round(Sum(Moy),0) AS Moyenne, round(Sum(totalReel),0) AS Réel, " & _
"round(Sum(Prev),0) AS Prévisionnel, round(Sum(Theorique),0) AS Théorique " & _
"FROM R_tableauMensuel " & _
"GROUP BY Left([nomMois],4), IDmois " & _
"ORDER BY IDmois;"
If .fra_etat = 2 Then strSQL = cstRqt & "PIVOT nomService;"
Case 3 ' Performances
strSQL = "SELECT Mois, ETP([Moyenne]," & DCount("*", "R_mois", "IDmois<>0") & "/12) AS [ETP moyen], " & _
"ETP([Réel],[NbreSemaine]) AS [ETP réel], " & _
"ETP([Prévisionnel],[NbreSemaine]) AS [ETP prévisionnel], " & _
"ETP([Théorique],[NbreSemaine]) AS [ETP théorique] " & _
"FROM R_annuelHeures " & _
"GROUP BY Mois, ETP([Moyenne]," & DCount("*", "R_mois", "IDmois<>0") & "/12), ETP([Réel],[NbreSemaine]), " & _
"ETP([Prévisionnel],[NbreSemaine]), ETP([Théorique],[NbreSemaine]), IDmois " & _
"ORDER BY R_annuelHeures.IDmois;"
If .fra_etat = 2 Then strSQL = "TRANSFORM ETP(Sum([totalReel]),[NbreSemaine]) AS ETP " & _
"SELECT Left([nomMois],4) AS Mois, Moyenne " & _
"FROM R_tableauMensuel " & _
"INNER JOIN (SELECT IDmois, Round((Sum([reel])/(29.75*[NbreSemaine]))/DCount('*','T_services','IDservice<>3'),1) AS Moyenne " & _
"FROM R_totalMensuel GROUP BY IDmois, NbreSemaine) AS R1 " & _
"ON R_tableauMensuel.IDmois = R1.IDmois " & _
"GROUP BY Left([nomMois],4), R_tableauMensuel.IDmois, R_tableauMensuel.NbreSemaine, R1.moyenne " & _
"ORDER BY R_tableauMensuel.IDmois " & _
"PIVOT R_tableauMensuel.nomService;"
End Select
End Select
Me.ole_graph.RowSource = strSQL
' Modification du titre de l'axe des ordonnées
If .fra_donnees = 1 Then
vlChart.Axes(xlValue).AxisTitle.Caption = "Nbre d'heures"
ElseIf .fra_analyse = 1 Then
vlChart.Axes(xlValue).AxisTitle.Caption = "%age"
Else
vlChart.Axes(xlValue).AxisTitle.Caption = "ETPs"
End If
' Changement du titre du graph
Select Case .fra_etat
Case 2
strService = " : Par service"
Case 3
.md_service.SetFocus
strService = " : " & .md_service.Text
End Select
vlChart.ChartTitle.Text = "Bilan des " & strTypDonnees & VBA.Chr(10) & _
" sur l'année " & .txt_annee & strService
If .chk_produit Then
.md_produit.SetFocus
vlChart.ChartTitle.Text = vlChart.ChartTitle.Text & " - " & .md_produit.Text
End If
End With
' Affecte le nom et le prénom de la personne loguée sous Windows à l'étiquette "Opérateur"
Me("lbl_operateur").Caption = "Opérateur : " & NomPrenom(VBA.Environ("USERNAME"))
End Sub
Private Sub ole_graph_Updated(Code As Integer)
Dim i As Integer
Set vlChart = Me.ole_graph.Object.Application.Chart
' Mise en forme du graphique
For i = 1 To vlChart.SeriesCollection.Count
With vlChart.SeriesCollection(i)
If i = 1 Then ' Pour la première série : moyenne ou référence
.ChartType = xlLine ' courbe
.Border.ColorIndex = 3 ' rouge
.Border.Weight = xlThick ' épais
Else
Select Case Forms("F_exploitation").fra_analyse
Case 1 ' Mensuelle(histogrammes)
.Border.ColorIndex = 1
.Border.Weight = xlThin
.Fill.TwoColorGradient msoGradientVertical, 1
Case 2 ' Annuelle(courbes)
.Border.ColorIndex = i + 2
.Border.Weight = xlMedium
End Select
End If
End With
Next i
End Sub |
Partager