Débogage graphique VBA

Bonjour,

j'ai utilisé l'enregistreur de macro pour créer le code ci-dessous. Il fonctionne à peu près. C'est à dire qu'il y a des soucis mais si je clique sur Fin lorsqu'il me propose de faire le débogage cela fonctionne quand même.... Mais bon c'est pas top non plus quoi.... Le débogage se lance sur

ActiveChart.ChartTitle.Select

Pourquoi ... je n'en sais rien. Comme ce code a été fait avec l'enregistreur de macro j'imagine qu'il doit peut être vous paraîte tout bizarre .... j'en sais trop rien.

Qqun pense pouvoir l'améliorer ou déjà le rendre sans bug? Merci

Sub graphcouleurse31a()
'
' graphcouleurse31a Macro
'
    ActiveSheet.Shapes.AddChart2(297, xlColumnStacked100).Select
    ActiveChart.SetSourceData Source:=Sheets("Calcul_couleurs").Range("A3:E33")
    ActiveChart.ChartTitle.Select
    ActiveChart.ChartTitle.Text = "Répartition couleurs E31A"
    Selection.Format.TextFrame2.TextRange.Characters.Text = _
        "Répartition couleurs E31A"
    With Selection.Format.TextFrame2.TextRange.Characters(1, 25).ParagraphFormat
        .TextDirection = msoTextDirectionLeftToRight
        .Alignment = msoAlignCenter
    End With
    With Selection.Format.TextFrame2.TextRange.Characters(1, 25).Font
        .BaselineOffset = 0
        .Bold = msoFalse
        .NameComplexScript = "+mn-cs"
        .NameFarEast = "+mn-ea"
        .Fill.Visible = msoTrue
        .Fill.ForeColor.RGB = RGB(89, 89, 89)
        .Fill.Transparency = 0
        .Fill.Solid
        .Size = 14
        .Italic = msoFalse
        .Kerning = 12
        .Name = "+mn-lt"
        .UnderlineStyle = msoNoUnderline
        .Spacing = 0
        .Strike = msoNoStrike
    End With
    ActiveChart.ChartArea.Select
    ActiveChart.SetElement (msoElementDataLabelCenter)
End Sub

Bonsoir,

Il serait plus simple pour toi de nous envoyer un fichier...

Cdlt.

Bonsoir et merci d'avoir pris le temps de me répondre.

Voici un fichier exemple.

13macrographique.xlsm (17.22 Ko)

Bonjour,

Voir exemple dans fichier joint.

A te relire.

Cdlt.

Option Explicit

Private Sub cmdCreerGraphique_Click()
Dim wsData As Worksheet, wsChart As Worksheet
Dim rngChart As Range
Dim objChart As ChartObject
Dim objLE As LegendEntry

    Application.ScreenUpdating = False

    Set wsData = Feuil1
    Set wsChart = Feuil2

    On Error Resume Next
    wsChart.ChartObjects(1).Delete
    On Error GoTo 0

    Set rngChart = wsData.Cells(3, 1).CurrentRegion ' Attention!...

    Set objChart = wsChart.ChartObjects.Add _
            (Left:=wsChart.Columns("B").Left, _
            Top:=wsChart.Rows(4).Top, _
            Width:=400, _
            Height:=250)

    With objChart.Chart
        .ChartType = xlColumnStacked
        .SetSourceData Source:=rngChart, PlotBy:=xlColumns
        .HasTitle = True
        .ChartTitle.Text = wsData.Cells(1)
        .HasLegend = True
        .Legend.Position = xlTop
        With .Parent
            .Placement = xlFreeFloating
            .Name = "Graphique " & wsData.Cells(1)
        End With
        .FullSeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)    'rouge
        .FullSeriesCollection(2).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)    'jaune
        .FullSeriesCollection(3).Format.Fill.ForeColor.RGB = RGB(146, 208, 80)    'vert
        .FullSeriesCollection(4).Format.Fill.ForeColor.RGB = RGB(0, 176, 80)    'vert2
        With .Legend
            .Font.Bold = True
            .Font.Italic = True
            For Each objLE In .LegendEntries
                objLE.Font.Color = objLE.LegendKey.Interior.Color
            Next
        End With
    End With

    Set objChart = Nothing
    Set rngChart = Nothing
    Set wsChart = Nothing: Set wsData = Nothing

End Sub

Je te réponds tout de suite car comme d'habitude vos solutions sont géniales. Merci infiniment. Cela fonctionne parfaitement sur le fichier test

Dîtes moi si je me trompe, parce que je n'y connais pas grand chose. La macro est sur la feuille et non dans le code du bouton n'est ce pas?

Or, je souhaiterais ensuite copier coller le bouton 30 fois (sur des feuilles différentes) et qu'il fasse le graphique sur la feuille où il se trouve.

Je n'avais pas précisé cela. Je vous présente mes excuses. Je ne sais même pas si c'est possible d'ailleurs.

Je pense que j'y suis arrivé sur un bouton de commande copiable à l'infini. Enfin j'espère dîtes moi si c'est ça.

J'ai enlevé le private. J'ai ajouté activesheet là où doit se faire le graphique. Il y a d'autres choses à faire vous pensez ?

Sub cmdCreerGraphique_Click()
Dim wsData As Worksheet, wsChart As Worksheet
Dim rngChart As Range
Dim objChart As ChartObject
Dim objLE As LegendEntry

    Application.ScreenUpdating = False

    Set wsData = Feuil1
    Set wsChart = ActiveSheet

    On Error Resume Next
    wsChart.ChartObjects(1).Delete
    On Error GoTo 0

    Set rngChart = wsData.Cells(3, 1).CurrentRegion ' Attention!...

    Set objChart = wsChart.ChartObjects.Add _
            (Left:=wsChart.Columns("B").Left, _
            Top:=wsChart.Rows(4).Top, _
            Width:=400, _
            Height:=250)

    With objChart.Chart
        .ChartType = xlColumnStacked
        .SetSourceData Source:=rngChart, PlotBy:=xlColumns
        .HasTitle = True
        .ChartTitle.Text = wsData.Cells(1)
        .HasLegend = True
        .Legend.Position = xlTop
        With .Parent
            .Placement = xlFreeFloating
            .Name = "Graphique " & wsData.Cells(1)
        End With
        .FullSeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)    'rouge
        .FullSeriesCollection(2).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)    'jaune
        .FullSeriesCollection(3).Format.Fill.ForeColor.RGB = RGB(146, 208, 80)    'vert
        .FullSeriesCollection(4).Format.Fill.ForeColor.RGB = RGB(0, 176, 80)    'vert2
        With .Legend
            .Font.Bold = True
            .Font.Italic = True
            For Each objLE In .LegendEntries
                objLE.Font.Color = objLE.LegendKey.Interior.Color
            Next
        End With
    End With

    Set objChart = Nothing
    Set rngChart = Nothing
    Set wsChart = Nothing: Set wsData = Nothing

End Sub

Cette modification a l'air de fonctionner.

Il me semble si je comprends que dans le code, vous sélectionnez des lignes et des colonnes pour faire le graphique. Dans mon fichier test, il n'y avait qu'un tableau de données mais dans la réalité il y en a plusieurs. Il ne faudrait donc pas que cela sélectionne les lignes et les colonnes mais une plage de cellule. Est ce possible? D'autant plus qu'ensuite je voudrais modifier ce code pour l'adapter à d'autres plages de cellules.

Merci

Merci j'ai réussi à l'adapter à mon cas. Je vais essayer de le reproduire sur d'autres sélections maintenant. Merci. Je reviendrai vers vous si je n'y arrive pas.

Pour info voici le code que j'utilise donc. Si vous voulez le relire pour me dire si je n'ai pas mis de bêtises.

Merci.

Sub graphcouleurse31a()
'
' graphcouleurse31a Macro
'

'
    Dim wsData As Worksheet, wsChart As Worksheet
Dim rngChart As Range
Dim objChart As ChartObject
Dim objLE As LegendEntry

    Application.ScreenUpdating = False

    Set wsData = Feuil43
    Set wsChart = ActiveSheet

    On Error Resume Next
    wsChart.ChartObjects(1).Delete
    On Error GoTo 0

    Set rngChart = wsData.Cells(3, 1).CurrentRegion ' Attention!...

    Set objChart = wsChart.ChartObjects.Add _
            (Left:=wsChart.Columns("c").Left, _
            Top:=wsChart.Rows(9).Top, _
            Width:=600, _
            Height:=250)

    With objChart.Chart
        .ChartType = xlColumnStacked
        .SetSourceData Source:=Feuil43.Range("A3:E33")
        .HasTitle = True
        .ChartTitle.Text = wsData.Cells.Range("a2")
        .HasLegend = True
        .Legend.Position = xlTop
        With .Parent
            .Placement = xlFreeFloating
            .Name = "Graphique " & wsData.Cells(1)
        End With
        .FullSeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)    'rouge
        .FullSeriesCollection(2).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)    'jaune
        .FullSeriesCollection(3).Format.Fill.ForeColor.RGB = RGB(146, 208, 80)    'vert
        .FullSeriesCollection(4).Format.Fill.ForeColor.RGB = RGB(0, 176, 80)    'vert2
        With .Legend
            .Font.Bold = True
            .Font.Italic = True
            For Each objLE In .LegendEntries
                objLE.Font.Color = objLE.LegendKey.Interior.Color
            Next
        End With
    End With

    Set objChart = Nothing
    Set rngChart = Nothing
    Set wsChart = Nothing: Set wsData = Nothing

End Sub

Re,

Set rngChart = wsData.Cells(3, 1).CurrentRegion ' Attention!...

J'avais anticipé la chose avec le commentaire 'Attention!...'.

Bon, maintenant, il faut savoir ce que tu nommes tableau

Si le code modifié fonctionne, rien à redire.

Sinon, si il a une suite, tu joins un fichier.

Cdlt.

1/ La ligne où il y a attention? elle sert à quoi stp?

2/ Ben dès fois ça marche, et dès fois ça ne marche pas .... et je ne sais pas la raison.

cela demande un débogage là dessus quand ça ne fonctionne pas.

Set objChart = wsChart.ChartObjects.Add _
            (Left:=wsChart.Columns("c").Left, _
            Top:=wsChart.Rows(9).Top, _
            Width:=600, _
            Height:=250)

C9 n'est pas une cellule fusionné au cas où...

Il y a une formule dans C9 si ça pose souci , je ne sais pas.

Re,

1 - Regarde l'aide VBA sur CurrentRegion (double clic sur CurrentRegion puis F1)

2 - Joins un fichier.

Cdlt.

Tout à l'air correct.

C'était un problème de protection de feuille. C'est tout.

Merci pour ton aide. J'ai profité de ton codes pour faire d'autres graphiques juste en histogramme par exemple et sans légende. Grâce à toi j'y suis arrivé.

Je te remercie très sincèrement.

Re,

Merci pour tes remerciements.

Il est parfois difficile de faire simple.

Cdlt.

J'ai fait des modifications dans mon tableau et du coup le code ne marche plus sauf si je supprime cela.

Set rngChart = wsData.Cells(3, 1).CurrentRegion ' Attention!...

C'est grave de l'enlever vu que ça marche apparemment ?

Il y a dessous dans le code la plage de sélection exacte (ici de a1 à a31 et de f1 à F31) et elle restera toujours celle là.. Du coup le currentRegion ne me sert pas si? (j'ai fait des recherches sur le current region avant. je n'ai pas tout compris non plus j'avoue).

.SetSourceData Source:=Feuil241.Range("A1:A31,F1:F31")
Rechercher des sujets similaires à "debogage graphique vba"