GRAPHIQUE - Relier les points de données par une courbe
Bonjour,
Je débute en VBA et je cherche une fonction qui me permettrais de coder l'opération suivante:
Lorsque je créé mon TCD à partir de mon tableau de données, des cases vides se créent.
Du coup, lorsque je génère mon graphique, les courbes associées aux colonnes avec les cases vident sont discontinue.
Pour remédier à ça, je fais :
- Sélection du graphique - Clic droit - Sélectionner des données…
- Cellules masquées et cellules vides
- Relier les points de données par une courbe
Est ce qu'il y a une façon d'intégrer ça directement dans mon code?
Merci d'avance pour votre temps.
Bonjour et bienvenue sur le forum,
Avez-vous essayé l'enregistreur de macros ? Ca offre souvent une base correcte à partir de laquelle on peut ajuster le code pour le rendre plus robuste/générique.
Si vous pouviez poster le code obtenu, ce serait top. Sinon/aussi, il serait pratique de joindre un fichier d'exemple avec notamment le graph final désiré.
Merci saboh12617,
J'ai essayé l'enregistreur mais ça renvoie "Cette action n’est pas encore enregistrable".
Mon code fait les fonctions suivantes :
- Récupère le contenu d'un fichier CSV et l'insère dans un tableau
- Généré un TCD et orriantes les données sur les axes
-Génère le graphique associé
- Mise en forme du graphique
- Boucle pour 4 feuilles
Sub importCSV()
Dim dialogBox As FileDialog
Dim selectedFile As String
Set dialogBox = Application.FileDialog(msoFileDialogFilePicker)
Dim sheet As Integer
sheet = 1
For sheet = 1 To 4
Sheets("Ligne " & sheet).Select
With dialogBox ' Ouvre une dialogue box et recupere le chemin du fichier CSV '
.Filters.Add "CSV", "*.CSV", 1
.AllowMultiSelect = False
If .Show = True Then
selectedFile = .SelectedItems(1)
End If
End With
If selectedFile <> "" Then
Open selectedFile For Input As #1 'Selectionne le contenu du fichier N°1'
Dim rowNumber As Long 'N°de ligne écriture'
Dim lineFromFile As String 'Ligne de lecture'
Dim lineItems As Variant ' Tableau de ligne'
Dim itteration As Integer ' entier nb ligne fichier'
rowNumber = 1
itteration = 0
Do Until EOF(1)
Line Input #1, lineFromFile
If lineFromFile <> "ÿþMessage" Then
lineItems = Split(lineFromFile, ";")
For itteration = 0 To 3
Range("ImportRange" & sheet).Cells(rowNumber, itteration + 1) = lineItems(itteration)
Next
rowNumber = rowNumber + 1
End If
Loop
Close #1
Dim buffer As PivotCache 'Cache tableau'
Set buffer = ActiveWorkbook.PivotCaches.Create(xlDatabase, "Tableau" & sheet)
Dim TCD As PivotTable ' tableau croisé dynamique'
Set TCD = buffer.CreatePivotTable(Range("Z1"), "TCD" & sheet)
With ActiveSheet.PivotTables("TCD" & sheet) 'Oriantatiton du TCD'
.PivotFields("Date").Orientation = xlRowField
.PivotFields("Date").Position = 1
.PivotFields("Heure").Orientation = xlRowField
.PivotFields("Heure").Position = 2
.PivotFields("Etats").Orientation = xlColumnField
.AddDataField .PivotFields("Compteurs"), " Suivi Compteur", xlSum
End With
'création graphique'
Dim graph As Chart
Dim TailleDonnees As String
Dim GrapheName As String
TailleDonnees = "Z1:AD" & rowNumber + 4
ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
With ActiveChart
.SetSourceData Source:=Range(TailleDonnees) 'Source de donnees'
.PlotArea.Format.Fill.ForeColor.RGB = RGB(223, 223, 223) ' Arriere plan gris
.SetElement (msoElementLegendBottom) ' Legende des etats en bas
With .FullSeriesCollection(1)
.ChartType = xlLine 'select which column should be the Line or the Column
.AxisGroup = 2 ' Axe Secondaire
.Border.Color = RGB(255, 0, 0) ' Couleur courbe'
.Points(.Points.Count).ApplyDataLabels ShowValue:=True 'Etiquette sur derniere valeur de la serie'
.Points(.Points.Count).DataLabel.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(255, 0, 0) ' couleur etiquette'
End With
With .FullSeriesCollection(2)
.ChartType = xlLine
.AxisGroup = 1
.Border.Color = RGB(13, 129, 38)
.Points(.Points.Count).ApplyDataLabels ShowValue:=True
.Points(.Points.Count).DataLabel.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(13, 129, 38)
End With
With .FullSeriesCollection(3)
.ChartType = xlLine
.AxisGroup = 2
.Border.Color = RGB(255, 140, 46)
.Points(.Points.Count).ApplyDataLabels ShowValue:=True
.Points(.Points.Count).DataLabel.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(255, 140, 46)
End With
If .SeriesCollection.Count >= 4 Then
With .FullSeriesCollection(4)
.ChartType = xlLine 'select which column should be the Line or the Column
.AxisGroup = 2 ' Axe Secondaire
.Border.Color = RGB(0, 0, 255) ' Couleur courbe'
.Points(.Points.Count).ApplyDataLabels ShowValue:=True 'Etiquette sur derniere valeur de la serie'
.Points(.Points.Count).DataLabel.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 255) ' couleur etiquette'
End With
End If
.SetElement (msoElementDataLabelTop)
.HasTitle = True 'Titre Objet Graphique'
.ChartTitle.Select
.ChartTitle.Text = "Suivi de production"
.Parent.Name = "Graphique" & sheet
.SetElement msoElementPrimaryValueAxisShow 'Titre axe primaire '
.SetElement msoElementPrimaryValueAxisTitleHorizontal
.Axes(xlValue, xlPrimary).AxisTitle.Text = "Titre1"
.SetElement msoElementSecondaryValueAxisShow ' Titre axe secondaire'
.SetElement msoElementSecondaryValueAxisTitleHorizontal
.Axes(xlValue, xlSecondary).AxisTitle.Text = "Titre2"
.ShowAllFieldButtons = False ' desactive les boutons de champs de legende'
GrapheName = .Parent.Name
End With
End If
Next
End SubJe débute, j'ai récupérer des bouts de code à droite et à gauche sans tout comprendre. Je me doute que ce n'est pas du tout optimisé
Pour le graph final désiré je souhaite ceci:
Mais j'obtient ça à la place :
A noté que les étiquettes pour la dernière valeur de chaque séries ne ce créent pas pour les courbes qui ne sont pas tracées. Je ne sais pas si il y a un lien ou si ça vient du code.
Merci
Vous ne pouvez pas partager un classeur représentatif ? Ou à la limite votre csv ? Merci.
pourquoi ce détour avec un TCD ?
comparer les 2 graph, la 2eme, on peut manipuler l'axe X comme on veut
Bonjour,
Je vois ce que vous voulez dire, je vais essayer de modifier la façon dont j'importe mes données pour avoir le même tableau que vous et créer mon graph à partir de là
re,
vous voulez le faire vous-même ou je vous propose une solution ?
Bonjour,
J'ai modifier la macro pour insérer les données dans votre tableau et placer "#N/A" dans les cases vides, mais je veux bien un coup de main pour coder la mise en forme du graph pour l'attribution des axes X et Y en fonction des séries.
Merci
Le TCD me permettais d'orienter les séries sur les axes. Avec cette méthode tout est sur l'axe X et je ne sais pas comment déplacer les séries sur l'axe Y
Merci BsAlv pour ta solution.
Sinon j'ai trouvé ça de mon coté pour automatiquement relier les points entre les cellules vides:
ActiveChart.DisplayBlanksAs = xlInterpolated
Merci à ceux qui pris le temps de m'aider.