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 19/08/2011, 09h23   #1
Invité de passage
 
Inscription : août 2011
Messages : 1
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 1
Points : 0
Points : 0
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!
Margoooot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2011, 21h05   #2
Membre actif
 
Avatar de Duddy
 
Homme Marc
Agent de maitrise
Inscription : novembre 2007
Messages : 243
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 45
Localisation : France

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

Informations forums :
Inscription : novembre 2007
Messages : 243
Points : 186
Points : 186
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.
__________________
Bon courage à toi.
Duddy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 17h19   #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 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 :
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 :
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 :
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 :
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 :
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 :
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.
MattChess 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 16h26.


 
 
 
 
Partenaires

Hébergement Web