Graphiques dynamiques

Tempio

XLDnaute Occasionnel
Bonjour à tous les génies du VBA,
J'aimerais faire une réalisation avec mon classeur Excel SVP. Je vous explique cmt ca fonctionne :
Chaque jour, je crée un nouvel onglet (par copie de celui d'hier) dans lequel j'ai des données (Elles varient chaque jour). Et chaque onglet porte le nom de la date d'ouverture (Exple : 02-08-2012). La dernière feuille de mon classeur se nomme "Graphe". Elle contient le graphe des données d'un des onglets précédants.
Mon problème est que je suis toujours obligé de mettre le graphe à jour chaque fois que je crée un nouvel onglet. J'aimerais avoir un petit menu déroulant sur la feuille "Graphe" contenant dynamiquement les noms de toutes les feuilles de données du classeur. Et lorsque je sélectionne un onglet dans le menu, le graphe se charge directement avec les données de celui ci.

PS : Les onglets de données sont identiques (tableaux) sauf les valeurs des tableaux qui changent.
Merci d'avance.
 

Misange

XLDnaute Barbatruc
Re : Graphiques dynamiques

Bonjour
Je plussoie, ça doit ben être possible tout ça :confused:. MAis avec un petit classeur exemple surement mieux encore. Ou alors en cherchant déjà avec graphique dynamique sur le forum ? par exemple dans les liens qui figurent automatiquement en bas de page ?
un autre mot clé important : Tableaux (au sens excel du terme) pour avoir des graphiques dynamiques automatiquement
Ce lien n'existe plus
 

Misange

XLDnaute Barbatruc
Re : Graphiques dynamiques

Je te propose une autre approche, plus simple à mon avis et moins risquée.
Tel que tu es parti, tu crées un onglet par jour avec peu de données par onglet. Tu alourdis considérablement ton classeur en faisant cela par rapport au fait de faire un seul onglet que tu filtres aisément.
J'ai mis dans l'exemple toutes tes données dans un même tableau au sens excel du terme (onglet accueil/style/mettre sous forme de tableau)
Toutes les données que tu ajoutes juste en dessous s'intègrent automatiquement et tes graphiques s'ajustent tout seul.
Il te suffit de remplir la première colonne (impératif de répéter la date à chaque ligne). Ensuite sur le haut de la colonne, tu utilises les flèches pour sélectionner le jour que tu veux. Aucune formule, aucune macro, risque d'erreur très très limité et ça reste léger...
 

Pièces jointes

  • Copie de Tempio.xlsx
    39.9 KB · Affichages: 64

Tempio

XLDnaute Occasionnel
Re : Graphiques dynamiques

Je te propose une autre approche, plus simple à mon avis et moins risquée.
Tel que tu es parti, tu crées un onglet par jour avec peu de données par onglet. Tu alourdis considérablement ton classeur en faisant cela par rapport au fait de faire un seul onglet que tu filtres aisément.
J'ai mis dans l'exemple toutes tes données dans un même tableau au sens excel du terme (onglet accueil/style/mettre sous forme de tableau)
Toutes les données que tu ajoutes juste en dessous s'intègrent automatiquement et tes graphiques s'ajustent tout seul.
Il te suffit de remplir la première colonne (impératif de répéter la date à chaque ligne). Ensuite sur le haut de la colonne, tu utilises les flèches pour sélectionner le jour que tu veux. Aucune formule, aucune macro, risque d'erreur très très limité et ça reste léger...

Merci à toi Misange, je vais voir dans quelle mesure je peux travailler avec ta solution. Mais j'aimerais quand même paraméter le fichier selon ma 1ere demande. Pour l'exemple, j'ai juste mis 2 tableau mais il y en a 10, pareille pour les graphe parce que chaque tableau a un graph.
 

ROGER2327

XLDnaute Barbatruc
Re : Graphiques dynamiques

Bonjour à tous


Ci-joint un classeur que j'ai fait à une autre occasion. Il ne répond pas à la demande spécifique de Tempio, mais il peut montrer une voie possible.​



ROGER2327
#6206


Vendredi 20 Tatane 139 (Saint Tiberge, frère quêteur - fête Suprême Quarte)
15 Thermidor An CCXX, 6,2015h - brebis
2012-W31-4T14:53:01Z
 

Pièces jointes

  • Classeur999.xlsm
    29.8 KB · Affichages: 79

Misange

XLDnaute Barbatruc
Re : Graphiques dynamiques

Merci à toi Misange, je vais voir dans quelle mesure je peux travailler avec ta solution. Mais j'aimerais quand même paraméter le fichier selon ma 1ere demande. Pour l'exemple, j'ai juste mis 2 tableau mais il y en a 10, pareille pour les graphe parce que chaque tableau a un graph.

Le nombre de tableaux ou de graphiques n'est pas un problème avec la solution que je te propose. L'as tu regardée en détail ? La solution de Roger te conviendra très bien sinon je pense.
 

Tempio

XLDnaute Occasionnel
Re : Graphiques dynamiques

Merci à toi Roger2327, ta solution tend plus ou moins dans ce sens. Sauf que j'ai une question, tu exclues manuellement les feuilles "Feuil1" et "Feuil7" alors que je compte créer de nouvelles feuilles chaque jour. A moins que je ne les nomme jamais "Feuil7" j'imagine. Je résume : "Feuil1" représente ma feuille des graphes et les autres de "Feuil2 à Feuil6" mes feuilles de données. J'essaie de paramétrer et voir ce que ca donne. Je vous tiens informés, surtout n'allez pas loin svp lol.
 

ROGER2327

XLDnaute Barbatruc
Re : Graphiques dynamiques

Bonjour à tous

Merci à toi Roger2327, ta solution tend plus ou moins dans ce sens. Sauf que j'ai une question, tu exclues manuellement les feuilles "Feuil1" et "Feuil7" alors que je compte créer de nouvelles feuilles chaque jour. A moins que je ne les nomme jamais "Feuil7" j'imagine. (...)
Le classeur que j'ai joint plus haut n'est pas une réponse spécifique mais une base de travail. Son code prévoit effectivement de recenser les feuilles visibles à l'exception de celles recensées dans la ligne
Code:
    Exclure = Array(0, "Feuil1", "Feuil5")
de la fonction NOnglet. Si on ajoute des onglets dont le nom de feuille ne figure pas dans cette ligne de code, ils seront pris en compte. Si on ne veut exclure aucun onglet, on réduira la ligne de code à
Code:
    Exclure = Array(0)

Ceci dit, rien n'empêche de modifier le code pour l'adapter à vos desiderata...​



ROGER2327
#6212


Dimanche 22 Tatane 139 (Ubu ès Liens - fête Suprême Seconde)
17 Thermidor An CCXX, 0,2399h - lin
2012-W31-6T00:34:32Z
 

Tempio

XLDnaute Occasionnel
Re : Graphiques dynamiques

Ok Roger2327, j'ai un autre petit soucis stp. Dans ton modèle, tu gères seulement un tableau de données pour 1 graphe. Comment puis-je gérer plusieurs tableaux et plusiseurs graphes ? De la même manière que c'est fait déjà avec le 1er modèle mais seulement avec 2 ou 3 autres graphes en plus. C'est à dire qu'on rajoute d'autres tableaux dans les Feuil2, Feuil3 qui auront leurs graphes dans Feuil1. Merci encore !
 

ROGER2327

XLDnaute Barbatruc
Re : Graphiques dynamiques

Bonjour à tous


Ok Roger2327, j'ai un autre petit soucis stp. Dans ton modèle, tu gères seulement un tableau de données pour 1 graphe. Comment puis-je gérer plusieurs tableaux et plusiseurs graphes ? De la même manière que c'est fait déjà avec le 1er modèle mais seulement avec 2 ou 3 autres graphes en plus. C'est à dire qu'on rajoute d'autres tableaux dans les Feuil2, Feuil3 qui auront leurs graphes dans Feuil1. Merci encore !
Pour traiter plusieurs graphiques, il faudrait reprendre le code de la feuille 1 et reproduire plusieurs fois la partie​
VB:
With Me.Range("x")
    .Resize(, 2).ClearContents
    Sheets(Cible.Value).Range("DATA").Copy Destination:=Me.[C5]
    If .Cells(1) = "" Then .Cells(1) = 0: .Cells(1, 2) = Empty
    If Err.Number <> 0 Then
        .Cells(1).Offset(-1, 1) = Cible.Value
        MsgBox "Pas de données valables dans l'onglet " & Cible.Value & "."
    End If
    ChartObjects("Graphique 1").Activate
    With ActiveChart: .ChartTitle.Select: .ChartTitle.Text = Me.[D5]: End With
End With
en modifiant les paramètres pour chaque graphique. Ça va devenir rapidement fastidieux et lourdingue...

Il vaut mieux envisager de créer une boucle paramétrée. De plus, ma première proposition est assez simpliste (inutile de fignoler tant qu'on est pas sûr que la proposition suscite de l'intérêt). Voici une nouvelle proposition plus sérieuse, mais un plus complexe. J'ai commenté le code de façon assez sommaire. S'il le faut, demandez des détails.

Le code est en partie dans le module de la feuille Feuil000 (onglet Graphique) :​
VB:
Private Sub Worksheet_Activate()
'Cette procédure met à jour la liste des onglets et des feuilles qu'on veut traiter dans la plage "B6:C..".
'Elle est exécutée lors de l'activation de l'onglet "Graphique".
Dim i%, Nfl$, v
    Nfl = "SREP" 'Nom de la plage contenant la liste des onglets.
'Effacement de la liste et suppression de la liste, si une liste préexiste :
    With Application: .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = -4135: End With
    On Error Resume Next
    If Range(Nfl).Rows.Count > 1 Then Range(Nfl).Offset(1).Resize(Range(Nfl).Rows.Count - 1, 2).Clear
    Names(Nfl).Delete
    On Error GoTo 0
'Récupération de la liste par la fonction 'NOngletFeuille'.
    v = NOngletFeuille(Array(0, Me.CodeName, "Feuil1"), False, False)
'Création de la plage nommée "SREP" et formatage de la zone de destination de la liste :
    With Range("B6"): .Parent.Names.Add Name:=Nfl, RefersTo:="=" & Me.Name & "!" & .Resize(v(0), 1).Address: .Resize(1, 2).Copy Range(Nfl): End With
'Affichage de la liste.
    Range(Nfl).Resize(, 2).Value = v(1)
    With Application: .Calculation = -4105: .EnableEvents = 1: .ScreenUpdating = 1: End With
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Cible As Range, Valider As Boolean)
'Cette procédure met à jour les graphiques après un double_clic sur un des éléments de la liste "SREP".
    MAJGraph Cible, Range("SREP")
    Valider = True
End Sub

Private Sub Worksheet_Change(ByVal Cible As Range)
'Cette procédure met à jour les graphiques après sélection d'un des éléments de la liste déroulante de la cellule "B5".
Dim i%, Msg$, gPrm(), Plg As Range
    MAJGraph Cible, Range("B5")
End Sub

Private Sub MAJGraph(ByVal Cible As Range, ByRef oPlg As Range) 'Version paramétrée.
'Cette procédure effectue la mise à jour des graphiques.
Dim i%, Msg$, gPrm(), Plg As Range
    If Not Intersect(Cible, oPlg) Is Nothing Then
'Paramètres des graphiques : tableau de tableaux.
'Array("Graphique 1", "DATA_1", "x_1", 5) défintit les paramètres du graphique "Graphique 1", prenant ses données
'dans la plage nommée "DATA_1" de chacun des onglets concernés pour les placer dans la plage nommée "x_1" de
'l'onglet "Graphique". Le 5 final indique que les données occupent cinq colonnes.
        gPrm = Array(Array("Graphique 1", "DATA_1", "x_1", 5), Array("Graphique 2", "DATA_2", "x_2", 3), Array("Graphique 3", "B24:C28", "R6:R9", 2))
'Le code qui suit ne présente pas de difficulté particulière.
        With Application: .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = -4135: End With
        If Cible <> "" Then
            For i = 0 To UBound(gPrm) 'Boucle sur chaque graphique.
                On Error GoTo E1
                With Me.Range(gPrm(i)(2))
                    ChartObjects(gPrm(i)(0)).Activate
                    On Error Resume Next
                    Set Plg = Sheets(Cible.Value).Range(gPrm(i)(1))
                    On Error GoTo E2
                    .Resize(UBound(ActiveChart.SeriesCollection(1).Values), gPrm(i)(3)).Clear
                    .Cells(1) = " ": .Cells(1, 2) = Empty
                    If Plg Is Nothing Then
                        Msg = Msg & "Pas de données valables pour le graphe «" & gPrm(i)(0) & "» dans l'onglet «" & Cible.Value & "»." & vbLf
                    Else
                        Plg.Copy Destination:=.Cells(1, 1).Offset(-1)
'La ligne suivante est facultative : elle supprime les éventuelles formules qui auraient pu être copiées dans l'onglet "Cible".
                        With .Cells(1, 1).Offset(-1).Resize(Plg.Rows.Count, Plg.Columns.Count): .Value = .Value: End With
                        Set Plg = Nothing
                    End If
                    On Error Resume Next
                    With ActiveChart.ChartTitle: .Select: .Text = Cible.Value & " (" & gPrm(i)(0) & ")": End With
                End With
F1:         Next
            On Error GoTo 0
            Cible.Activate
        End If
        With Application: .Calculation = -4105: .EnableEvents = 1: .ScreenUpdating = 1: End With
        If Msg <> "" Then MsgBox Msg
    End If
Exit Sub
E2: MsgBox "...une erreur imprévue est survenue.", vbOKOnly, "I apologize..."
E1: Resume F1
End Sub
et en partie dans le module Fonctions :​
VB:
Function NOngletFeuille(Optional Exclure As Variant, Optional Opt1 As Boolean, Optional Opt2 As Boolean, Optional No%)
'    Code révisé le 26 Thermidor CCXX * ROGER2327 fecit.
'
'Cette fonction a pour l'objet l'extraction des noms des onglets (et des feuilles sous-jacentes) à traiter.
'Elle renvoie un tableau à deux éléments : premièrement le nombre d'onglets à traiter, deuxièmement un tableau
'à deux colonnes contenant les noms des dits onglets et feuilles sous-jacentes.
'Description de son paramétrage (tous les paramètres sont optionnels) :
'   Exclure     :   tableau à une dimension contenant :
'                        1°un item vide ou contenant un entier quelconque ;
'                        2°la liste des feuilles à exclure de la recherche.
'                   Par défaut, aucune feuille n'est exclue de la recherche : Exclure = Array(0)
'   Opt1        :   False ---> Les feuilles cachées sont exclues de la recherche. (Valeur par défaut)
'                   True  ---> Les feuilles cachées recherchées.
'   Opt2        :   False ---> Les feuilles de la liste d'exclusion ne sont pas recherchées. (Valeur par défaut)
'                   True  ---> La liste d'exclusion est ignorée.
'                   (Ce dernier paramètre peut paraître inutile puisqu'il permet d'ignorer la liste d'exclusion.
'                   En fait, s'il est inutile dans le cas présent, il est utile dans d'autres cas pour lesquels
'                   cette fonction a été initialement écrite.)
'   No          :   nombre maximum d'onglets à trouver. Par défaut : nombre de feuilles de calcul du classeur.
'
Dim i%, k%, Opt%, Tmp$, v$(), fl As Worksheet
    If No = 0 Then No = ThisWorkbook.Worksheets.Count
    If IsMissing(Exclure) Then Exclure = Array(0)
    Exclure(0) = UBound(Exclure)
    ReDim v(1 To No, 1 To 2)
    Opt = Opt1 + 2 * Opt2
    With ThisWorkbook
        For Each fl In .Worksheets
            With .VBProject: Tmp = fl.CodeName: End With
            Tmp = fl.CodeName
            Select Case Opt
                Case 0
                    If fl.Visible = xlSheetVisible Then
                        For i = 1 To Exclure(0)
                            If Tmp = Exclure(i) Then Exit For
                        Next
                        If i > Exclure(0) Then k = k + 1: v(k, 1) = fl.Name: v(k, 2) = Tmp
                    End If
                Case -1
                    For i = 1 To Exclure(0)
                        If Tmp = Exclure(i) Then Exit For
                    Next
                    If i > Exclure(0) Then k = k + 1: v(k, 1) = fl.Name: v(k, 2) = Tmp
                Case -2
                    If fl.Visible = xlSheetVisible Then
                        k = k + 1: v(k, 1) = fl.Name: v(k, 2) = Tmp
                    End If
                Case -3
                    k = k + 1: v(k, 1) = fl.Name: v(k, 2) = Tmp
            End Select
            If k = No Then Exit For
        Next
    End With
    NOngletFeuille = Array(k - (k = 0), v)
End Function

Voyez si vous pouvez en tirer quelque chose.​



ROGER2327
#6239


Mardi 3 Phalle 139 (Zebb, passe - partout - fête Suprême Quarte)
26 Thermidor An CCXX, 6,8842h - myrthe
2012-W33-1T16:31:19Z
 

Pièces jointes

  • XLD_189737_Traitement dynamique de graphiques multiples.xlsm
    61.3 KB · Affichages: 51

Tempio

XLDnaute Occasionnel
Re : Graphiques dynamiques

Grand Merci à toi ROGER2327, je viens de télécharger le fichier joint. Je le regarde et essaie de le paramétrer avec ce que je veux faire, puis je vous tiens informés de ce que cela a donné. Bonne journée et à la prochaine !
 

Tempio

XLDnaute Occasionnel
Re : Graphiques dynamiques

Salut ROGER2327, je viens d'ouvrir le fichier et je me demandais s'il était vrmt nécessaire qu'on ramène les tableaux dans l'onglet "Graphique" derrière les graphes. J'aurais juste besoin d'afficher des graphes qui sont alimentés par les données provenants d'autres onglets "01-08-2012". Merci d'avance !
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 330
Messages
2 087 347
Membres
103 526
dernier inscrit
HEC