Listbox et création de graphique par VBA
Bonjour,
voici ma problématique: j'ai des données sur une feuille taille que je voudrais mettre en forme sur une feuille graph.
La ou ça se complique c'est que j'aimerai avoir un seul graphique qui se met à jour en fonction d'une listbox.
(Je joint un fichier pour l'exemple)
J'aimerai sur la feuille "graph" avoir une listbox qui récupère sans doublons les éléments de la colonne A "population" de la feuille "taille".
J'aimerai par la suite qu'en sélectionnant dans cette listbox une population le graphique en nuage de point se mette à jour avec les données de la colonne B en x et des colonnes C et D en y.
une solution serait d'appliquer un filtre sur la colonne A "population" avec la listbox et mettre à jour le graphique sur avec les données visibles...
Pourriez vous m'aider à faire cette listbox avec le filtre qui va bien?
Y a t il un moyen d'inclure dans ce code des options de formatage du graphique pour adapter les ranges des axes x;y par exemple?
En vous remerciant
Après maintes galère j'ai réussi à finaliser mon fichier...
Celui ci étant un peu trop gros, je vous met juste le code:
Les données à grapher sont sur la feuille "données brutes", le graphique est permanent sur la feuille "graph locus", il s'agit de le mettre à jour par choix dans un combobox.
Un combobox sur la feuille "graph locus" récupère la liste des population de la colonne A de la feuille "données brutes"
Option Explicit
Private Sub UserForm_Initialize()
Dim plage, plagetailles, Cel As Range
Dim i As Integer
Dim Sfile As Collection
With Sheets("Graph locus")
If Sheets("données brutes").FilterMode Then Sheets("données brutes").ShowAllData
Set plage = Sheets("données brutes").Range("A2", Sheets("données brutes").Range("A65536").End(xlUp))
Set Sfile = New Collection
On Error Resume Next
For Each Cel In plage
Sfile.Add (Cel), CStr(Cel)
Next Cel
For i = 1 To Sfile.Count
ComboBox1.AddItem Sfile.item(i)
Next i
End With
Set Sfile = Nothing
End SubLorsque l'on selectionne la population dans la liste du combobox, on filtre la feuille "données brutes" sur la colonne A et avec les cellules non vides de la colonne I puis on copie temporairement les colonnes A, I et K sur la feuille "graph locus" et on appelle la macro qui va gérer les échelles.
Private Sub ComboBox1_Change()
Sheets("Graph locus").Range("AA1", Sheets("Graph locus").Range("AC65536").End(xlUp)).Clear
Application.ScreenUpdating = False
Sheets("données brutes").Activate
If Sheets("données brutes").FilterMode Then Sheets("données brutes").ShowAllData
Sheets("données brutes").Range("A1").Select
Selection.autofilter field:=1, Criteria1:=ComboBox1.List(ComboBox1.ListIndex)
Selection.autofilter field:=9, Criteria1:="<> "
Sheets("Graph locus").Range("E1") = ComboBox1.List(ComboBox1.ListIndex)
Sheets("données brutes").Range("A2", Sheets("données brutes").Range("A65536").End(xlUp)).SpecialCells(xlCellTypeVisible).Copy Sheets("Graph locus").Range("AA1")
Sheets("données brutes").Range("I2", Sheets("données brutes").Range("I65536").End(xlUp)).SpecialCells(xlCellTypeVisible).Copy Sheets("Graph locus").Range("AB1")
Sheets("données brutes").Range("K2", Sheets("données brutes").Range("K65536").End(xlUp)).SpecialCells(xlCellTypeVisible).Copy Sheets("Graph locus").Range("AC1")
Sheets("Graph locus").Activate
Unload Usergraphique1
Worksheets("Graph locus").ChartObjects(1).Chart.HasTitle = True
Worksheets("Graph locus").ChartObjects(1).Chart.ChartTitle.Characters.Text = "ATTENTION: ceci est un graphe des tailles réelles, pas des tailles alléliques..."
Call Echelle2
End SubLa série de donnée du graphique pointe vers AA pour les X et vers AB et AC pour les Y sur 16000 lignes maxi (limite de 32000 points pour excel 2003).
La macro suivante permet d'ajuster les echelles aux données récupérées sur le graphique.
Sub Echelle2()
With Worksheets("Graph locus").ChartObjects(1).Chart.Axes(xlValue)
.MinimumScale = Application.Min(Sheets("Graph locus").Range("AB1", Sheets("Graph locus").Range("AB65536").End(xlUp))) - 2
.MaximumScale = Application.Max(Sheets("Graph locus").Range("AC1", Sheets("Graph locus").Range("AC65536").End(xlUp))) + 2
.MajorUnit = 2
.HasMinorGridlines = True
.HasDisplayUnitLabel = True
End With
With Worksheets("Graph locus").ChartObjects(1).Chart.Axes(xlCategory)
.MinimumScale = 0
.MaximumScale = Sheets("Graph locus").Range("AA1", Sheets("Graph locus").Range("AA65536").End(xlUp)).Count + 10
Sheets("Graph locus").Range("K1") = Sheets("Graph locus").Range("AA1", Sheets("Graph locus").Range("AA65536").End(xlUp)).Count
End With
End SubCela fonctionne au poil, le seul défaut est que la taille du graphique est fixe donc si l'axe Y est grand, les points sont très amassés et c'est pas très visuel.
Si quelqu'un connait un bout de code à rajouter à la dernière Sub pour que la taille du graphique varie en fonction de la taille de l'axe Y, je suis preneur.
A+