Private Sub Worksheet_Activate()
'Cette procédure met à jour la liste des onglets et des feuilles qu'on veut traiter dans la plage "B6:C..".
'Elle est exécutée lors de l'activation de l'onglet "Graphique".
Dim i%, Nfl$, v
Nfl = "SREP" 'Nom de la plage contenant la liste des onglets.
'Effacement de la liste et suppression de la liste, si une liste préexiste :
With Application: .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = -4135: End With
On Error Resume Next
If Range(Nfl).Rows.Count > 1 Then Range(Nfl).Offset(1).Resize(Range(Nfl).Rows.Count - 1, 2).Clear
Names(Nfl).Delete
On Error GoTo 0
'Récupération de la liste par la fonction 'NOngletFeuille'.
v = NOngletFeuille(Array(0, Me.CodeName, "Feuil1"), False, False)
'Création de la plage nommée "SREP" et formatage de la zone de destination de la liste :
With Range("B6"): .Parent.Names.Add Name:=Nfl, RefersTo:="=" & Me.Name & "!" & .Resize(v(0), 1).Address: .Resize(1, 2).Copy Range(Nfl): End With
'Affichage de la liste.
Range(Nfl).Resize(, 2).Value = v(1)
With Application: .Calculation = -4105: .EnableEvents = 1: .ScreenUpdating = 1: End With
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Cible As Range, Valider As Boolean)
'Cette procédure met à jour les graphiques après un double_clic sur un des éléments de la liste "SREP".
MAJGraph Cible, Range("SREP")
Valider = True
End Sub
Private Sub Worksheet_Change(ByVal Cible As Range)
'Cette procédure met à jour les graphiques après sélection d'un des éléments de la liste déroulante de la cellule "B5".
Dim i%, Msg$, gPrm(), Plg As Range
MAJGraph Cible, Range("B5")
End Sub
Private Sub MAJGraph(ByVal Cible As Range, ByRef oPlg As Range) 'Version paramétrée.
'Cette procédure effectue la mise à jour des graphiques.
Dim i%, Msg$, gPrm(), Plg As Range
If Not Intersect(Cible, oPlg) Is Nothing Then
'Paramètres des graphiques : tableau de tableaux.
'Array("Graphique 1", "DATA_1", "x_1", 5) défintit les paramètres du graphique "Graphique 1", prenant ses données
'dans la plage nommée "DATA_1" de chacun des onglets concernés pour les placer dans la plage nommée "x_1" de
'l'onglet "Graphique". Le 5 final indique que les données occupent cinq colonnes.
gPrm = Array(Array("Graphique 1", "DATA_1", "x_1", 5), Array("Graphique 2", "DATA_2", "x_2", 3), Array("Graphique 3", "B24:C28", "R6:R9", 2))
'Le code qui suit ne présente pas de difficulté particulière.
With Application: .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = -4135: End With
If Cible <> "" Then
For i = 0 To UBound(gPrm) 'Boucle sur chaque graphique.
On Error GoTo E1
With Me.Range(gPrm(i)(2))
ChartObjects(gPrm(i)(0)).Activate
On Error Resume Next
Set Plg = Sheets(Cible.Value).Range(gPrm(i)(1))
On Error GoTo E2
.Resize(UBound(ActiveChart.SeriesCollection(1).Values), gPrm(i)(3)).Clear
.Cells(1) = " ": .Cells(1, 2) = Empty
If Plg Is Nothing Then
Msg = Msg & "Pas de données valables pour le graphe «" & gPrm(i)(0) & "» dans l'onglet «" & Cible.Value & "»." & vbLf
Else
Plg.Copy Destination:=.Cells(1, 1).Offset(-1)
'La ligne suivante est facultative : elle supprime les éventuelles formules qui auraient pu être copiées dans l'onglet "Cible".
With .Cells(1, 1).Offset(-1).Resize(Plg.Rows.Count, Plg.Columns.Count): .Value = .Value: End With
Set Plg = Nothing
End If
On Error Resume Next
With ActiveChart.ChartTitle: .Select: .Text = Cible.Value & " (" & gPrm(i)(0) & ")": End With
End With
F1: Next
On Error GoTo 0
Cible.Activate
End If
With Application: .Calculation = -4105: .EnableEvents = 1: .ScreenUpdating = 1: End With
If Msg <> "" Then MsgBox Msg
End If
Exit Sub
E2: MsgBox "...une erreur imprévue est survenue.", vbOKOnly, "I apologize..."
E1: Resume F1
End Sub