Je travaille sur une macro Excel qui a pour objectif de changer sur un graphe dynamique la couleur du dernier histogramme.
Comme j'ai deux graphes à traiter, je souhaite rationaliser mon code en appelant une procédure depuis la procédure principale en faisant passer en paramétre le nom du graphe.
Pour une raison qui m'échappe, j'ai le comportement suivant :
- La procédure principale s'exécute et appelle bien la sous-procédure
- La sous-procédure s'éxécute jusqu'à la sélection du graphe
- Puis sans raison, elle arrête son éxécution et retour à la pocédure principale.
La procédure princiaple :
VB:
Private Sub Test()
Dim GraphNom As Variant
On Error Resume Next
Application.ScreenUpdating = False
GraphNom = "_GraphCollab01"
HistoCouleur GraphNom
ThisWorkbook.Worksheets("Salaire - Calculette").Range("B2").Select
Application.ScreenUpdating = True
End Sub
La sous-procédure (elle sort à l'éxécution de la ligne 6 :
Code:
Private Sub HistoCouleur(ByVal GraphNom As String)
With ThisWorkbook
With Worksheets("Salaire - Calculette")
With ChartObjects(GraphNom)
.Activate
.FullSeriesCollection(1).Select
End With
End With
ActiveChart.FullSeriesCollection(1).Points(ActiveChart.SeriesCollection(1).Points.Count).Select
With Selection.Format.Fill
.Visible = msoTrue
.ForeColor.ObjectThemeColor = msoThemeColorAccent6
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
.Solid
End With
End With
End Sub
Bonjour.
Au lieu de transmettre un nom d'objet, il vaut mieux transmettre carrément son exemplaire. Aussi en ByVal, sinon il transmet une zone contenant l'adresse de l'exemplaire au lieu de transmettre directement celle ci.
Bonjour.
Au lieu de transmettre un nom d'objet, il vaut mieux transmettre carrément son exemplaire. Aussi en ByVal, sinon il transmet une zone contenant l'adresse de l'exemplaire au lieu de transmettre directement celle ci.
la dernière barre prend la couleur de fond de la cellule F20
Edit : Version v1b avec les bons types pour les déclarations des variables et qui s’exécute depuis n'importe quelle feuille active.
Le code:
VB:
Sub Test()
Dim GraphNom As String
On Error Resume Next
Application.ScreenUpdating = False
GraphNom = "_GraphCollab01"
HistoCouleur GraphNom
Application.Goto Worksheets("Salaire - Calculette").Range("B2")
Application.ScreenUpdating = True
End Sub
Sub HistoCouleur(ByVal GraphNom As String)
Dim monGraphic As Chart, maSerie As Series, mesPoints As Points, monPoint As Point
With Worksheets("Salaire - Calculette")
Set monGraphic = .ChartObjects(GraphNom).Chart
Set maSerie = monGraphic.FullSeriesCollection(1)
Set mesPoints = maSerie.Points
Set monPoint = mesPoints(mesPoints.Count)
With monPoint.Format.Fill
.Visible = msoTrue
.ForeColor.RGB = Worksheets("Salaire - Calculette").Range("f20").Interior.Color
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
.Solid
End With
End With
End Sub
Concrètement l'exemplaire c'est le jeu de propriétés de l'expression objet, et techniquement la valeur de celle ci en est l'adresse. Joins le classeur, que je puisse tester. Et déjà comprendre ce qui se passe. Je soupçonne que le graphe ne puisse pas être activé parce qu'il n'est pas sur la feuille active. Mais dans ce cas il me semble que ça devrait provoquer une erreur.
Merci à tous les deux ! @mapomme : je vais tester ta proposition @Dranreb : ci-joint le fichier exemple.
J'ai entretemps modifié quelque peu mon code pour mon besoin (sans succès) :
- Feuille "Rémunération - Calculette" ;
- Utilisateur test "Collab08" (Utilisateur test car possède une donnée pour 2022. Idéalement, j'aimerais tester si le collaborateur sélectionné en B1 a une donnée pour 2022 existante ou pas. La donnée en question est tirée du tableau de la feuille "Collaborateurs", colonne M (Rémunération annuelle) ;
- Lorsque je modifie la cellule B9, l'histogramme de l'année 2022 (sous condition que la donnée existe) et uniquement lui, doit passer vert ;
- Lorsque je change de collaborateur (liste déroulante en cellule B1), l'histogramme doit reprendre sa couleur d'origine avant de changer de collaborateur.
Private Sub Test()
HistoCouleur Worksheets("Rémunération - Calculette") _
.ChartObjects("_GraphCollab01").Chart.FullSeriesCollection(1), &HFF&
End Sub
Private Sub HistoCouleur(ByVal Série As Series, ByVal HistoCoul As Long)
Série.Points(Série.Points.Count).Format.Fill.ForeColor.RGB = HistoCoul
End Sub
Private Sub Test()
HistoCouleur Worksheets("Rémunération - Calculette") _
.ChartObjects("_GraphCollab01").Chart.FullSeriesCollection(1), &HFF&
End Sub
Private Sub HistoCouleur(ByVal Série As Series, ByVal HistoCoul As Long)
Série.Points(Série.Points.Count).Format.Fill.ForeColor.RGB = HistoCoul
End Sub
Bon, rien à dire, ca fait le taf et je t'en remercie.
Sous le contrôle de Dranreb : pour ceux qui se poseraient la question, la couleur est passée avec le paramétre &HFF&. Cela correspond au code hexadécimal #FF0000 (Rouge)
Pour le vert que je souhaite, ce paramétre sera &H70AD47& (Par exemple).
J'ai un effet de bord curieux : le code &H4472C4& est bien le code couleur bleu par défaut mais l'histogramme ressort... Marron !!!
Le code suivant permet de récupérer la couleur par défaut :
VB:
Selection.Format.Fill.Visible = msoTrue
Mais ce n'est pas ce que je veux utiliser.
Question : y a t-il un équivalent que je puisse passer en paramètre dans la fonction ?
J'ai essayé naïvement msoTrue au llieu d'un code couleur, pas d'erreur : toute la partie de l'histogramme (histogramme + grille) est blanche.
J'ai un effet de bord curieux : le code &H4472C4& est bien le code couleur bleu par défaut mais l'histogramme ressort... Marron !!!
Le code suivant permet de récupérer la couleur par défaut :
VB:
Selection.Format.Fill.Visible = msoTrue
Mais ce n'est pas ce que je veux utiliser.
Question : y a t-il un équivalent que je puisse passer en paramètre dans la fonction ?
J'ai essayé naïvement msoTrue au llieu d'un code couleur, pas d'erreur : toute la partie de l'histogramme (histogramme + grille) est blanche.
Je me réponds à moi-même.
La bonne écriture du code couleur est &HC47244 et non &H4472C4.
Ce qui est étonnant puisque pour la couleur vert l'ordre RGB est bien respecté, dans le cas présent il faut inverser.
&H4472C4 c'est Mi-rouge mi-orange plutôt foncé lég. délavé
&HC47244 c'est Mi-bleu mi-azur plutôt foncé lég. délavé
&HFF0000 c'est Bleu, c'est &H0000FF& qui est Rouge.
Vérifiez à l'aide de ce classeur.
Mise au point facile de jeux de couleurs pour UserForm, Shape et cellules, voire images calculées. Possibilité de capturer un pixel n'importe où sur l'écran. Module de classe Couleur pour utilisation dans d'autres projets VBA.
www.excel-downloads.com
Oui ben le vert est au milieu alors …
Mais effectivement dans les codes de couleurs Excel et VBA les poids Rouge et Bleu sont intervertis par rapport à d'autres applications.
Notez que vous pouvez spécifier RGB(R, V, B) si vous voulez, c'est bien un Long.
Le module de classe Couleur du classeur CouleurCls.xlsm permet aussi de calculer des couleurs.