web-dev-qa-db-fra.com

Comment créer un graphique Excel qui extrait des données de plusieurs feuilles?

J'ai les chiffres des ventes mensuelles stockés dans des feuilles séparées. J'aimerais créer un graphique des ventes de plusieurs produits par mois. Chaque produit serait représenté par une ligne de couleur différente sur le même graphique, chaque mois suivant l'axe x.

Quel est le meilleur moyen de créer un graphique à une seule ligne à partir des mêmes cellules relatives sur plusieurs feuilles?

7
AlanKley

Utilisez l'assistant graphique.

A l'étape 2 sur 4, il y a un onglet intitulé "Série". Il y a 3 champs et une zone de liste sur cet onglet. La liste contient les différentes séries que vous incluez déjà dans le graphique. Chaque série possède à la fois un champ "Nom" et un champ "Valeurs" spécifiques à cette série. Le dernier champ est le champ "Étiquettes d'axe de catégorie (X)", commun à toutes les séries.

Cliquez sur le bouton "Ajouter" sous la liste. Cela ajoutera une série vierge à votre liste. Notez que les valeurs de "Nom" et de "Valeurs" changent lorsque vous mettez une série en surbrillance dans la zone de liste.

Sélectionnez votre nouvelle série.

Il y a une icône dans chaque champ du côté droit. Cette icône vous permet de sélectionner des cellules dans le classeur pour extraire les données. Lorsque vous cliquez dessus, le Wizard se cache temporairement (sauf pour le champ dans lequel vous travaillez), vous permettant ainsi d'interagir avec le classeur. 

Sélectionnez la feuille appropriée dans le classeur, puis sélectionnez les champs avec les données que vous souhaitez afficher dans le graphique. Vous pouvez cliquer sur le bouton situé à droite du champ pour afficher l’Assistant.

J'espère que cela pourra aider.

EDIT: Ce qui précède s’applique à 2003 et avant. Pour 2007, lorsque le graphique est sélectionné, vous devriez pouvoir effectuer une action similaire à l'aide de l'option "Sélectionner des données" de l'onglet "Conception" du ruban. Cela ouvre une boîte de dialogue listant la série pour le graphique. Vous pouvez sélectionner la série exactement comme dans Excel 2003, mais vous devez utiliser les boutons "Ajouter" et "Modifier" pour définir une série personnalisée.

6
Marc Reside

Voici du code d'Excel 2010 qui pourrait fonctionner. Il a quelques spécificités (comme le filtrage des caractères mal encodés dans les titres), mais il a été conçu pour créer plusieurs graphiques multi-séries à partir de données à 4 dimensions contenant à la fois des données absolues et des pourcentages. Modifiez-le comme bon vous semble:

Sub createAllGraphs()

Const chartWidth As Integer = 260
Const chartHeight As Integer = 200




If Sheets.Count = 1 Then
    Sheets.Add , Sheets(1)
    Sheets(2).Name = "AllCharts"
ElseIf Sheets("AllCharts").ChartObjects.Count > 0 Then
    Sheets("AllCharts").ChartObjects.Delete
End If
Dim c As Variant
Dim c2 As Variant
Dim cs As Object
Set cs = Sheets("AllCharts")
Dim s As Object
Set s = Sheets(1)

Dim i As Integer


Dim chartX As Integer
Dim chartY As Integer

Dim r As Integer
r = 2

Dim curA As String
curA = s.Range("A" & r)
Dim curB As String
Dim curC As String
Dim startR As Integer
startR = 2

Dim lastTime As Boolean
lastTime = False

Do While s.Range("A" & r) <> ""

    If curC <> s.Range("C" & r) Then

        If r <> 2 Then
seriesAdd:
            c.SeriesCollection.Add s.Range("D" & startR & ":E" & (r - 1)), , False, True
            c.SeriesCollection(c.SeriesCollection.Count).Name = Replace(s.Range("C" & startR), "Â", "")
            c.SeriesCollection(c.SeriesCollection.Count).XValues = "='" & s.Name & "'!$D$" & startR & ":$D$" & (r - 1)
            c.SeriesCollection(c.SeriesCollection.Count).Values = "='" & s.Name & "'!$E$" & startR & ":$E$" & (r - 1)
            c.SeriesCollection(c.SeriesCollection.Count).HasErrorBars = True
            c.SeriesCollection(c.SeriesCollection.Count).ErrorBars.Select
            c.SeriesCollection(c.SeriesCollection.Count).ErrorBar Direction:=xlY, Include:=xlBoth, Type:=xlCustom, Amount:="='" & s.Name & "'!$F$" & startR & ":$F$" & (r - 1), minusvalues:="='" & s.Name & "'!$F$" & startR & ":$F$" & (r - 1)
            c.SeriesCollection(c.SeriesCollection.Count).ErrorBar Direction:=xlX, Include:=xlBoth, Type:=xlFixedValue, Amount:=0

            c2.SeriesCollection.Add s.Range("D" & startR & ":D" & (r - 1) & ",G" & startR & ":G" & (r - 1)), , False, True
            c2.SeriesCollection(c2.SeriesCollection.Count).Name = Replace(s.Range("C" & startR), "Â", "")
            c2.SeriesCollection(c2.SeriesCollection.Count).XValues = "='" & s.Name & "'!$D$" & startR & ":$D$" & (r - 1)
            c2.SeriesCollection(c2.SeriesCollection.Count).Values = "='" & s.Name & "'!$G$" & startR & ":$G$" & (r - 1)
            c2.SeriesCollection(c2.SeriesCollection.Count).HasErrorBars = True
            c2.SeriesCollection(c2.SeriesCollection.Count).ErrorBars.Select
            c2.SeriesCollection(c2.SeriesCollection.Count).ErrorBar Direction:=xlY, Include:=xlBoth, Type:=xlCustom, Amount:="='" & s.Name & "'!$H$" & startR & ":$H$" & (r - 1), minusvalues:="='" & s.Name & "'!$H$" & startR & ":$H$" & (r - 1)
            c2.SeriesCollection(c2.SeriesCollection.Count).ErrorBar Direction:=xlX, Include:=xlBoth, Type:=xlFixedValue, Amount:=0
            If lastTime = True Then GoTo postLoop
        End If

        If curB <> s.Range("B" & r).Value Then

            If curA <> s.Range("A" & r).Value Then
                chartX = chartX + chartWidth * 2
                chartY = 0
                curA = s.Range("A" & r)
            End If

            Set c = cs.ChartObjects.Add(chartX, chartY, chartWidth, chartHeight)
            Set c = c.Chart
            c.ChartWizard , xlXYScatterSmooth, , , , , True, Replace(s.Range("B" & r), "Â", "") & " " & s.Range("A" & r), s.Range("D1"), s.Range("E1")

            Set c2 = cs.ChartObjects.Add(chartX + chartWidth, chartY, chartWidth, chartHeight)
            Set c2 = c2.Chart
            c2.ChartWizard , xlXYScatterSmooth, , , , , True, Replace(s.Range("B" & r), "Â", "") & " " & s.Range("A" & r) & " (%)", s.Range("D1"), s.Range("G1")

            chartY = chartY + chartHeight
            curB = s.Range("B" & r)
            curC = s.Range("C" & r)
        End If

        curC = s.Range("C" & r)
        startR = r
    End If

    If s.Range("A" & r) <> "" Then oneMoreTime = False ' end the loop for real this time
    r = r + 1
Loop

lastTime = True
GoTo seriesAdd
postLoop:
cs.Activate

End Sub
0
Kev