Passage d'une procédure "classique" à une proc. de module ou une fonction

Bonjour,

je suis toujours sur le même projet de création de graphiques sous VBA. Je dois créer 15 graphiques.
Voici comment je crée un des graphiques sous VBA, avec une procédure "classique", dans un userform.

ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select 'création graphique de tel type
With ActiveChart
.SetSourceData source:=Range("A7:H10") ', PlotBy:=xlRows 'sélection des données
.Parent.Name = "Gr1"
.ChartTitle.Text = "Répartition de la population par tranche d'âge"
.ChartTitle.Select
End With

Les éléments qui sont susceptibles de varier à chaque fois, selon le graphique que je souhaite créer, sont le style (ici "201"), le type (ici "xlColumnClustered"), les cellules sélectionnées (ici "A7:H10"), le "nom" du graphique (ici "Gr1") et son titre (ici "Répartition de la population par tranche d'âge").

D'habitude, je sais comment passer d'une procédure classique à une procédure de module ou un fonction mais je n'arrive pas à le faire ici, avec la création de graphiques… Sauriez-vous comment faire ?

Bonjour,

Je n'ai pas bien compris. Est-ce que vous parlez de procédure paramétrée :

sub test()
AjoutGraph activesheet, 201, 51, Range("A7:H10"), "Gr1", "Répartition de la population par tranche d'âge"
end sub

Sub AjoutGraph(Feuille as worksheet, Style as long, ChartType as long, Source as range, Name as string, Title as string)
With Feuille.Shapes.AddChart2(Style, ChartType) 'création graphique de tel type
    .SetSourceData source:=Source
    .Parent.Name = Name
    .ChartTitle.Text = Title
End With
end sub

Cdlt,

Bonjour,

en fait ma question était double, je me suis mal exprimé déjà qu'est-ce qui pourrait répondre le mieux à ma problématique de création de 15 graphiques, une fonction ou une procédure de module ?

Actuellement mon code est intégralement contenu dans VBA et se suivent 15 fois des mêmes codes (création de graphiques, modifications taille, modifications titre, modifications zone de traçage, modifications légende, modification zone de texte supplémentaire pour afficher une source etc...).
Ce programme fonctionne peut à peu près mais n'est pas du tout optimisé et bcp trop long (Tout ça est contenu dans une seul procédure, à tel point que VBA ne veut plus l'exécuter -> "Procédure trop grande" )...

Il faut donc que je l'optimise un maximum maintenant.

J'ai essayé ce que vous m'avez envoyé qui ne correspond ni à procédure de module, ni à une fonction. Cela peut aussi tout à fait convenir et ainsi je pourrai laisser tout ce code dans l'userform qui contient un bouton pour créer ces 15 graphiques.

J'ai exécuté votre code, que j'ai compris, mais qui ne fonctionnait pas directement. J'ai une petite bizarrerie, il semblerait qu'il faille laisser la sélection au début du programme pour que cela fonctionne

Sub AjoutGraph(Feuille As Worksheet, Style As Long, ChartType As Long, Source As Range, Name As String, Title As String)
Feuille.Shapes.AddChart2(Style, ChartType).Select 'création graphique de tel type
With ActiveChart
    .SetSourceData Source:=Source
    .Parent.Name = Name
    .ChartTitle.Text = Title
End With
End Sub
Sub test()
AjoutGraph ActiveSheet, 201, 51, Range("A7:H10"), "Gr1", "Répartition de la population par tranche d'âge"
End Sub

J'ai ensuite ajouté la seconde procédure dans une boucle allant de 1 à 15. Des données et un graphique correspondant doivent, à terme, être présents dans chacun des 15 onglets, de Gr1 à Gr15. Pour le test, j'ai utilisé à chaque fois des données de l'onglet "Gr1" et je n'utilise que l'initiation de l'userform contre un bouton à terme.

Sub Userform_Initialize()
Dim num_graph As Integer
Dim nom_onglet As String
Dim nom_graphique As String
For num_graph = 1 To 15
nom_onglet = "Gr" & num_graph
nom_graphique = "Gr" & num_graph & "bis"
AjoutGraph Sheets(nom_onglet), 201, 51, Range("'Gr1'!$A$7:$H$10"), nom_graphique, "Répartition de la population par tranche d'âge"
Next num_graph
End Sub

Cela fonctionne pour le premier mais me donne des graphiques totalement différents, vides ou qui sélectionnent des données de leur onglet (alors que j'ai bloqué la source de données sur l'onglet "Gr1").

Merci pour votre aide.

Bonjour,

Je ne suis pas certain de bien vous comprendre, à cause d'un petit souci de terminologie j'imagine.

Une fonction est censée renvoyer une valeur. Une fonction qui ne renvoie pas de valeur est l'équivalent d'une procédure.

Je pense qu'il vous faut une procédure dépendant de paramètres, à placer dans un module standard.

La méthode .addchart2 renvoie un objet Shape. Il faut donc utiliser la propriété .chart pour obtenir le graphique associé. Avec ce code, ça devrait mieux aller :

private Sub Commandbutton1_Click() 'lancement au clic sur le bouton 1 !
dim i&
For i = 1 To 15
    AjoutGraph Sheets("Gr" & i), 201, 51, Sheets("Gr1").Range("$A$7:$H$10"), "Gr" & i & "bis", "Répartition de la population par tranche d'âge"
Next i
End Sub

Sub AjoutGraph(Feuille As Worksheet, Style As Long, ChartType As Long, Source As Range, Name As String, Title As String)
With Feuille.Shapes.AddChart2(Style, ChartType).chart
    .SetSourceData Source:=Source
    .Parent.Name = Name
    .ChartTitle.Text = Title
End With
End Sub

Selon moi, cette façon de faire avec une boucle est la bonne. Le seul détail à régler est que la méthode .addchart2 attend potentiellement d'autres paramètres (notamment ceux qui définissent les dimensions du graphe) :

https://docs.microsoft.com/fr-fr/office/vba/api/excel.shapes.addchart2

Pour l'instant, ceux-ci ont été négligés dans la procédure AjoutGraph.

Cdlt,

Bonjour,

merci beaucoup pour vote aide, qui m'a permis d'avancer sur ce problème.
J'en rencontre un autre maintenant : je cherche à créer une procédure avec des paramètres où on pourrait y mettre le nombre de couleurs (obligatoire) et un nombre de paramètre de couleurs qui varie (facultatif)

Voici ce que j'ai essayé de faire :

Procédure paramétrée

'COULEURS

Sub Couleurs(nb_couleurs As Integer, Optional C1 As String, Optional C2 As String, Optional C3 As String, Optional C4 As String, _
Optional C5 As String, Optional C6 As String, Optional C7 As String, Optional C8 As String)
'Dans cet exemple je n'ai que 8 paramètres de couleurs facultatifs
'Les paramètres C1, C2, ..., C8 doivent être de la forme : (128, 100, 162)

Dim cht As chart
Dim i As Integer
Dim Couleurs(1 To nb_couleurs) As Long

Set cht = ActiveSheet.ChartObjects("Gr10").chart

For i = 1 To nb_couleurs
    Couleurs(i) = "RGB" & "C" & i 'y inscrire quelque chose de la forme : RGB(128, 100, 162)
    With cht.SeriesCollection(i)
        .Interior.Color = Couleurs(i)
    End With
Next

End Sub

Procédure classique

Public Sub CommandButton1_Click()
Dim i As Long
Dim chart As Object

Workbooks("OGPC.xlsm").Activate

For i = 1 To 15
    Select Case i
        Case 1
            Sheets("Gr" & i).Activate
            AjoutGraph Sheets("Gr" & i), 201, 51, 567, 368.5, Sheets("Gr" & i).Range("$A$7:$H$10"), "Gr" & i & "bis", "Répartition de la population par tranche d'âge"
            ActiveSheet.ChartObjects("Gr" & i & "bis").Select
            Légende 420.47, 36.52, 142.46, 64.25
            Couleurs 3, "(91, 155, 213)", "(165, 165, 165)", "(237, 125, 49)"
        Case 2
            AjoutGraph Sheets("Gr" & i), 201, 51, 567, 368.5, Sheets("Gr" & i).Range("$A$7:$H$10"), "Gr" & i & "bis", "Evolution de la population par tranche d'âge sur 5 ans"
        Case 3
            AjoutGraph Sheets("Gr" & i), 227, 65, 567, 368.5, Sheets("Gr" & i).Range("$A$5:$C$15"), "Gr" & i & "bis", "Naissances et décès domiciliés sur " & "Aiffres" _
            & Chr(13) & " entre " & Cells(6, 1) & " et " & Cells(15, 1)
        Case Else
        MsgBox ""
    End Select
Next i
End Sub

Merci pour votre aide !

up

Bonjour,

Module de classe

Dim Shap As Shape
Enum Style
    ExlColumnClustered = xlColumnClustered
    ExlColumnStacked = xlColumnStacked
    ExlColumnStacked100 = xlColumnStacked100
    Exl3DColumnClustered = xl3DColumnClustered
    Exl3DColumnStacked = xl3DColumnStacked
    Exl3DColumnStacked100 = xl3DColumnStacked100
    Exl3DColumn = xl3DColumn
    ExlCylinderColClustered = xlCylinderColClustered
    ExlCylinderColStacked = xlCylinderColStacked
    ExlCylinderColStacked100 = xlCylinderColStacked100
    ExlCylinderCol = xlCylinderCol
    ExlConeColClustered = xlConeColClustered
    ExlConeColStacked = xlConeColStacked
    ExlConeColStacked100 = xlConeColStacked100
    ExlConeCol = xlConeCol
    ExlPyramidColClustered = xlPyramidColClustered
    ExlPyramidColStacked = xlPyramidColStacked
    ExlPyramidColStacked100 = xlPyramidColStacked100
    ExlPyramidCol = xlPyramidCol
    ExlLine = xlLine
    ExlLineStacked = xlLineStacked
    ExlLineStacked100 = xlLineStacked100
    ExlLineMarkers = xlLineMarkers
    ExlLineMarkersStacked = xlLineMarkersStacked
    ExlLineMarkersStacked100 = xlLineMarkersStacked100
    Exl3DLine = xl3DLine
    ExlPie = xlPie
    ExlPieExploded = xlPieExploded
    ExlPieOfPie = xlPieOfPie
    ExlBarOfPie = xlBarOfPie
    Exl3DPie = xl3DPie
    Exl3DPieExplodede = xl3DPieExploded
    ExlBarClustered = xlBarClustered
    ExlBarStacked = xlBarStacked
    ExlBarStacked100 = xlBarStacked100
    Exl3DBarClustered = xl3DBarClustered
    Exl3DBarStacked = xl3DBarStacked
    Exl3DBarStacked100 = xl3DBarStacked100
    ExlCylinderBarClustered = xlCylinderBarClustered
    ExlCylinderBarStacked = xlCylinderBarStacked
    ExlCylinderBarStacked100 = xlCylinderBarStacked100
    ExlConeBarClustered = xlConeBarClustered
    ExlConeBarStacked = xlConeBarStacked
    ExlConeBarStacked100 = xlConeBarStacked100
    ExlPyramidBarClustered = xlPyramidBarClustered
    ExlPyramidBarStacked = xlPyramidBarStacked
    ExlPyramidBarStacked100 = xlPyramidBarStacked100
    ExlArea = xlArea
    ExlAreaStacked = xlAreaStacked
    ExlAreaStacked100 = xlAreaStacked100
    Exl3DArea = xl3DArea
    Exl3DAreaStacked = xl3DAreaStacked
    Exl3DAreaStacked100 = xl3DAreaStacked100
    ExlXYScatter = xlXYScatter
    ExlXYScatterSmooth = xlXYScatterSmooth
    ExlXYScatterSmoothNoMarkers = xlXYScatterSmoothNoMarkers
    ExlXYScatterLines = xlXYScatterLines
    ExlXYScatterLinesNoMarkers = xlXYScatterLinesNoMarkers
    ExlDoughnut = xlDoughnut
    ExlDoughnutExploded = xlDoughnutExploded
    ExlBubble = xlBubble
    ExlBubble3DEffect = xlBubble3DEffect
    ExlRadar = xlRadar
    ExlRadarMarkers = xlRadarMarkers
    ExlRadarFilled = xlRadarFilled
    ExlSurface = xlSurface
    ExlSurfaceWireframe = xlSurfaceWireframe
    ExlSurfaceTopView = xlSurfaceTopView
    ExlSurfaceTopViewWireframe = xlSurfaceTopViewWireframe
End Enum

Public Sub SaveAs_Image(Feuille As Worksheet, Non As String, fichier As String)
For Each MyObject In Feuille.Shapes
    If MyObject.Name = Non Then
        MyObject.Chart.Export Filename:=fichier, FilterName:="GIF"
        Exit Sub
    End If
Next
End Sub
Public Sub Delete(Feuille As Worksheet, Non As String)
For Each MyObject In Feuille.Shapes
    If MyObject.Name = Non Then MyObject.Delete: Exit Sub
Next
End Sub
Public Sub Nouveau(Feuille As Worksheet, Non As String)
Set Shap = Feuille.Shapes.AddChart
Shap.Name = Non
End Sub
Public Sub Source(MyRange As Range, Orientation As Long)
 Shap.Chart.SetSourceData MyRange, Orientation
End Sub
Public Sub Style(MyStyle As Style)
 Shap.Chart.ChartType = MyStyle
End Sub
Public Sub SeriesCollection_Caption(Caption As String, Element As MsoChartElementType)
Dim e
  Shap.Chart.SetElement Element
  Select Case Element
            Case 2
                Shap.Chart.ChartTitle.Text = Caption
            Case 301
                Shap.Chart.Axes(xlCategory, xlPrimary).AxisTitle.Text = Caption
            Case 309
                Shap.Chart.Axes(xlValue, xlPrimary).AxisTitle.Text = Caption
  End Select
End Sub
Public Sub SeriesCollection(V)
 Shap.Chart.SeriesCollection(1).XValues = V
End Sub
Public Sub SeriesCollection_Visible()

 Shap.Chart.SeriesCollection(1).ApplyDataLabels
End Sub
Public Sub Taille(Hauteur As Integer, Largeur As Integer)
 Shap.Height = Hauteur
 Shap.Width = Largeur
End Sub
Public Sub Position(X As Integer, Y As Integer)
 Shap.Top = X
 Shap.Left = Y
End Sub
Public Sub RenameSeries(Soruce As String, Cible As String)
For Each s In Shap.Chart.SeriesCollection
    If s.Name = Soruce Then s.Name = Cible: Exit For
Next

End Sub

Exemple d'utilisation!

 
Sub test()

Dim Plage As Range
Dim Graph As New ClsGraph
Set Plage = Range("$B$2:$D$35")
Graph.Delete ActiveSheet, "Graph1"
Graph.Nouveau ActiveSheet, "Graph1"
Graph.Style ExlPyramidBarClustered
Graph.Source Plage, xlRange
Graph.SeriesCollection "=Recap!$B$2:$D$35"
Graph.SeriesCollection_Caption "Mois", msoElementPrimaryCategoryAxisTitleAdjacentToAxis
Graph.SeriesCollection_Caption "ETPs", msoElementPrimaryValueAxisTitleRotated
Graph.SeriesCollection_Caption "Plan de charge Technique groupé par famille", msoElementChartTitleAboveChart
Graph.RenameSeries "Série1", "TOTO"
Graph.RenameSeries "Série2", "TITI"
Graph.RenameSeries "Série3", "TUTU"
Graph.Position 0, 200
Graph.Taille 400, 500
Graph.SeriesCollection_Visible
Graph.SaveAs_Image ActiveSheet, "Graph1", ActiveWorkbook.Path & "\" & "graphe.gif"

End Sub
16graphique.zip (23.67 Ko)
Rechercher des sujets similaires à "passage procedure classique proc module fonction"