Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2011, 14h15   #1
Invité de passage
 
Inscription : août 2009
Messages : 8
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 8
Points : 1
Points : 1
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 :
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
evx136 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 17h04   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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 :
1
2
3
 
Dim myChart As Chart
Set myChart=ActiveSheet.ChartObjects("Graphique 10")
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 14h19   #3
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/08/2011, 15h49   #4
Invité de passage
 
Inscription : août 2009
Messages : 8
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 8
Points : 1
Points : 1
Merci beaucoup, je vais essayer de transposer mon projet dans ce code et je vous tiens au courrant
evx136 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h51.


 
 
 
 
Partenaires

Hébergement Web