Microsoft 365 Procédure appelée depuis une procédure qui ne s'éxécute pas totalement

Heodrene

XLDnaute Occasionnel
Supporter XLD
Bonjour à tous,

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
 
Dernière édition:

Heodrene

XLDnaute Occasionnel
Supporter XLD
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 Dranreb,

Merci pour ta contribution, j'ai cependant du mal à comprendre ce que tu nommes "exemplaire".
Concretement, comment dois-je modifier mon code ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Heodrene :), @Dranreb ;),

Le code ci-dessous semble fonctionner :
  • pas de sélection
  • 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
 

Pièces jointes

  • Heodrene-Macro & Graphique- v1b.xlsm
    26.5 KB · Affichages: 6
Dernière édition:

Dranreb

XLDnaute Barbatruc
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.
 

Heodrene

XLDnaute Occasionnel
Supporter XLD
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.
 

Pièces jointes

  • Exemple.xlsm
    62.8 KB · Affichages: 5

Phil69970

XLDnaute Barbatruc
Bonjour à tous

Juste en passant j'aime bien leur fonction
1640710348565.png

:D:D:D

Pour certain c'est pas de l’anonymisation :D

1640710619568.png


Bonne fêtes
 

Dranreb

XLDnaute Barbatruc
Ceci par exemple met le truc en rouge :
VB:
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
 

Heodrene

XLDnaute Occasionnel
Supporter XLD
Ceci par exemple met le truc en rouge :
VB:
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).
 

Heodrene

XLDnaute Occasionnel
Supporter XLD
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.
 

Heodrene

XLDnaute Occasionnel
Supporter XLD
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.

Un truc m'échappe...
 

Dranreb

XLDnaute Barbatruc
&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.
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.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 811
dernier inscrit
caroline29260