XL 2016 Graphique en courbe VBA

james7734

XLDnaute Junior
Bonjour,

Je possède un fichier avec une macro qui me permet de lister, pour une date donnée, les noms de personnes ayant une note supérieur à 1.5 (onglet "Résultat"). Ce que j'aimerais, c'est de pouvoir sortir un graphique exactement similaire à celui de mon fichier exemple, mais sous VBA. C'est un graphique en courbe qui illustre toute la série historique des notes des personnes qui sont dans la liste (colonne B,C). Je ne peut pas modifier la disposition du 1er onglet (1 colonne sur 2, ...) et des nouvelles dates seront ajoutés au fur et à mesure.

Exemple: au 31/07/2020, Noemie, Nicolas, Jacques, sont les seuls individus ayant une note >1.5. Le graphique illustre l'évolution de leurs notes depuis le début.

L'objectif est de pouvoir générer ce graph via un bouton ou bien en même temps que sélection de la date.

Merci énormément !
 

Pièces jointes

  • evol.xlsm
    25.8 KB · Affichages: 20
Solution
Comme je l'ai dit dans le EDIT du message 2, il faut que les codename des feuilles soient identiques.
Si tu ne connais pas, le codename est le nom qui figure dans l'environnement du VBA, dans la colonne de gauche "Explorateur de projets" (voir dans Affichage si elle n'est pas présente), juste devant le nom de l'onglet (Feuil1, Feuil2...dans ton fichier). A ne pas confondre avec (Feuil1), (Feuil2)...entre parenthèses, qui sont des noms d'onglets d'un fichier dont les onglets n'ont pas encore été renommés.

Deux cas :
1- dans ton fichier existant, tu as (ou quelqu'un a) utilisé le codename dans le code VBA de tes SUB ou FUNCTION. Il faut conserver ces codenames existant (sous peine de faire des catastrophes!) et renommer ceux qui sont...

mécano41

XLDnaute Accro
Bonjour,

Regarde le fichier joint...
Les données sont mises par VBA dans une feuille spécifique (qui pourra être masquée)
Le bouton mise à jour refait les courbes (pas le graphique lui-même)

J'ai esssayé de le lancer en mettant le Call à la fin de ton sub mais cela produit un message bizarre qui parle de formules erronées alors que je n'ai pas vu de formule...je n'ai pas insisté et j'ai mis un bouton.

Si la date choisie ne renvoie pas de données en dessous et que l'on clique sur le bouton, j'ai mis un test qui évite une erreur VBA ; simplement le code ne fait rien.

Comme je nomme certaines cellules, il est normalement possible de modifier les lignes et les colonnes aux endroits indiqués si nécessaire...(voir la feuille Notes)

EDIT : j'ai oublié...je n'utilise pas le nom des onglets pour désigner les feuilles car si quelqu'un le modifie, le VBA ne fonctionne plus. Si tu recopies le code dans un autre fichier, il faut veiller à ce que le codename de la feuille soit le même que sur le présent fichier.

Cordialement
 

Pièces jointes

  • Copie de evol 1.xlsm
    48 KB · Affichages: 10
Dernière édition:

james7734

XLDnaute Junior
Bonjour,

Regarde le fichier joint...
Les données sont mises par VBA dans une feuille spécifique (qui pourra être masquée)
Le bouton mise à jour refait les courbes (pas le graphique lui-même)

J'ai esssayé de le lancer en mettant le Call à la fin de ton sub mais cela produit un message bizarre qui parle de formules erronées alors que je n'ai pas vu de formule...je n'ai pas insisté et j'ai mis un bouton.

Si la date choisie ne renvoie pas de données en dessous et que l'on clique sur le bouton, j'ai mis un test qui évite une erreur VBA ; simplement le code ne fait rien.

Comme je nomme certaines cellules, il est normalement possible de modifier les lignes et les colonnes aux endroits indiqués si nécessaire...(voir la feuille Notes)

EDIT : j'ai oublié...je n'utilise pas le nom des onglets pour désigner les feuilles car si quelqu'un le modifie, le VBA ne fonctionne plus. Si tu recopies le code dans un autre fichier, il faut veiller à ce que le codename de la feuille soit le même que sur le présent fichier.

Cordialement

Je te remercie énormement! C'est exactement ce que je voulais. Je suis en train de lire ton code pour le comprendre. Tu n'avais pas besoin de faire autant de détail pour le code mais merci!
Seulement, dans mon fichier original, la première colonne avec la 1ère date et série de notes commence en colonne 135 et non en colonne D (il y a des choses avant). Je ne suis pas sûr de quel donnée modifier dans le code?
De plus, mes onglets "Notes", "Resultats" et "Données de graphique" sont en feuille 3, 8 & 9. Y a t-il des changements a réaliser dans le code?
 
Dernière édition:

mécano41

XLDnaute Accro
Bonjour,

Dans les feuilles, tu peux rajouter des colonnes ou des lignes avant ; cela ne change rien...c'est pour cela que je travaille sur des cellules nommées. On est toujours amené à modifier quelque chose et c'est pour cela que j'utilise cette méthode. Seul le pas de 1 colonne sur deux que tu as utilisé pour les notes doit être respecté.

Cordialement
 

james7734

XLDnaute Junior
Bonjour,

Dans les feuilles, tu peux rajouter des colonnes ou des lignes avant ; cela ne change rien...c'est pour cela que je travaille sur des cellules nommées. On est toujours amené à modifier quelque chose et c'est pour cela que j'utilise cette méthode. Seul le pas de 1 colonne sur deux que tu as utilisé pour les notes doit être respecté.

Cordialement
Ah d'accord, je comprends maintenant. Et dernièrement, mes onglets "Notes", "Resultats" et "Données de graphique" sont en feuille 3, 8 & 9 sur mon fichier original. Y a t-il des changements a réaliser dans le code?
 

mécano41

XLDnaute Accro
Comme je l'ai dit dans le EDIT du message 2, il faut que les codename des feuilles soient identiques.
Si tu ne connais pas, le codename est le nom qui figure dans l'environnement du VBA, dans la colonne de gauche "Explorateur de projets" (voir dans Affichage si elle n'est pas présente), juste devant le nom de l'onglet (Feuil1, Feuil2...dans ton fichier). A ne pas confondre avec (Feuil1), (Feuil2)...entre parenthèses, qui sont des noms d'onglets d'un fichier dont les onglets n'ont pas encore été renommés.

Deux cas :
1- dans ton fichier existant, tu as (ou quelqu'un a) utilisé le codename dans le code VBA de tes SUB ou FUNCTION. Il faut conserver ces codenames existant (sous peine de faire des catastrophes!) et renommer ceux qui sont dans le fichier que je t'ai renvoyé (modif dans le code VBA et pour le codename des feuilles en utilisant des codenames différents de ceux de ton fichier d'origine. Le mieux serait dans ce cas de regarder les codenames de ce fichier et d'en mettre d'autres dans mon fichier, avant de copier le code

2- dans ton fichier existant, le codename n'a pas été utilisé. Il suffit alors de vérifier si les codename dans les deux fichiers correspondent bien à la même feuille, sinon, il suffit de changer ces codename en allant dans la fénêtre Propriétés de chaque feuille (si les 3 codename sont à permuter, il faut utiliser temporairement un 4ème nom car EXCEL ne veut évidemment pas nommer deux feuilles de façons identiques)

Cordialement
 

job75

XLDnaute Barbatruc
Bonjour james7734, mécano41,

Une autre manière de faire avec ces 2 macros dans le code de la feuille "Resultats" :
VB:
Private Sub Worksheet_Activate()
Worksheet_Change [C5] 'lance la macro
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim dat As Range, dest As Range, graph As Chart, i&, P As Range, col As Variant, a(), j%, n&, c As Range
Set dat = [C5]
If Intersect(Target, dat) Is Nothing Then Exit Sub
Set dest = [B7] '1ère cellule de destination, à adapter
Set graph = ChartObjects(1).Chart
Application.ScreenUpdating = False
'---RAZ---
dest.Resize(Rows.Count - dest.Row + 1, 2).ClearContents
For i = graph.SeriesCollection.Count To 1 Step -1
    graph.SeriesCollection(i).Delete
Next
If Not IsDate(dat) Then Exit Sub
'---filtrage du tableau source et création des séries---
With Sheets("Notes") 'adapter éventuellement
    Set P = Intersect(.Rows("15:" & .Rows.Count), .UsedRange.EntireRow)
End With
If P Is Nothing Then Exit Sub
col = Application.Match(dat, P.Rows(1), 0)
If IsError(col) Then Exit Sub
For Each c In P.Rows(1).Resize(, col).SpecialCells(xlCellTypeConstants, 1)
    ReDim Preserve a(j)
    a(j) = c.Text
    j = j + 1
Next
ThisWorkbook.Names.Add "X", a 'nom défini sur une matrice
For i = 5 To P.Rows.Count
    If P(i, col) > 1.5 Then 'critère à adapter
        n = n + 1
        dest(n) = P(i, 1)
        dest(n, 2) = P(i, col)
        j = 0: Erase a
        For Each c In P.Rows(i).Resize(, col).SpecialCells(xlCellTypeConstants, 1)
            ReDim Preserve a(j)
            a(j) = c
            j = j + 1
        Next c
        ThisWorkbook.Names.Add "Y_" & n, a 'nom défini sur une matrice
        graph.SeriesCollection.NewSeries
        graph.SeriesCollection(n).Name = dest(n)
        graph.SeriesCollection(n).XValues = "'" & ThisWorkbook.Name & "'!X"
        graph.SeriesCollection(n).Values = "'" & ThisWorkbook.Name & "'!Y_" & n
    End If
Next
End Sub
Elles s'exécutent automatiquement quand on modifie la cellule C5 ou qu'on active la feuille.

Noter qu'il n'y a pas besoin de feuille supplémentaire, on utilise des noms définis.

A+
 

Pièces jointes

  • evol(1).xlsm
    28.8 KB · Affichages: 8

Statistiques des forums

Discussions
312 161
Messages
2 085 843
Membres
103 003
dernier inscrit
Maxmarie14