IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

graphs de deux colonnes sans celles au milieu


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Par défaut graphs de deux colonnes sans celles au milieu
    Bonjour
    J'ai un petit problème sur une macro. Voici ce que je souhaite faire
    J'ai huit colonnes de données et je veux faire des graphs de ces données 2 par 2 (un paramètre vs un autre).
    Mon problème est le suivant : les graphs crées contiennent plusieurs séries. Ils ont tous la même abscisse et chaque série correspond aux données entre les deux colonnes que je veux réellement avoir. J'arrive à les enlever et j'obtiens au final ce que je souhaite.mais j'aimerais bien comprendre ce qu'il se passe. Je suppose que mon Range est mal défini. Une idée?
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    Private Sub CommandButton6_Click()
     
    Application.ScreenUpdating = False
     
     Dim x As Range
     Dim y As Range
     Dim nbrdate As Integer
     Dim données As Worksheet
     
     If OptionButton1.Value = True Then
     Set données = Sheets("Données")
     Else: Set données = Sheets("Données lissées")
     End If
     
     'on compte le nbre de ligne
     données.Activate
     nbrdate = données.Range("B1", [B65000].End(xlUp)).count
     
     'on supprime les anciens graphs
             Dim iChtIx As Long, iChtCt As Long
     
             iChtCt = Sheets("Corrélations").ChartObjects.count
             If iChtCt <> 0 Then
             For iChtIx = 1 To iChtCt
                Sheets("Corrélations").ChartObjects(1).Delete
             Next
             End If
     
     
    'début de la boucle pour tracer les graphs à partir des colonnes de données i et j.
    Dim i, j As Integer
     
    For i = 3 To 10
        For j = 3 To 10
            If i > j Then
     
            Set x = données.Range(Chr(i + 64) & "2:" & Chr(i + 64) & "" & nbrdate)
            Set y = données.Range(Chr(j + 64) & "2:" & Chr(j + 64) & "" & nbrdate)
            Sheets("Corrélations").Activate
     
    'graphs
     
        Charts.Add
        ActiveChart.ChartType = xlXYScatter
        ActiveChart.SetSourceData Source:=données.Range(x, y), PlotBy:=xlColumns
        ActiveChart.Location Where:=xlLocationAsObject, Name:="Corrélations"
        ActiveChart.HasLegend = False
        ActiveChart.HasTitle = False
        ActiveChart.PlotArea.Select
        With Selection.Border
            .ColorIndex = 16
            .weight = xlThin
            .LineStyle = xlContinuous
        End With
     
        With ActiveChart.SeriesCollection(1).Border
            .weight = xlThin
            .LineStyle = xlAutomatic
        End With
     
        'On enlève les séries en trop
        Dim nbrSeries As Integer
        Dim ser As Integer
     
        nbrSeries = ActiveChart.SeriesCollection.count
        MsgBox nbrSeries
        If nbrSeries > 1 Then
        For ser = 1 To nbrSeries - 1
        ActiveChart.SeriesCollection(1).Delete
        Next ser
        Else
        End If
     
        'et on arrange les graphs
        With ActiveChart.SeriesCollection(1)
            .MarkerBackgroundColorIndex = xlAutomatic
            .MarkerForegroundColorIndex = xlAutomatic
            .MarkerStyle = xlDiamond
            .Smooth = False
            .MarkerSize = 3
            .Shadow = False
        End With
     
        'delimite les bornes des échelles
        With ActiveChart.Axes(xlValue)
              .MinimumScale = UserForm2.Controls("TextBox" & (i - 2) * 10).Value
              .MaximumScale = UserForm2.Controls("TextBox" & (i - 2) * 10 + 1).Value
        End With
        With ActiveChart.Axes(xlCategory)
              .MinimumScale = UserForm2.Controls("TextBox" & (j - 2) * 10).Value
              .MaximumScale = UserForm2.Controls("TextBox" & (j - 2) * 10 + 1).Value
        End With
     
        ActiveChart.PlotArea.ClearFormats
        ActiveChart.Axes(xlValue).MajorGridlines.Delete
     
        ActiveChart.SeriesCollection(1).Select
        With Selection.Border
            .ColorIndex = 41
            .weight = xlThin
            .LineStyle = xlContinuous
        End With
        With Selection
            .MarkerBackgroundColorIndex = 41
     
            .MarkerForegroundColorIndex = 41
            .MarkerStyle = xlDiamond
            .Smooth = False
            .MarkerSize = 3
            .Shadow = False
        End With
     
            With ActiveChart
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = UserForm2.Controls("TextBox" & j - 2).Value
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = UserForm2.Controls("TextBox" & i - 2).Value
            End With
     
    'on nomme le graph
     Sheets("Corrélations").ChartObjects(Sheets("Corrélations").ChartObjects.count).Name = i & j
     
    'positionnement des graphs
             Dim MyWidth As Long, MyHeight As Long
             MyWidth = 250
             MyHeight = 150
     
                 With ActiveSheet.ChartObjects(i & j)
                     .Width = MyWidth
                     .Height = MyHeight
                     .Left = (j - 3) * MyWidth
                     .Top = 200 + (i - 3) * MyHeight
                 End With
    '                 ActiveChart.PlotArea.Select
    '                 Selection.Top = 15
    '                 Selection.Width = 200
    '                 Selection.Left = 5
    '                 Selection.Height = 120
     
        With ActiveChart.ChartArea.Font
            .Name = "Calibri"
            .Size = 13
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ColorIndex = xlAutomatic
            .Background = xlAutomatic
        End With
     
     
     
     
     
            Else
            End If
     
        Next j
     
    Next i
     
     
    Unload UserForm1
     
    Application.ScreenUpdating = True
     
    End Sub
    Merci!

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    J'ai du mal à comprendre; si tu as ce que tu veux, pourquoi te soucier d'un "Range" mal défini ? Poste un classeur exemple et explique quel est ton problème.

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Un code bien structuré est facilement maintenable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    Option Explicit
     
    Private Sub CommandButton6_Click()
    Dim i As Integer, j As Integer
    Dim Grf As ChartObject
    Dim DATA As Worksheet
    Dim NbrDate As Long
    Dim X, Y
     
    Application.ScreenUpdating = False
    For Each Grf In Worksheets("Corrélations").ChartObjects
        Grf.Delete
    Next Grf
     
    If OptionButton1.Value = True Then
        Set DATA = Worksheets("DATA")
    Else
        Set DATA = Worksheets("DATA lissées")
    End If
     
    With DATA
        NbrDate = .Cells(.Rows.Count, "B").End(xlUp).Row
        For j = 3 To 9
            Y = .Range("A2").Offset(j - 1).Resize(NbrDate)
            For i = j + 1 To 10
                X = .Range("A2").Offset(i - 1).Resize(NbrDate)
                TraceGraphique X, Y, i, j
            Next i
        Next j
    End With
    End Sub
     
    Private Sub TraceGraphique(ByVal X, ByVal Y, ByVal i As Integer, ByVal j As Integer)
    Dim MyWidth As Long, MyHeight As Long, myLeft As Long, myTop As Long
    Dim Ch As Chart
     
    MyWidth = 250
    MyHeight = 150
    myLeft = (j - 3) * MyWidth
    myTop = 200 + (i - 3) * MyHeight
     
    Set Ch = Worksheets("Corrélations").ChartObjects.Add(myLeft, myTop, MyWidth, MyHeight).Chart
    With Ch
        .ChartArea.ClearContents
        .ChartType = xlXYScatter
        .HasLegend = False
        .HasTitle = False
     
        With .ChartArea
            .ClearContents
            With .Font
                .Name = "Calibri"
                .Size = 13
            End With
        End With
     
        With .PlotArea
            .ClearFormats
            With .Border
                .ColorIndex = 16
                .Weight = xlThin
            End With
        End With
     
        With .Axes(xlCategory, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = UserForm2.Controls("TextBox" & j - 2).Value
            .MinimumScale = UserForm2.Controls("TextBox" & (j - 2) * 10).Value
            .MaximumScale = UserForm2.Controls("TextBox" & (j - 2) * 10 + 1).Value
     
        End With
     
        With .Axes(xlValue, xlPrimary)
            .MajorGridlines.Delete.HasTitle = True
            .AxisTitle.Characters.Text = UserForm2.Controls("TextBox" & i - 2).Value
            .MinimumScale = UserForm2.Controls("TextBox" & (i - 2) * 10).Value
            .MaximumScale = UserForm2.Controls("TextBox" & (i - 2) * 10 + 1).Value
        End With
     
        With .SeriesCollection.NewSeries
            .XValues = X
            .Values = Y
            With .Border
                .ColorIndex = 41
                .Weight = xlThin
                .LineStyle = xlAutomatic
            End With
            .MarkerBackgroundColorIndex = 41
            .MarkerForegroundColorIndex = 41
            .MarkerStyle = xlDiamond
            .MarkerSize = 3
        End With
    End With
    Set Ch = Nothing
    End Sub

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Par défaut
    Merci pour le code mercatog. Je vais restructurer selon ton exemple.

    J'aurais tout de même voulu savoir pourquoi ma syntaxe était mauvaise.
    Pourquoi quand j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Charts.Add
        ActiveChart.ChartType = xlXYScatter
        ActiveChart.SetSourceData Source:=données.Range(x, y), PlotBy:=xlColumns
    j'obtiens un graph ou sont tracées les courbes qui correspondent à toutes les colonnes comprises entre ma colonne x et ma colonne y?
    Ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .SeriesCollection.NewSeries
            .XValues = X
            .Values = Y
    résout le problème mais je ne comprend quand même pas pourquoi ce que j'ai marqué ne fonctionne pas.

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Quand manuellement une cellule sélectionnée se trouve dans une plage de donnée, quand tu insère un graphique, excel pense pour toi et prend toute la plage comme source de données.

    Remarque, j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ch.ChartArea.ClearContents
    Pour effacer tout.

    Par ta méthode, tu peux aussi le faire avant SetSourceData

    PS. je trouve qu'ajouter une feuille graphique, ensuite la déplacer et la dimensionner dans ta feuille de donnée à l'aide de Chart.Add et les lignes pour déplacer/dimensionner alors qu'on peut utiliser Chartobjects.Add(L,T,W,H) et le tour est joué

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Par défaut
    Je débute encore donc je ne savais pas que Chart.add crée une nouvelle feuille. je vais utiliser Chartobjects.Add(L,T,W,H).
    Merci beaucoup pour les réponses et la réactivité!
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. liste de deux colonnes sans doublons
    Par jopont dans le forum Excel
    Réponses: 1
    Dernier message: 19/03/2015, 10h21
  2. comparer deux colonnes datetime sans tenir compte de HH:MM:SS
    Par Msysteme dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/08/2010, 00h28
  3. Réponses: 3
    Dernier message: 20/07/2010, 11h58
  4. Tableau 3 colonnes dont celle du milieu toujours centrée
    Par redah75 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 23
    Dernier message: 22/06/2009, 14h23
  5. Réponses: 1
    Dernier message: 28/03/2008, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo