FAQ VBAConsultez toutes les FAQ

Nombre d'auteurs : 10, nombre de questions : 133, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireExcelGraphiques

Il en existe vraiment plusieurs, je ne vais vous donner ici que les principales. Par interprétation de la selection. Ce type de création est peu souple et souvent source d'erreur.

 
Sélectionnez
Range("A1").CurrentRegion.Select
ThisWorkbook.Charts.Add

Le graphique créera des abscisses par défaut. Cela veut dire aussi qu'une plage sélectionnée avant la création d'un graphique sera tracée à la création de celui-ci. Avec SourceData. Si votre tableau est continu avec les abcisses à gauche, c'est la méthode la plus rapide

 
Sélectionnez
Dim objChart As Chart, objRange As Range

    Set objRange = Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(1, 1), Worksheets("Feuil1").Cells(21, 3))
    Set objChart = ThisWorkbook.Charts.Add
    objChart.ChartType = xlXYScatter
    objChart.SetSourceData objRange, xlColumns

Il existe une autre syntaxe équivalente

 
Sélectionnez
Dim objChart As Chart, objRange As Range

    Set objRange = Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(1, 1), Worksheets("Feuil1").Cells(21, 3))
    Set objChart = ThisWorkbook.Charts.Add
    objChart.ChartType = xlXYScatter
    objChart.SeriesCollection.Add objRange, xlColumns, True, True

Par manipulation de séries

 
Sélectionnez
Dim objChart As Chart, objRange As Range, MaSerie As Series, compteur As Long

    Set objRange = Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(1, 1), Worksheets("Feuil1").Cells(21, 3))
    Set objChart = ThisWorkbook.Charts.Add
    objChart.ChartType = xlXYScatter
    objChart.SeriesCollection.Add objRange, xlColumns, True, True
    For compteur = 2 To objRange.Columns.Count
        Set MaSerie = objChart.SeriesCollection.NewSeries
        MaSerie.Values = "=" & objRange.Columns(compteur).Address(True, True, xlR1C1, True)
        MaSerie.XValues = "=" & objRange.Columns(1).Address(True, True, xlR1C1, True)
    Next compteur
Créé le 3 février 2004  par bidou

Il faut d'abord créer le graphique puis manipuler les séries

 
Sélectionnez
Public Sub CreationGraphe1()

    Dim MonGraphe As Chart, MaPlage As Range

    Set MaPlage = Worksheets("donnees").Range(Cells(2, 7), Cells(14, 12))
    Set MonGraphe = ThisWorkbook.Charts.Add
    MonGraphe.ChartType = xlColumnStacked100
    MonGraphe.SetSourceData MaPlage, xlColumns
With MonGraphe.SeriesCollection(5)
    .ChartType = xlXYScatterSmoothNoMarkers
    .AxisGroup = 2
     With .Border
         .Weight = xlMedium
         .LineStyle = xlAutomatic
         .ColorIndex = 4
     End With
End With
With MonGraphe
   .HasTitle = True
   With .ChartTitle
      .Characters.Text = "ANNEE 2001"
      .Shadow = True
      .Border.Weight = xlHairline
   End With
   With .Axes(xlValue, xlPrimary)
      .HasTitle = True
      .AxisTitle.Characters.Text = "Proportion"
   End With
   With .Axes(xlValue, xlSecondary)
      .HasTitle = True
      .AxisTitle.Characters.Text = "Total (hrs)"
   End With
End With

End Sub
Créé le 3 février 2004  par bidou

Il est possible de manipuler des objets Shapes sur une feuille graphique

 
Sélectionnez
ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 100, 100, 100#, 100#).Select 
 Selection.Characters.Text = "Le Texte"
Créé le 6 février 2004  par DarkVader

Cette procédure permet de boucler sur tous les onglets du classeur et de lister les feuilles graphiques (Charts) ainsi que les graphiques incorporés (ChartObjects).

vba
Sélectionnez

Private Sub CommandButton1_Click()
    Dim j As Byte, i As Byte
    Dim Ch As Chart
    
    'Recherche les onglets graphiques
    For Each Ch In Charts
            Debug.Print "Feuille graphique " & vbTab & Ch.Name
    Next Ch
    
    'Boucle sur tous les onglets du classeur
    For j = 1 To Sheets.Count
         'Recherche les graphiques incorporés dans la feuille
        For i = 1 To Sheets(j).ChartObjects.Count
            Debug.Print "Nom: " & Sheets(j).ChartObjects(i).Name & vbTab & _
            " dans " & Sheets(j).Name
        Next i
    Next j
End Sub
Créé le 22 octobre 2006  par SilkyRoad

Cet exemple vérifie si un graphique nommé "Graphique 1" existe dans la Feuil2

vba
Sélectionnez

Dim Grph As ChartObject 
    On Error Resume Next 
    Set Grph = Sheets("Feuil2").ChartObjects("Graphique 1") 
    If Not Grph Is Nothing Then MsgBox "Le graphique existe"
Créé le 22 octobre 2006  par SilkyRoad

La première partie de la procédure permet de remplir deux tableaux.
Ces tableaux sont ensuite utilisés pour alimenter les valeurs d'ordonnées et d'abscisses.

vba
Sélectionnez

Sub creationGraphiqueParTableau()
    Dim i As Byte
    Dim Tableau(10) As Integer, Tableau2(10) As Integer
    
    'Création du tableau pour les Abscisses
    For i = 1 To 10
        Tableau(i) = i * 2
    Next i
    
    'Création d'un tableau pour les Ordonnées
    For i = 1 To 10
        'Le tableau est rempli par des valeurs aléatoires pour
        'cet exemple
        Tableau2(i) = Int((50 * Rnd) + 1)
    Next i
    
    'Création graphique
    Charts.Add
    'Définit la localisation du graphique:
    'dans la feuille de calcul Feuil1 pour cet exemple
    ActiveChart.Location _
    Where:=xlLocationAsObject, Name:="Feuil1"
    
    'Ajoute une série dans le graphique
    With ActiveChart
        .SeriesCollection.NewSeries
        .SeriesCollection(1).XValues = Tableau() 'Abscisses
        .SeriesCollection(1).Values = Tableau2() 'Ordonnées
        'Définit le type (Courbe)
        .ChartType = xlLine
    End With
End Sub

Remarque:
Cette méthode est limitée par le nombre de caractères que vous pourrez insérer dans la barre de formules (La fonction qui s'affiche lorsque vous sélectionnez une série dans le graphique)
Par exemple:
=SERIE(;{0.1.2.3.4.5.6.7.8.9.10};{36.13.10.45.21.44.40.19.49.44};1)

Cette limite est d'environ 450 caractères.

Créé le 22 octobre 2006  par SilkyRoad

Cet exemple exporte un graphique au format image GIF pour ensuite l'insérer comme image de fond dans le commentaire d'une cellule.

Cette solution prend un peu d'espace mémoire mais permet de stocker avantageusement un graphique (ou plutôt son image) quand on manque de place dans une feuille de calcul.

vba
Sélectionnez

Sub ImageGraphiqueDansCommentaire_CelluleA1()
    Dim nomImage As String
    Dim Grph As ChartObject
    Dim Hauteur As Single, Largeur As Single

    nomImage = "C:\imageTemp.gif"
    
    'Définit le 1er graphique dans la Feuil1
    Set Grph = Feuil1.ChartObjects(1)
    'Exporte le graphique au format image GIF
    Grph.Chart.Export nomImage, "GIF"
    
    'récupère la dimension du graphique pour l'appliquer au commentaire
    Hauteur = Grph.Height
    Largeur = Grph.Width

    'Vérifie s'il existe déja un commentaire dans la cellule A1
    'et le supprime si c'est le cas
    If Not Feuil1.Range("A1").Comment Is Nothing Then _
        Feuil1.Range("A1").Comment.Delete
    
    'Creation du nouveau commentaire dans la cellule A1
    With Feuil1.Range("A1")
        .AddComment
        .Comment.Visible = False
        'Définit la hauteur du commentaire
        'le graphique
        .Comment.Shape.Height = Hauteur
        'Définit la largeur du commentaire
        .Comment.Shape.Width = Largeur
        'Insère l'image dans le commentaire
        .Comment.Shape.Fill.UserPicture nomImage
    End With
    
    'Supprime l'image exportée
    Kill nomImage
    
    'Supprime le graphique
    Grph.Delete
End Sub
Créé le 22 octobre 2006  par SilkyRoad

Si vous utilisez un graphique de type histogramme composé de plusieurs séries, vous pouvez spécifier qu'une des séries doit être de type courbe (Pour par exemple créer une ligne de repère).

vba
Sélectionnez

'Définit un type d'affichage spécifique pour la 1ere série du graphique 
'xlLine = Courbe  
Feuil1.ChartObjects(1).Chart.SeriesCollection(1).ChartType = xlLine
Créé le 22 octobre 2006  par SilkyRoad

Lorsqu'un graphique a perdu ses liaisons vers la source de données, la question peut se poser de savoir comment extraire les différentes valeurs contenues dans chaque série.
Une solution consiste à boucler sur tous les points afin d'en récupérer les valeurs.
Les étiquettes doivent impérativement être affichées (HasDataLabel = True) pour que les données puissent être récupérées.

vba
Sélectionnez

Sub extractionValeursOrdonnees_Series()
    Dim Cible As ChartObject
    Dim i As Integer, j As Integer
    
    'Définit le 1er graphique de la Feuil1
    Set Cible = Feuil1.ChartObjects(1)
    
    'Boucle sur toutes les séries du graphique
    For j = 1 To Cible.Chart.SeriesCollection.Count
        
        'Récupère le nom de la série
        Debug.Print Cible.Chart.SeriesCollection(j).Name & ":"
        
        'boucle sur tous les points de la série
        For i = 1 To Cible.Chart.SeriesCollection(j).Points.Count
        
            With Cible.Chart.SeriesCollection(j).Points(i)
                'Affiche les étiquettes
                .HasDataLabel = True
                'Extrait la valeur du point
                Debug.Print .DataLabel.Characters.Text
                'Masque les étiquettes
                .HasDataLabel = False
            End With
        
        Next i
        
    Debug.Print "----"
    Next j
End Sub
Créé le 22 octobre 2006  par SilkyRoad

Cette procédure permet d'afficher (en pourcentage) l'évolution des valeurs d'une série en fonction du point précédent.

La macro boucle sur tous les points d'une série, calcule le rapport entre 2 points et ajoute le résultat dans une étiquette (DataLabel).

vba
Sélectionnez

Sub afficherEvolutionPourcentage_enFonctionDuPointPrecedent()
    'Remarque : les labels ne seront pas mis à jour automatiquement
    'si les données sont modifiées dans le tableau
    Dim j As Integer
    Dim X As Single, Y As Single
    Dim Resultat As String
    Dim Grph As ChartObject
    
    'Définit le graphique cible dans la Feuil1
    Set Grph = Feuil1.ChartObjects(1)
    
    On Error Resume Next
        'suppression des Labels existants dans la 1ere série
        Grph.Chart.SeriesCollection(1).DataLabels.Delete
    On Error GoTo 0
    
    'affiche les Labels (Ordonnées) de la 1ere série
    'pour en extraire les valeurs
    Grph.Chart.SeriesCollection(1).ApplyDataLabels _
            Type:=xlDataLabelsShowValue
    
    'boucle sur les point de la 1ere serie (en dehors du premier point)
    For j = 2 To Grph.Chart.SeriesCollection(1).Points.Count
        
        X = Grph.Chart.SeriesCollection(1).Points(j). _
                DataLabel.Characters.Text 'valeur du point
        Y = Grph.Chart.SeriesCollection(1).Points(j - 1). _
                DataLabel.Characters.Text 'valeur du point précédent
        
        'Insère le pourcentage pour chaque point de la série.
        'Cette ligne est placée avant la ligne
        '"Resultat = Format((X / Y) - 1, "0.00%")" et permet ainsi
        'de ne rien afficher pour le 1er point.
        Grph.Chart.SeriesCollection(1).Points(j - 1). _
                DataLabel.Characters.Text = Resultat
        
        'calcul le pourcentage entre les 2 points
        Resultat = Format((X / Y) - 1, "0.00%")
    Next j
    
    'Affiche le pourcentage pour le dernier point de la série
    Grph.Chart.SeriesCollection(1).Points(j - 1).DataLabel. _
            Characters.Text = Resultat

    'Mise en forme des étiquettes
    With Grph.Chart.SeriesCollection(1).DataLabels
            .Font.ColorIndex = 5 'couleur bleue
            .Position = xlLabelPositionAbove 'position au dessus du point
            .Orientation = xlUpward 'orientation verticale (vers le haut)
    End With

End Sub

Remarques:
La procédure ne gère pas les cellules vides (division par 0).
Les étiquettes ne seront pas mises à jour automatiquement si les données sont modifiées dans les cellules.

Créé le 22 octobre 2006  par SilkyRoad

Cet exemple imprime le 2eme graphique de la Feuil1 :

vba
Sélectionnez

Feuil1.ChartObjects(2).Chart.PrintOut

Pour imprimer une feuille graphique, utilisez :

vba
Sélectionnez

Charts("Graph1").PrintOut
Créé le 22 octobre 2006  par SilkyRoad

Cette procédure evenementielle doit être placée au niveau du classeur "ThisWorkBook"
La macro boucle les feuilles graphiques et annule le mode Couper ou Copier si l'onglet qui vient d'être désactivé est trouvé dans la collection.

vba
Sélectionnez

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Dim Ch As Chart
    
    'Boucle sur la collection de feuilles graphiques    
    For Each Ch In Charts
        If Ch.Name = Sh.Name Then Application.CutCopyMode = False
    Next Ch
End Sub

Une autre possibilité, en utilisant l'evenement Deactivate du graphique :

vba
Sélectionnez

Private Sub Chart_Deactivate()
   Application.CutCopyMode = False
End Sub
Créé le 22 octobre 2006  par SilkyRoad
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.