Bonjour,
Dans une macro, j'aimerai masquer un graphique (en cas de données sources vides, notamment).
J'ai cherché un peu, on m'a dit d'essayer ça:
Graphe.Visible = False
Mais ça ne marche pas.
Quelqu'un aurait une solution?
Merci d'avance.
Bonjour,
Dans une macro, j'aimerai masquer un graphique (en cas de données sources vides, notamment).
J'ai cherché un peu, on m'a dit d'essayer ça:
Graphe.Visible = False
Mais ça ne marche pas.
Quelqu'un aurait une solution?
Merci d'avance.
Je pense que tu peux trouver beaucoup de reponse par ici:
http://www.google.fr/search?hl=fr&q=...e+Google&meta=
Google fait des miracles pour trouver des réponses à tes questions:
Et n'oublie pas de cliquer sur resolue en bas si tu as trouvé la reponse à ta question.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ActiveSheet.ChartObjects("Graphique 1").Visible = False ActiveSheet.ChartObjects("Graphique 1").Visible = true
Bon courage
Bonjour
cela doit fonctionné:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Sub Macro1() ActiveSheet.Shapes("graph_1").Visible = False ("le nom de ton graph") End Sub
L'imagination est plus importante que le savoir.... A . Einstein. :pastaper:
https://www.developpez.net/forums/blogs/179588-cb_60/
Merci de cliquer sur :resolu:pour clore cette discussion.
Merci pour ces réponses, mais ça ne marche toujours pas.
Avec les Shapes, il y a erreur "L'élément portant ce nom est introuvable"
Avec ChartObjects, j'obtiens "Impossible de lire la propriété ChartObjects de la classe Worksheet"
D'ailleurs, le nom du graphique à entrer comme ChartObjects ou Shapes, est ce le titre du graphique, ou le nom du type 'nom du feuillet' + "Graphique" + 'Numéro du graphique'?
Voici le code
(ici, je prend pour exemple le graphique intitulé "Métier", mais à terme, le nom recherché sera en argument)
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 Private Sub OptiGraphe() Dim Nom As String Dim NumRow As Long Dim NumCol As Long Dim Plage As Range Dim GraphCible As Variant Dim i As Byte Nom = "Métier" 'Plage de recherche. Set Plage = Range("A1:S96") 'Recherche du tableau For Each r In Plage If r.Value Like Nom Then NumRow = r.Row NumCol = r.Column End If Next 'avertissement si le tableau n'existe pas If NumRow = 0 Then MsgBox ("Tableau " & Nom & " non trouvé. Assurez vous que ce nom existe bien") Else: MsgBox (" Tableau trouvé aux coordonnées: Numrow = " & NumRow & " ; NumCol = " & NumCol) End If 'Recherche du graphique ayant le titre correspondant For Each Graph In ActiveSheet.ChartObjects i = i + 1 ActiveSheet.ChartObjects(i).Activate If ActiveChart.ChartTitle.Text = Nom Then Set GraphCible = ActiveChart End If Next 'avertissement si le graphique n'existe pas If IsEmpty(GraphCible) Then MsgBox ("Graphique " & Nom & " non trouvé. Assurez vous qu'un graphique avec ce titre existe bien") Else: MsgBox ("Nom du graphe trouvé: " & GraphCible.Name) End If 'si la case sous le nom du tableau est vide, le graphique est masqué If (NumRow <> 0) Then If IsEmpty(ActiveSheet.Cells(NumRow + 1, NumCol)) Then ActiveSheet.ChartObjects("Métier").Visible = False MsgBox ("Tableau " & Nom & " caché") Else: ActiveSheet.ChartObjects("Métier").Visible = True End If End If End Sub
(J'éditerai plus tard pour ajouter un fichier xls d'exemple)
Une solution a te proposé mais je te garantit rien:
sur ton graphique fait bouton droit et clique sur fenetre graphique:
la tu verras le nom exact de ton graphique:
[classeur1.xls]Feuil1Graphique1
Même en rajoutant le nom du classeur entre crochets, les erreurs restent les mêmes.
Il y a pas des librairies spéciales à activer? des fonctions non compatibles excel 2003? une petite option que tout le monde oublie mais qu'il faut activer sous peine de tout planter?
Je viens de tester ton code:
Avec comme nom du titre du tableau et du graphique "Métiers"
J'ai conserver le nom du graphique par defaut "graphique 1" que tu peux trouver comme je t'ai dit en haut. le nom de ton graphique doit surement être à la place de Feuil1Graphique1
J'ai supprimer les ":" apres else à la fin.
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 Private Sub OptiGraphe_Click() Dim Nom As String Dim NumRow As Long Dim NumCol As Long Dim Plage As Range Dim GraphCible As Variant Dim i As Byte Nom = "Métier" 'Plage de recherche. Set Plage = Range("A1:S96") 'Recherche du tableau For Each r In Plage If r.Value Like Nom Then NumRow = r.Row NumCol = r.Column End If Next 'avertissement si le tableau n'existe pas If NumRow = 0 Then MsgBox ("Tableau " & Nom & " non trouvé. Assurez vous que ce nom existe bien") Else: MsgBox (" Tableau trouvé aux coordonnées: Numrow = " & NumRow & " ; NumCol = " & NumCol) End If 'Recherche du graphique ayant le titre correspondant For Each Graph In ActiveSheet.ChartObjects i = i + 1 ActiveSheet.ChartObjects(i).Activate If ActiveChart.ChartTitle.Text = Nom Then Set GraphCible = ActiveChart End If Next 'avertissement si le graphique n'existe pas If IsEmpty(GraphCible) Then MsgBox ("Graphique " & Nom & " non trouvé. Assurez vous qu'un graphique avec ce titre existe bien") Else: MsgBox ("Nom du graphe trouvé: " & GraphCible.Name) End If 'si la case sous le nom du tableau est vide, le graphique est masqué If (NumRow <> 0) Then If IsEmpty(ActiveSheet.Cells(NumRow + 1, NumCol)) Then ActiveSheet.ChartObjects("Graphique 1").Visible = False MsgBox ("Tableau " & Nom & " caché") Else ActiveSheet.ChartObjects("Graphique 1").Visible = True End If End If End Sub
J'ai recopié ton code (en corrigeant avec le nom du graphique), et toujours la même erreur:
Impossible de lire la propriété ChartObjects de la classe Worksheet
J'ai bien les mêmes références que toi (version 11.0 pour l'object library)
J'ai joint un classeur d'exemple.
J'ai corrigé à la fin et sa marche pour moi.
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 Private Sub OptiGraphe_Click() Dim Nom As String Dim NumRow As Long Dim NumCol As Long Dim Plage As Range Dim GraphCible As Variant Dim i As Byte Nom = "Métier" 'Plage de recherche. Set Plage = Range("A1:S96") 'Recherche du tableau For Each r In Plage If r.Value Like Nom Then NumRow = r.Row NumCol = r.Column End If Next 'avertissement si le tableau n'existe pas If NumRow = 0 Then MsgBox ("Tableau " & Nom & " non trouvé. Assurez vous que ce nom existe bien") Else: MsgBox (" Tableau trouvé aux coordonnées: Numrow = " & NumRow & " ; NumCol = " & NumCol) End If 'Recherche du graphique ayant le titre correspondant For Each Graph In ActiveSheet.ChartObjects i = i + 1 ActiveSheet.ChartObjects(i).Activate If ActiveChart.ChartTitle.Text = Nom Then Set GraphCible = ActiveChart End If Next 'avertissement si le graphique n'existe pas If IsEmpty(GraphCible) Then MsgBox ("Graphique " & Nom & " non trouvé. Assurez vous qu'un graphique avec ce titre existe bien") Else: MsgBox ("Nom du graphe trouvé: " & GraphCible.Name) End If 'si la case sous le nom du tableau est vide, le graphique est masqué If (NumRow <> 0) Then If IsEmpty(ActiveSheet.Cells(NumRow + 1, NumCol)) Then ActiveSheet.ChartObjects("Graphique 6").Visible = False MsgBox ("Tableau " & Nom & " caché") Else ActiveSheet.ChartObjects("Graphique 6").Visible = True End If End If End Sub
suivi des tests est le nom de ta feuille à ne pas mettre
J'ai compris pourquoi ca ne marchais pas au debut, tu n'as pas de graphique qui s'appelle Graphique 1 puisque le 1er graphique que tu as commence par graphique2
Aah ouf, ça marche aussi chez moi !
merci beaucoup de ton aide !
Par contre, juste un dernier truc: comment obtenir le nom du graphique sans le nom de la feuille?
La je ne peux te dire.
A la barbare tu peux rechercher le nom l'onglet, chercher le nombre de caractere de l'onglet. et enlever ce nombre au nom du graphique.
Exemple:
C'est une solution mais je pense qu'il existe une fonction pour trouver que le nom du graphique
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 'nom du graphique avec feuille: nom = feuillegraphique1 nbcar = len(nom) nom_onglet = ThisWorkbook.Name '(je suis pas sur de ce code à voir) nbcar2 = len(nom_onglet) nbcar3 = nbcar-nbcar2 nom_graph = right(nom,nbcar3)
Essai avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ChartObjects.Name
Impec !
Pour information, le "ChartObjects.Name" retourne "Chart 15" (dans mon document complet, c'est le 15eme graphique), tandis que le "ActiveChart.Name" retourne 'nom du feuillet' + "Chart 15"
Donc pour d'éventuelles personnes qui auraient le même problème que moi, voici le code finalisé:
(il reste certainement optimisable et beaucoup de msgbox sont à supprimer, mais au moins, ça marche !)
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 Public Sub OptiGraphe(Nom As String) Dim NumRow As Long Dim NumCol As Long Dim Plage As Range Dim GraphCible As Variant Dim i As Byte i = 0 'Plage de recherche. Set Plage = Range("A35:S96") 'Recherche du tableau For Each r In Plage If r.Value Like Nom Then NumRow = r.Row NumCol = r.Column End If Next 'avertissement si le tableau n'existe pas If NumRow = 0 Then MsgBox ("Tableau " & Nom & " non trouvé. Assurez vous que ce nom existe bien") Else: 'MsgBox (" Tableau trouvé aux coordonnées: Numrow = " & NumRow & " ; NumCol = " & NumCol) End If 'Recherche du graphique ayant le titre correspondant For Each Graph In ActiveSheet.ChartObjects i = i + 1 If ActiveSheet.ChartObjects(i).Chart.ChartTitle.Text = Nom Then Set GraphCible = ActiveSheet.ChartObjects(i) End If Next 'avertissement si le graphique n'existe pas If IsEmpty(GraphCible) Then MsgBox ("Graphique " & Nom & " non trouvé. Assurez vous qu'un graphique avec ce titre existe bien") Else: 'MsgBox ("Nom du graphe trouvé: " & GraphCible.Name) End If 'si la case sous le nom du tableau est vide, le graphique est masqué If (NumRow <> 0) Then If IsEmpty(ActiveSheet.Cells(NumRow + 1, NumCol)) Then ActiveSheet.ChartObjects(GraphCible.Name).Visible = False 'MsgBox ("Tableau " & Nom & " caché") Else ActiveSheet.ChartObjects(GraphCible.Name).Visible = True 'MsgBox ("Tableau " & Nom & " affiché") End If End If End Sub
Merci encore scully2501 !
edit: topic résolu et code revu (plus rapide)
Partager