Utilisation de tableaux pour faire un graphique
batou26
Messages postés
1
Statut
Membre
-
Patrice33740 Messages postés 8400 Date d'inscription Statut Membre Dernière intervention -
Patrice33740 Messages postés 8400 Date d'inscription Statut Membre Dernière intervention -
Bonjour le forum,
J'ai un dictionnaire et je veux faire un graphique des valeurs en fonction des clefs donc je les stocke dans 2 tableaux l'un pour les clefs l'autre les valeurs et que mon code ne marche pas je n'obtiens pas de graphique. Voici le code en question
J'ai un dictionnaire et je veux faire un graphique des valeurs en fonction des clefs donc je les stocke dans 2 tableaux l'un pour les clefs l'autre les valeurs et que mon code ne marche pas je n'obtiens pas de graphique. Voici le code en question
Option Explicit
Sub Workbook_Open()
Dim Wbk As Workbook, Cht As Chart, RngTit As Range, RngDon As Range, _
ColDate As Long, Col As Long, Sér As Series, Titre As String, ligne As Long, dat As Date, lig As Long
Dim mot As String, lign As Long, d, t, i&, repetitions() As Variant, clefs() As Variant, compteur As Long, element, nbrele
Public graph As Integer
For Each Wbk In Application.Workbooks
If Wbk.Name <> ThisWorkbook.Name Then Exit For
Next Wbk
Set RngDon = Wbk.Worksheets(1).UsedRange
For ColDate = 1 To RngDon.Columns.Count + 2
If IsDate(RngDon(2, ColDate).Value) Then Exit For
Next ColDate
If ColDate > RngDon.Columns.Count Then
ColDate = 1
End If
Set RngTit = RngDon.Rows(1)
Set RngDon = RngDon.Rows(2).Resize(RngDon.Rows.Count - 1)
For Col = 1 To RngTit.Columns.Count
If Col <> ColDate Then
If VarType(RngDon.Cells(1, Col).Value) = 8 Then
Set d = CreateObject("Scripting.Dictionary")
For lign = 1 To RngDon.Rows.Count
mot = RngDon.Cells(lign, Col)
If Not d.exists(mot) Then
d.Add mot, 1
compteur = compteur + 1
Else
d(mot) = d(mot) + 1
End If
Next lign
i = 1
ReDim clef(compteur)
For Each element In d.Keys
clefs(i) = element
i = i + 1
Next element
i = 1
ReDim repetitions(compteur)
For Each nbrele In d.items
repetitions(i) = nbrele
i = i + 1
Next nbrele
Titre = RngTit.Columns(Col)
On Error Resume Next
Set Cht = Wbk.Charts(Titre)
If Err Then Set Cht = Wbk.Charts.Add: Cht.Name = Titre
With Cht.SeriesCollection
Do While .Count > 1: .Item(1).Delete: Loop
Err.Clear: Set Sér = .Item(1): If Err Then Set Sér = .NewSeries
End With
On Error GoTo 0
If UBound(t) = 1 Then Exit For
Sér.XValues = repetitions
Sér.Values = clefs
Sér.Name = RngTit.Columns(Col)
Cht.ChartType = xlPie
Cht.ChartStyle = 259
d.RemoveAll
Erase repetitions, clefs
end if
end if
end sub
1 réponse
-
Bonjour,
Évites de mettre un code spécifique dans Workbook_Open
Il est préférable de placer le code dans un module standard et de l'appeler depuis Workbook_Open
Essaies ce code :' Note : il faut activer les références (dans Outils > Références ...) à : ' - Microsoft Scripting Runtime Option Explicit Sub test() Dim d As Dictionary 'Dictionnaire des dates et nombre pour chaque date Dim w As Workbook 'Classeur Dim x As Variant 'Tableau des valeurs de l'axe horizontal (dates) Dim v As Variant 'Tableau des valeurs de l'axe vertical (nombre) Dim r As Range 'Plage des données Dim c As Range 'Cellule analysée Dim k As Range 'Colonne des données Dim g As Chart 'Graphique Dim s As Series 'Série de donnéesdu graphique Dim n As String 'Nom de la colonne For Each w In Application.Workbooks If w.Name <> ThisWorkbook.Name Then Exit For Next w Set r = w.Worksheets(1).UsedRange Set r = r.Offset(1).Resize(r.Rows.Count - 1) For Each c In r.Rows(1).Cells If IsDate(c.Value) Then Set k = Intersect(r, c.EntireColumn) n = c.Offset(-1).Value Exit For End If Next c If Not k Is Nothing Then Set d = New Dictionary For Each c In k.Cells If Not d.exists(c.Text) Then d.Add c.Text, 1 Else d(c.Text) = d(c.Text) + 1 End If Next c End If If Not d Is Nothing Then v = d.Items x = d.Keys d.RemoveAll Set d = Nothing On Error Resume Next Set g = w.Charts(n) On Error GoTo 0 If Not g Is Nothing Then For Each s In g.SeriesCollection s.Delete Next s Else Set g = w.Charts.Add2 g.Name = n End If g.ChartType = xlColumnClustered 'ou autre g.SeriesCollection.NewSeries g.FullSeriesCollection(1).Name = n g.FullSeriesCollection(1).Values = v g.FullSeriesCollection(1).XValues = x g.ChartTitle.Text = n End If End Sub