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 :

Problèmes pour tracer des graphiques avec une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Août 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 1
    Par défaut Problèmes pour tracer des graphiques avec une macro
    Bonjour,

    Je suis actuellement en stage dans un bureau d'étude qui voudrait que je réalise un programme en vba. Mon problème: non seulement je débute en vba mais en plus je suis nulle en programmation...Bref, j'aurai besoin de votre aide!

    En gros, mon programme consiste à entrer des données de consommation d'un bâtiment et en sortir des graphes exploitables. En fait, j'ai déjà fait tout ça mois par mois et mon objectif est de tout "automatiser " avec un programmes en vba.

    Mais venons en aux problèmes:
    -je ne parviens pas à modifier la mise en page de mon graphique (supprimer la légende des abscisses qui m'est inutile, renommer celle des ordonnées et ajouter un titre)
    -toutes les valeurs correspondant aux "données en temps réel" sont des courbes avec une mise en page particulière (aucun trait pour la ligne de marquage et seulement des marqueurs de taille 2 et de couleur bleue). Mais je n'ai pas réussi à pas à le coder...

    Je vous met en PJ mon fichier excel si vous voulez jeter un œil. L'onglet "graphes souhaité" correspond au résultat que j'aimerai obtenir...
    Fichiers joints dans les discussions


    Je ne suis pas sûre de m'être bien fait comprendre...
    En tous cas, merci d'avance!

  2. #2
    Membre éclairé Avatar de Duddy
    Homme Profil pro
    Agent de maitrise
    Inscrit en
    Novembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Agent de maitrise
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2007
    Messages : 257
    Par défaut
    Bonjour le forum,

    Quand j'ai débuté, je me suis servi de l'enregistreur de macro inclus dans EXCEL.

    Si tu es sous 2007, tu trouveras l'enregistrement dans l'onglet développeur (affichable grâce aux options Excel case à cocher) ou pour une version antérieure dans "OUTILS => MACRO => enregistrer une macro)

    Une fois que tu as commencé ton enregistrement tu réalises ton graphe étape par étape, tu trouveras ton code dans Visual Basic et tu pourras à l'aide de tous les tutos présents sur le site mettre en forme et simplifier ton enregistrement.

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Dessiner deux courbes sur un graphique Excel VBA
    Citation Envoyé par Margoooot Voir le message
    je ne parviens pas à modifier la mise en page de mon graphique
    Cela peut vouloir dire que vous avez déjà une maquette du code VBA obtenue à partir du code généré par l'enregistreur de macro. Dans ce cas, postez votre code VBA entre les balises [code] et [/code]. Au moins cela situe le contexte et permet d'être précis en indiquant tel problème à tel n° de ligne.

    1. Maquette de code VBA pour dessiner deux courbes sur 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
    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
     
    ' 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
     
    ' Effacer toutes les courbes
    Sub CurveDelete()
        With ActiveSheet.ChartObjects
            While .Count > 0
                CleanSeriesColl .Item(1).Chart
                .Item(1).Delete
            Wend
        End With
    End Sub
    L'ordre est important. Si on fait un .Legend.LegendEntries(1).Delete avant l'appel de CurveAxis() ou si on définit le type de graphique après CurveSeries(), cela peut planter Excel. Il y a intérêt à sauvegarder avant d'exécuter la macro pendant la phase de développement sinon on peut perdre les derniers développements.

    2. Jeu de test et exécution de la maquette de génération d'un graphique

    Qui dit maquette, dit jeu de test le plus minimal possible :
    Sur la feuille vide, entrez de A1 à C6 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    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 d'Excel, copier-coller et valider par ENTER :
    Le graphique à deux courbes s'affiche.

    Tous les graphiques de la feuille sont effacés.

    3. Réponses aux questions

    Citation Envoyé par Margoooot Voir le message
    (supprimer la légende des abscisses, renommer celle des ordonnées et ajouter un titre)
    (
    aucun trait pour la ligne de marquage et seulement des marqueurs de taille 2 et de couleur bleue)
    Le plus utile pour définir les problèmes se trouve relégué entre parenthèses sur seulement deux lignes à comparer à la dizaine de lignes du message.

    Citation Envoyé par Margoooot Voir le message
    supprimer la légende des abscisses
    Activer la ligne 25 actuellement en commentaire pour supprimer la légende et mettre en commentaire les deux lignes suivantes.
    Alternativement pour n'enlever que la première légende "Ordonnée 1" des légendes, activer la ligne 28 en commentaire.

    Citation Envoyé par Margoooot Voir le message
    renommer celle des ordonnées
    Dans le cas où il s'agirait du titre de l'axe Y des ordonnées, indiquez le titre voulu lors de l'appel de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurveAxis chartObj.Chart, "Category (X) axis", "Value (Y) axis"
    Citation Envoyé par Margoooot Voir le message
    ajouter un titre
    pour le graphique ou les axes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            .HasTitle = True
            .ChartTitle.Characters.Text = "Chart Title"
    Voir le titre du graphique en ligne 20 et 21.

    Citation Envoyé par Margoooot Voir le message
    aucun trait pour la ligne de marquage et seulement des marqueurs de taille 2 et de couleur bleue
    Le problème est plus complexe et on ne sait pas trop s'il s'agit d'abscisse ou d'ordonnée. La maquette est un point de départ. Modifier CurveAxis() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                .MajorGridlines.Border.LineStyle = xlDot
                .MajorGridlines.Border.ColorIndex = colorFillGray
    Lignes 67-68 et/ou 75 à 78.

    4. Aide et outil pour explorer l'objet Chart

    Alors que l'enregistreur de macro génère un code basé sur ActiveChart, la maquette CurveNew() crée un ChartObject qui expose l'objet .Chart de même type qu'ActiveChart. Ceci permet de localiser le graphique en cordonnées Left, Width, Top et Height quand on ajoute le graphique par CharObjects.Add() en ligne 14.

    Au niveau de CurveSeries(), on trouve les variables temporaires serie1 et serie2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        With chartThis.SeriesCollection
            Set serie1 = .NewSeries
            With serie1
                .Values = rngY1
    Cela permet de bénéficier de l'auto-complétion en saisissant le séparateur "." entre objet et méthode ou propriété dans la zone entre With serie1 et End With.
    Dès qu'on entre le ".", on voit en info-bulle toutes les méthodes et propriétés accessible pour l'objet en question. L'info-bulle est également utile à la saisie des paramètres des méthodes.

    Idem dans CurveAxis() avec les variables temporaires axisOrdonnee et axisAbscisse.

    Vous pouvez également explorer l'objet Chart dans l'éditeur Visual Basic (Alt+F11) :
    Cliquez sur le menu "Navigateur d'objet" (Object Browser) (F2)
    Cherchez et explorer les méthodes et propriétés d'un objet relatif à Chart, Axis, etc.
    ___________

    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.

Discussions similaires

  1. Tracer un graphique avec une macro
    Par mohand78 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/02/2015, 01h07
  2. [VBA-E] Problème pour insérer des lignes dans une feuille Excel
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2007, 14h13
  3. Problème pour charger un set avec une clé étrangère
    Par sylvainv18 dans le forum Hibernate
    Réponses: 2
    Dernier message: 06/11/2006, 18h08
  4. Réponses: 6
    Dernier message: 22/11/2005, 17h08
  5. problème pour faire un insert avec une image
    Par vbcasimir dans le forum Modules
    Réponses: 3
    Dernier message: 02/11/2005, 09h21

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