IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Masquer une ou plusieurs series dans un graphique en vba


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 55
    Points : 75
    Points
    75
    Par défaut Masquer une ou plusieurs series dans un graphique en vba
    Bonjour,

    Je me tourne vers vous en dernier recour, après avoir cherché ma solution dans le FAQ.
    Je souhaiterai masquer une ou plusieurs séries dans un gragrahique excel et cela depuis un bouton de commande et des ChekBox pour choisir les séries à masquer
    Voici le début de code que j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Sub Com_Graph_Click()
     Sheets("Graphe").Select
        ActiveSheet.ChartObjects("Graphique 10").Activate
    If Me.CheckNb_PT = True Then
     
      With ActiveChart.SeriesCollection(1) '"Nb  PT"
     
         .MarkerStyle = xlAutomatic
         .Border.LineStyle = xlAutomatic
      End With
     Else
      ActiveSheet.ChartObjects("Graphique 10").Activate
         With ActiveChart.SeriesCollection(1)
     
         .MarkerStyle = xlNone
         .Border.LineStyle = xlNone
         End With
    End If
    '******************************************
    If Me.Check_FTP = True Then
         With ActiveChart.SeriesCollection(2) '"FTP"2
         .MarkerStyle = xlAutomatic
         .Border.LineStyle = xlAutomatic
      End With
     Else
         With ActiveChart.SeriesCollection(2)
         .MarkerStyle = xlNone
         .Border.LineStyle = xlNone
         End With
    End If
    '*********************************************************************
     If Me.CheckSN = True Then
          With ActiveChart.SeriesCollection(3) '"Quotité inutilisé Surnombre"
         .MarkerStyle = xlAutomatic
         .Border.LineStyle = xlAutomatic
      End With
     Else
         With ActiveChart.SeriesCollection(3)
         .MarkerStyle = xlNone
         .Border.LineStyle = xlNone
         End With
     
     End If
    End Sub
    Quand le code arrive à la ligne .MarkerStyle j'ai l'erreur 1004(impossible de définir la propriété MarkerStyle de la classe Série).

    Mais peut être que c'est tout simplement impossible.....
    Merci d'avance pour vos réponses

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Essaie peut-être d'instancier un objet Chart pour accéder à ton graphique (si pour une raison X ou Y ActiveChart.SeriesCollection() est en lecture seule...):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim myChart As Chart
    Set myChart=ActiveSheet.ChartObjects("Graphique 10")

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Dissimuler en série des courbes audacieuses VBA
    1. "Couvrez " cette série " que je ne saurois voir "

    Citation inspirée librement du Tartuffe, acte III scène 2 de Molière.

    Citation Envoyé par evx136 Voir le message
    Je souhaiterai masquer une ou plusieurs séries dans un graphique Excel ...
    Avez-vous la procédure pour récréer le graphique ?

    Citation Envoyé par evx136 Voir le message
    ... et cela depuis un bouton de commande et des CheckBox pour choisir les séries à masquer
    L'idée du CheckBox est non seulement de masquer une ou des séries pour simplifier le graphique mais également de les faire réapparaître à la demande.

    Citation Envoyé par evx136 Voir le message
    Quand le code arrive à la ligne .MarkerStyle j'ai l'erreur 1004 (impossible de (re) définir la propriété MarkerStyle de la classe Série).
    C'est assez osé de modifier les paramètres du graphique une fois qu'il a été créé car l'ordre de définitions des séries par rapport aux axes, légende et type du graphique est primordiale.
    Hors là, vous tentez de redéfinir a posteriori une propriété d'une série après que le graphique a été créé et donc après les paramètres de légende, axes, etc.
    Comme votre graphique a déjà été créé avec succès, lire en diagonale : Quand l'axe n'est plus légendaire. Cela donne une raison possible pour l'erreur 1004.

    Ce que l'on peut modifier dynamiquement sont les valeurs dessinées sur le graphique : essayez la courte animation de l'article : Courbe dans Excel animée périodiquement par VBA.

    Citation Envoyé par evx136 Voir le message
    Mais peut être que c'est tout simplement impossible.....
    Ce que l'on peut faire est de masquer ... définitivement une ou des séries d'un graphique.
    Le caractère définitif signifie que l'on efface la série sélectionnée par la CheckBox. C'est possible comme le montre la maquette ci-jointe.

    2. Résurrection de la série cachée

    Par contre pour refaire apparaître la série, il faudra effacer le graphique et le recréer entièrement ce qui est également faisable si on dispose d'une procédure équivalent à CurveNew() telle que celle présentée dans la maquette.

    L'utilisateur, qui clique sur la CheckBox pour revoir une série précédemment cachée, ne verra même pas que le graphique entier a en fait été recréé entre Application.ScreenUpdating = False et Application.ScreenUpdating = True respectivement en ligne 10 et 30.

    3. Maquette de code VBA pour cacher une série d'un graphique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit ' Chart avec deux series de valeurs
    Public Const colorFillBlue = 34
    Public Const colorFillPaleBlue = 37
    Public Const colorFillGray = 48
     
    ' Création d'un graphique à deux courbes
    Sub CurveNew()
    Dim chartObj As ChartObject, rngAbscisse As Range, rngOrdonnee1 As Range, rngOrdonnee2 As Range
     
        Application.ScreenUpdating = False
        Set rngAbscisse = Range("A2:A6")
        Set rngOrdonnee1 = Range("B2:B6")
        Set rngOrdonnee2 = Range("C2:C6")
        Set chartObj = ActiveSheet.ChartObjects.Add(Left:=50, Width:=500, Top:=100, Height:=300)
        With chartObj.Chart
            .ChartType = xlXYScatterSmoothNoMarkers ' Déclarer le type en premier
            CleanSeriesColl chartObj.Chart ' dans le cas où il y a des series par défaut
            CurveSeries chartObj.Chart, rngAbscisse, rngOrdonnee1, rngOrdonnee2, _
                "Ordonnée 1", "Ordonnée 2"
            .HasTitle = True
            .ChartTitle.Characters.Text = "Chart Title"
            .HasDataTable = False
            .PlotArea.Interior.ColorIndex = 0 'White
            CurveAxis chartObj.Chart, "Category (X) axis", "Value (Y) axis"
    '        .HasLegend = False
            .HasLegend = True
            .Legend.Position = xlLegendPositionBottom
    '        .Legend.LegendEntries(1).Delete ' Pour effacer 'Ordonnée 1' de la légende
        End With
        Application.ScreenUpdating = True
    End Sub
     
    ' Définition des deux séries de données
    Sub CurveSeries(chartThis As Chart, rngX As Range, rngY1 As Range, rngY2 As Range, _
                    ByVal strTitleY1 As String, ByVal strTitleY2 As String)
    Dim serie1 As Series, serie2 As Series
     
        With chartThis.SeriesCollection
            Set serie1 = .NewSeries
            With serie1
                .Values = rngY1
                .XValues = rngX
                .Name = strTitleY1
                .Border.Weight = xlMedium
            End With
            Set serie2 = .NewSeries
            With serie2
                .Values = rngY2
                .XValues = rngX
                .Name = strTitleY2
                .Border.Weight = xlMedium
            End With
        End With
    End Sub
     
    ' Axes du graphique
    Sub CurveAxis(chartThis As Chart, ByVal strTitleX As String, ByVal strTitleY As String)
    Dim axisAbscisse As Axis, axisOrdonnee As Axis
     
        With chartThis
            Set axisOrdonnee = .Axes(xlValue, xlPrimary)
            With axisOrdonnee
                .MaximumScale = 10
                .MinimumScale = 1
                .HasTitle = True
                .AxisTitle.Characters.Text = strTitleX
                .MajorGridlines.Border.LineStyle = xlDot
                .MajorGridlines.Border.ColorIndex = colorFillGray
                .MajorTickMark = xlTickMarkCross
            End With
            Set axisAbscisse = .Axes(xlCategory, xlPrimary)
            With axisAbscisse
                .HasTitle = True
                .AxisTitle.Characters.Text = strTitleY
                .MajorTickMark = xlTickMarkInside
                .TickLabelPosition = xlTickLabelPositionLow
                .MinorTickMark = xlTickMarkNone
                .TickLabels.Orientation = xlHorizontal
            End With
        End With
    End Sub
     
    ' Afficher tous les noms et n° des séries dans le graphique de n° indChartObj
    Sub CurveSerieDisplay(ByVal indChartObj As Integer)
    Dim chartObj As ChartObject, chartThis As Chart, serieThis As Series, indSerie As Integer
     
        If indChartObj < 0 Or indChartObj > ActiveSheet.ChartObjects.Count Then
            Warning "2000: CurveSerieDisplay : " & vbCrLf & _
                          "L'indice de ChartObjects n° " & indChartObj & " n'existe pas": Exit Sub
        End If
        Set chartObj = ActiveSheet.ChartObjects(indChartObj)
        Set chartThis = chartObj.Chart
        Debug.Print "Les séries dans le ChartObject n° " & indChartObj & " de nom """ & chartObj.Name & """ sont :"
        For indSerie = 1 To chartThis.SeriesCollection.Count
            Set serieThis = chartThis.SeriesCollection(indSerie)
            Debug.Print """" & serieThis.Name & """ a pour n° " & indSerie
        Next
    End Sub
     
    ' Efface la série n° indSerieToHide dans le ChartObject n° indChartObj
    Sub CurveSerieHide(ByVal indChartObj As Integer, ByVal indSerieToHide As Integer)
    Dim serieToHide As Series, chartObj As ChartObject, chartThis As Chart
     
        If indChartObj < 0 Or indChartObj > ActiveSheet.ChartObjects.Count Then
            Warning "1000: CurveSerieHide : " & vbCrLf & _
                          "L'indice de ChartObjects n° " & indChartObj & " n'existe pas": Exit Sub
        End If
        Set chartObj = ActiveSheet.ChartObjects(indChartObj)
        Set chartThis = chartObj.Chart
        If indSerieToHide < 0 Or indSerieToHide > chartThis.SeriesCollection.Count Then
            Warning "1100: CurveSerieHide : " & vbCrLf & _
                          "L'indice de series n° " & indSerieToHide & " n'existe pas dans " & chartObj.Name: Exit Sub
        End If
        Set serieToHide = chartThis.SeriesCollection(indSerieToHide)
        If chartThis.SeriesCollection.Count = 1 Then
            Debug.Print "Il n'y a plus de séries dans le graphique """ & chartObj.Name & """ !"
            Debug.Print "Ce graphique a été effacé."
            CurveDeleteNum indChartObj
        Else
            Debug.Print "La série n° " & indSerieToHide & " de nom """ & serieToHide.Name & """ a été effacée"
            serieToHide.Delete
        End If
    End Sub
     
    ' Effacer la collection des séries dans le graphique
    Private Sub CleanSeriesColl(chartThis As Chart)
        With chartThis
            On Error Resume Next
            Do
                .SeriesCollection(1).Delete
                If Err.Number > 0 Then Exit Do
            Loop Until False
            On Error GoTo 0
        End With
    End Sub
     
    ' Efface le ChartObject de n° indChartObj
    Sub CurveDeleteNum(ByVal indChartObj As Integer)
        If indChartObj < 0 Or indChartObj > ActiveSheet.ChartObjects.Count Then
            Warning "9000: CurveDel : " & vbCrLf & _
                          "L'indice de ChartObjects n° " & indChartObj & " n'existe pas": Exit Sub
        End If
     
        With ActiveSheet.ChartObjects
            CleanSeriesColl .Item(indChartObj).Chart
            .Item(indChartObj).Delete
        End With
    End Sub
     
    ' Effacer toutes les courbes
    Sub CurveDeleteAll()
        With ActiveSheet.ChartObjects
            While .Count > 0
                CurveDeleteNum 1 ' Premier ChartObject de la collection
            Wend
        End With
    End Sub
     
    ' Common error management
    Sub Warning(ByVal strMsg As String)
    Const lenErr = 4 ' Number of digits of the error code beginning the message
        If Err.Number <> 0 Then
            strMsg = strMsg + vbCrLf + "Error " + Str(Err.Number) + ": " + Err.Description
        End If
        MsgBox Mid(strMsg, lenErr + 3), vbExclamation, "Graphic warning " + Left(strMsg, lenErr)
    End Sub
    4. Jeu de test et exécution de la maquette pour cacher une série d'un graphique

    Voici le jeu de test le plus minimal possible de cette maquette.
    Sur la feuille vide, entrez de A1 à C6 :
    Abscisse	Ordonnée1	Ordonnée2
    1		2		1
    2		5		8
    3		4		7
    4		3		6
    5		1		5
    
    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE (Visual Basic Editeur) d'Excel, copier-coller et valider par ENTER :
    Le graphique à deux courbes s'affiche.

    Les séries dans le ChartObject n° 1 de nom "Chart 11" sont :
    "Ordonnée 1" a pour n° 1
    "Ordonnée 2" a pour n° 2


    En bleu foncé est le texte qu'affiche la procédure.

    On chercher à masquer le seconde série qui correspondrait dans votre graphique à la série "FTP"2 ou la dernière série "Quotité inutilisé Surnombre".
    La série n° 2 de nom "Ordonnée 2" a été effacée

    Effectivement sur la feuille, la série n° 2 a disparu dynamiquement du graphique.

    Les séries dans le ChartObject n° 1 de nom "Chart 11" sont :
    "Ordonnée 1" a pour n° 1


    Il n'y a plus de séries dans le graphique "Chart 11" !
    Ce graphique a été effacé.


    On peut le recréer avec CurveNew() en début de session.
    ___________

    Si la discussion est résolue, vous pouvez cliquer sur le bouton

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 55
    Points : 75
    Points
    75
    Par défaut
    Merci beaucoup, je vais essayer de transposer mon projet dans ce code et je vous tiens au courrant

Discussions similaires

  1. affichage de valeurs d'une serie dans un graphique
    Par anaylane dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/04/2010, 10h53
  2. Réponses: 9
    Dernier message: 08/01/2008, 13h58
  3. Réponses: 4
    Dernier message: 27/05/2007, 19h09
  4. ajouter une ou deux séries dans un graphique
    Par rob2-9 dans le forum Access
    Réponses: 1
    Dernier message: 11/08/2006, 13h40
  5. [VB]Rajout d'une ou plusieurs frame dans une frame
    Par ept35 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/02/2006, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo