Sub ColorierBarresHistogramme()
Const FeuilleParam As String = "Catégories"
Const GreyOtherBar As Boolean = False
Dim objChart As chart
Dim objSeries As Series
Dim i As Long, j As Long
Dim wsCat As Worksheet
Dim objCatDict As Object
Dim lgLastRow As Long
Dim strCatName As String
Dim boByCategorie As Boolean
On Error GoTo erreur
If TypeName(Selection) <> "ChartArea" And TypeName(Selection) <> "PlotArea" Then
MsgBox "Veuillez sélectionner le graphique (histogramme) à modifier.", vbExclamation
Exit Sub
End If
Set objChart = ActiveChart ' Récupère le graphique sélectionné
Set wsCat = ActiveWorkbook.Sheets(FeuilleParam)
Set objCatDict = CreateObject("Scripting.Dictionary") ' Création du dictionnaire
lgLastRow = wsCat.Cells(70000, "A").End(xlUp).Row
For i = 2 To lgLastRow
If wsCat.Cells(i, 1).Value <> "" Then
objCatDict(Trim(LCase(wsCat.Cells(i, 1).Value))) = wsCat.Cells(i, 2).Interior.Color
End If
Next i
For Each objSeries In objChart.SeriesCollection ' Parcourt toutes les séries du graphique
strCatName = Trim(LCase(objSeries.Name))
If objCatDict.exists(strCatName) Then
objSeries.Format.Fill.ForeColor.RGB = objCatDict(strCatName)
Else
For j = 1 To objSeries.Points.Count
strCatName = Trim(LCase(objSeries.XValues(j))) ' On uniformise la casse et supprime les espaces
If objCatDict.exists(strCatName) Then
objSeries.Points(j).Format.Fill.ForeColor.RGB = objCatDict(strCatName)
Else
If GreyOtherBar Then objSeries.Points(j).Format.Fill.ForeColor.RGB = RGB(200, 200, 200)
End If
Next j
End If
Next objSeries
Set objChart = Nothing
Set wsCat = Nothing
Set objCatDict = Nothing
MsgBox "Couleurs mises à jour pour le graphique sélectionné.", vbInformation
Exit Sub
erreur:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical, "Erreur ColorierBarresHistogramme"
End Sub