2013-06-06 18 views
0

Bonjour,Excel 2010 .SetSourceData vba tableau

Je vais avoir un problème avec la sélection des plages pour .SetSourceData pour mon graphique à barres empilées.

Mes plages sont non-contiguës. La date de début est dans la colonne G, et le reste des nombres est calculé dans les colonnes V à AI.

Actuellement, cela ne représente que les colonnes V à AI, et utilise la colonne G comme étiquette d'axe horizontal. J'ai essayé d'ajouter la plage d'étiquettes de l'axe horizontal (colonne E) comme premier argument .range à Union, mais il affiche alors les colonnes E & F (je ne sais pas d'où F vient) comme le hoz. étiquette d'axe. Et la colonne G était introuvable. Existe-t-il un moyen de le faire avec SetSourceData, ou dois-je définir individuellement SeriesCollection pour toutes les 15 séries?

Voir ci-dessous le code:

Sub Create_Chart() 
' 
' Create_Chart Macro 
' 
Dim ganttChart As ChartObject 
Dim sourceRange As Range 

With Sheets("Projects") 
    Set sourceRange = Union(.Range("G1:G70"), .Range("V1:AI70")) 
End With 

Set ganttChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200) 

With ganttChart 
With .Chart 
    .ChartType = xlBarStacked 
    .Legend.Delete 
    .Parent.Width = 1224 
    .Parent.Height = 828 
    .SetSourceData Source:=sourceRange, PlotBy:=xlColumns 
    .Location Where:=xlLocationAsNewSheet 

    With .Axes(xlValue) 
     '.MinimumScale = 41428 
     '.MaximumScale = 41607 
     .MajorUnit = 7 
     .TickLabels.NumberFormat = "m/d" 
     .TickLabels.Font.Size = 6 
     .TickLabels.Font.Name = "Calibri" 
    End With 
    With .Axes(xlCategory) 
     .ReversePlotOrder = True 
     .TickLabelSpacing = 1 
     .TickLabels.NumberFormat = "@" 
     .TickLabels.Font.Size = 6 
     .TickLabels.Font.Name = "Calibri" 
    End With 
End With 
End With 
End Sub 

Répondre

0

Vous pouvez essayer de choisir la bonne plage source avant d'insérer le tableau. Excel peut commencer en utilisant la plage correcte, vous n'avez donc pas besoin de définir les données source.

Une approche alternative est d'ajouter une série à la fois:

Set ganttChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200) 

' clean up first 
' i declared as long 
For i = 1 to ganttChart.SeriesCollection.Count 
    ganttChart.SeriesCollection(1).Delete 
Next 

' rColumn declared as range 
For Each rColumn In Sheets("Projects").Range("V1:AI70").Columns 
    With ganttChart.NewSeries 
     .Values = rColumn 
     .XValues = Sheets("Projects").Range("G1:G70") 
    End With 
Next