Graphique et zones de données non contigües
Bonjour à tous et merci d'avance,
Malgré mes recherches je ne trouve pas la bonne méthode pour satisfaire mon besoin: j'ai sur une feuille une plage de données X a un endroit et mes valeurs Y dans une autre (jusque là, tout est normal). Ces 2 plages sont des lignes et je boucle pour générer des graphiques pour chacune des lignes de valeurs Y. X reste constant.
Or je n'arrive pas à trouver une syntaxe dans "ActiveChart.SetSourceData Source:=" qui me permettent de générer un graphique pour une ligne.
J'ai essayé "Union"; "ActiveChart.FullSeriesCollection(1).Values" mais quelle que soit la méthode avec laquelle je déclare mon Range de données j'ai droit à une erreur (En général "Erreur 91")
Ci dessous mon bout de code quasimodo:
For i = NbEt + 13 To NbEt + 13 + NbActeur - 1
Set Data = Union(Range(Cells(NbEt + 12, 17), Cells(NbEt + 12, NbCol + 17)), Range(Cells(i, 17), Cells(i, NbCol + 17)))
Set GraphRepTemp = ActiveSheet.ChartObjects.Add(Left:=180, Width:=300, Top:=7, Height:=200)
GraphRepTemp.Chart.ChartType = xlLine
' ActiveChart.FullSeriesCollection(1).Name = " Graph Charge Temp"
ActiveChart.SeriesCollection(1).XValues = ActiveSheet.Range(Cells(NbEt + 12, 17), Cells(NbEt + 12, NbCol + 17)) (Ligne en erreur 91)
ActiveChart.FullSeriesCollection(1).Values = ActiveSheet.Range(Cells(i, 17), Cells(i, NbCol + 17))
' ActiveChart.SetSourceData Source:=Sheets("Charge_YQDB").Range(Data), PlotBy:=xlRow (Ligne en erreur 1004)
' ActiveChart.SetSourceData Source:=Union(Range(Cells(NbEt + 12, 17), Cells(NbEt + 12, NbCol + 17)), Range(Cells(i, 17), Cells(i, NbCol + 17))), PlotBy:=xlRow (Erreur 91)
GraphRepTemp.Chart.Location Where:=xlLocationAsObject, Name:=Range(Cells(i, 1), Cells(i, 1)).Value
Sheets("Charge_YQDB").Select
Next i
Merci d'avance pour votre aide.
Cordialement
Kade
Bonjour Kade,
ce code fonctionne (à adapter)
Dim Valeur_serie As String
'
Valeur_serie = "='" & ActiveSheet.Name & " '!" & "$C$23:$C$29" & ",'" & ActiveSheet.Name & " '!" & "$C$30:$C$35"
ActiveChart.FullSeriesCollection(1).Values = Valeur_serieC'est comme si vous deviez indiquer une formule pour une cellule.
Dans votre code
ActiveChart.FullSeriesCollection(1).Values = ActiveSheet.Range(Cells(i, 17), Cells(i, NbCol + 17))N'oubliez pas les quotes (') qui encadrent le nom de la feuille car si le nom comportent des espaces, il y aura une erreur.
Bonjour !
À tester :
For i = NbEt + 13 To NbEt + 13 + NbActeur - 1
Set Data = Union(Range(Cells(NbEt + 12, 17), Cells(NbEt + 12, NbCol + 17)), Range(Cells(i, 17), Cells(i, NbCol + 17)))
Set GraphRepTemp = ActiveSheet.ChartObjects.Add(Left:=180, Width:=300, Top:=7, Height:=200)
GraphRepTemp.Chart.ChartType = xlLine
' Ajout d'une série au graphique avant de définir les XValues et Values
Dim ser As Series
Set ser = GraphRepTemp.Chart.SeriesCollection.NewSeries
ser.XValues = ActiveSheet.Range(Cells(NbEt + 12, 17), Cells(NbEt + 12, NbCol + 17))
ser.Values = ActiveSheet.Range(Cells(i, 17), Cells(i, NbCol + 17))
GraphRepTemp.Chart.Location Where:=xlLocationAsObject, Name:=Range(Cells(i, 1), Cells(i, 1)).Value
Sheets("Charge_YQDB").Select
Next iJe reprends mon code précédent pour être au plus près du vôtre.
Comme les n° de colonnes de vos cellules sont des nombres et non des lettres, il faut passer (je n'ai pas trouvé d'autre solution) par une macro (NomCol) qui transforme le n° de colonne par son code alphabétique
Dim Valeur_serie As String
' ...
'''' ActiveChart.SeriesCollection(1).XValues = ActiveSheet.Range(Cells(NbEt + 12, 17), Cells(NbEt + 12, NbCol + 17)) (Ligne en erreur 91)
Valeur_serie = "='" & ActiveSheet.Name & "'!" & "$" & NomCol(17) & "$" & NbEt + 12 & ":$" & NomCol(nbcol+17) & "$" & NbEt + 12
ActiveChart.FullSeriesCollection(1).XValues = Valeur_serie
'''' ActiveChart.FullSeriesCollection(1).Values = ActiveSheet.Range(Cells(i, 17), Cells(i, NbCol + 17))
Valeur_serie = "='" & ActiveSheet.Name & "'!" & "$" & NomCol(17) & "$" & i & ":$" & NomCol(nbcol+17) & "$" & i
ActiveChart.FullSeriesCollection(1).Values = Valeur_serie
...
' la suite de votre code
End Sub
Public Function NomCol(pNoCol As Integer) As String
' renvoie le code Alpha de colonne à partir de son n° (4 -> "D")
On Error GoTo NomColErreur
NomCol = Cells(1, pNoCol).Address(RowAbsolute:=False, ColumnAbsolute:=False)
NomCol = CStr(Left(NomCol, Len(NomCol) - 1))
Exit Function
NomColErreur:
MsgBox "NomCol ('" & pNoCol & "') : " & CStr(CVErr(Err.Number))
NomCol = ""
End FunctionBonjour et merci pour vos retours Clr et Abderrahmane.
Je teste ça et reviens vers vous ;-)
Hello,
Vos solutions fonctionnent.
Mais, finalement, je m'en suis tiré comme suit en faisant abstraction de la définition de l'objet Chart :
For i = NbEt + 13 To NbEt + 13 + NbActeur - 1 Set Data = Union(Range(Cells(NbEt + 12, 17), Cells(NbEt + 12, NbCol + 17)), Range(Cells(i, 17), Cells(i, NbCol + 17))) NomFeuil = "Graph " & Cells(i, 1) Data.Select Charts.Add ActiveSheet.Name = NomFeuil
Next i
Je ne comprends toujours pas pourquoi mes définitions initiales (post du 08/06) ne fonctionnaient pas... :-(