Séries de données et graphique

Bonjour la communauté .o/

Je fais appel à vous pour un problème sur lequel je sèche...

J'ai un classeur avec un graphique sur lequel on peut ajouter des lignes droites sur l'axe des ordonnées via le bouton "Ajouter Zone", comme les images parlent mieux que les mots voici un exemple :

image

Ce que je voudrais faire c'est une macro qui détecte lorsque trois lignes droites sont superposées et qui en créée une nouvelle comme dans l'exemple Paint ( :D ) ci-dessous :

image

Merci d'avance pour votre aide :)

PS : le nom des séries de données (des lignes droites) s'incrémente à chaque nouvelle entrée.

Bonjour,

Votre graphique est bien tiré d'un tableau de données, non!

il vous suffit dans ce cas d'ajouter une quatrième colonne ou vous y mettrez une formule qui vérifie si les 3 autres colonnes sont remplies, et qui renvoie 1 si la conditions sont réunies, soit rien dans l'autre cas, et ajoutez cette colonne dans le graphique.

Cdlt

Merci pour votre réponse.

Mes séries ne sont pas tirées d'un tableau non. Mais je pense qu'il va falloir que j'extrais les valeurs entrées par l'utilisateur pour en faire un tableau et ensuite travailler sur les données du tableau effectivement...

Ceci dit ca ne résout pas mon problème, comment faire savoir à ma macro si j'ai 3 lignes qui se superposent et détecter à quel "x" la superposition commence et à quel "x" elle finie ?

bonjour,

Vous avez un fichier avec un exemple ?

Bonjour, oui je le met ci-joint :)

bonjour, en lisant les valeurs X

Sub Commun()
     Dim x(), MesX
     With Sheets("zone").ChartObjects(1).Chart     'votre graphique
          For i = 1 To .FullSeriesCollection.Count     'les séries
               With .FullSeriesCollection(i)     'boucle séries
                    MesX = .XValues     'coordinates X
                    If UBound(MesX) = 2 Then     'il y a 2
                         ptr = ptr + 1     'augmenter pointer
                         If ptr = 1 Then ReDim x(1 To 2, 1 To 1) Else ReDim Preserve x(1 To 2, 1 To ptr)     'mettre à jour dimensions tableau
                         x(1, ptr) = MesX(1)     'sauvegarder dans le tableau
                         x(2, ptr) = MesX(2)
                    End If
               End With
          Next
     End With

     i1 = Application.Max(Application.Index(x, 1, 0))
     i2 = Application.Min(Application.Index(x, 2, 0))

     If i1 <= i2 Then
          MsgBox "valeurs commun = " & i1 & "-" & i2
     Else
          MsgBox "erreur"
     End If

End Sub

re,

avec une 2ième ligne pour le même Y, c'est un petit peu plus compliqué, mais faisable ...

Voir données à partir de A32

Merci Bart pour ton aide :)

Malheureusement ça ne fonctionne pas.

J'ai réussi de mon côté à faire fonctionner un code mais malheureusement lorsqu'il y a deux lignes droites qui sont superposées à l'intérieure de deux autres sur les autres axes en y ça bugue.

Je joins le code au cas ou ça donnerait des idées :

Sub AnalyserGraphique()
    Dim cht As Chart
    Dim srs As Series
    Dim i As Long, j As Long
    Dim x1Debut As Double, x1Fin As Double
    Dim x2Debut As Double, x2Fin As Double
    Dim x3Debut As Double, x3Fin As Double
    Dim inSeries1 As Boolean, inSeries2 As Boolean, inSeries3 As Boolean
    Dim xs1Debut As Double
    Dim xs1fin As Double
    Dim sauvx1Fin As Double, sauvx2Fin As Double, sauvx3Fin As Double

    Set cht = ThisWorkbook.Worksheets("Zone").ChartObjects("Graphique 2").Chart

    inSeries1 = False
    inSeries2 = False
    inSeries3 = False
    j = 1

    Do While j <= cht.SeriesCollection.Count
        Set srs = cht.SeriesCollection(j)
        For i = 1 To UBound(srs.XValues)
            ' Pour y = -1
            If srs.Values(i) = -1 And Not inSeries1 Then
                x1Debut = srs.XValues(i)
                inSeries1 = True
            ElseIf srs.Values(i) = -1 And inSeries1 Then
                x1Fin = srs.XValues(i)
            ElseIf srs.Values(i) <> -1 And inSeries1 Then
                inSeries1 = False
            End If

            ' Pour y = -2
            If srs.Values(i) = -2 And Not inSeries2 Then
                x2Debut = srs.XValues(i)
                inSeries2 = True
            ElseIf srs.Values(i) = -2 And inSeries2 Then
                x2Fin = srs.XValues(i)
            ElseIf srs.Values(i) <> -2 And inSeries2 Then
                inSeries2 = False
            End If

            ' Pour y = -3
            If srs.Values(i) = -3 And Not inSeries3 Then
                x3Debut = srs.XValues(i)
                inSeries3 = True
            ElseIf srs.Values(i) = -3 And inSeries3 Then
                x3Fin = srs.XValues(i)
            ElseIf srs.Values(i) <> -3 And inSeries3 Then
                inSeries3 = False
            End If
        Next i

        ' Comparer les valeurs des zones
        ' xdébut
        If x1Debut >= x2Debut And x1Debut >= x3Debut Then
            xs1Debut = x1Debut
        ElseIf x2Debut >= x1Debut And x2Debut >= x3Debut Then
            xs1Debut = x2Debut
        Else
            xs1Debut = x3Debut
        End If

        ' xfin
        If x1Fin <= x2Fin And x1Fin <= x3Fin Then
            xs1fin = x1Fin
        ElseIf x2Fin <= x1Fin And x2Fin <= x3Fin Then
            xs1fin = x2Fin
        Else
            xs1fin = x3Fin
        End If

        ' Ajouter une nouvelle série sur l'axe y = 0 si xs1Debut et xs1fin sont différents et qu'aucun d'entre eux n'est égal à 0
        If xs1Debut <> 0 And xs1fin <> 0 And xs1Debut <> xs1fin Then
            With cht.SeriesCollection.NewSeries
                .name = "Ligne y=0"
                .XValues = Array(xs1Debut, xs1fin)
                .Values = Array(0, 0)
            End With

            ' Trouver la couleur de la série correspondante sur les axes y = -1, y = -2, y = -3
            Dim seriesColor As Long
            seriesColor = RGB(0, 0, 0) ' Par défaut, couleur noire

            For Each srs In cht.SeriesCollection
                If (srs.Values(1) = -1 Or srs.Values(1) = -2 Or srs.Values(1) = -3) And srs.Format.Line.ForeColor.RGB = RGB(255, 255, 0) Then
                    seriesColor = RGB(255, 255, 0) ' Couleur jaune
                    Exit For
                ElseIf (srs.Values(1) = -1 Or srs.Values(1) = -2 Or srs.Values(1) = -3) And srs.Format.Line.ForeColor.RGB = RGB(0, 0, 0) Then
                    seriesColor = RGB(0, 0, 0) ' Couleur noir
                    Exit For
                End If
            Next srs

            ' Appliquer la couleur à la nouvelle série sur l'axe y = 0
            With cht.SeriesCollection("Ligne y=0")
                .Format.Line.ForeColor.RGB = seriesColor
            End With

            ' Enregistrer les valeurs de xFin dans des variables de contrôle
            sauvx1Fin = x1Fin
            sauvx2Fin = x2Fin
            sauvx3Fin = x3Fin

            ' Réinitialiser les variables pour la zone suivante
            x1Fin = 0
            x2Fin = 0
            x3Fin = 0
            x1Debut = 0
            x2Debut = 0
            x3Debut = 0
            inSeries1 = False
            inSeries2 = False
            inSeries3 = False
            xs1Debut = 0
            xs1fin = 0

        End If

        If (xs1Debut > sauvx1Fin Or xs1Debut > sauvx2Fin Or xs1Debut > sauvx3Fin) Then
            x1Debut = xs1Debut
            x2Debut = xs1Debut
            x3Debut = xs1Debut
        End If

        j = j + 1
    Loop
End Sub

C'est un chantier, ne jugez pas ^^

re,

je n'ai pas lu votre macro

Merci BsAlv pour avoir essayé :)

Je réponds tardivement, je n'ai plus eu le temps de m'arracher les cheveux sur cette affaire dernièrement.

Malheureusement ton code ne fonctionne plus lorsque qu'il y a plusieurs séries à différents Y, je pense qu'il faut que je trouve un moyen de passer par une matrice de la taille de mon axe des abscisses (de 1 en 1) avec 3 colonnes, une pour chaque Y utilisés.

Je pourrais mettre une croix ou un 1 dans les cases concernées par une série de données et faire des opérations booléennes par la suite...

bonjour Pem83,

Avez-vous un fichier avec une situation "assez complexe" avec différents Y ?

Bonjour,

Oui, je l'attache ici

7test.xlsm (92.01 Ko)

bonjour,

seulement pour démonstrer, la feuille "Blad1",

* colonne A, tous les Y uniques

* colonne B, nombre est toujours pair, chaue fois le début et fin d'une série de ce Y

Dans la macro, on doit parcourir toutes les combinaisons de chaque Y

On exclut ici les séries Y=0, parce qu'il n'a qu'une série ambetant de 0 à 0 ....

8test-46.xlsm (101.68 Ko)

Merci ! C'est fantastique.

Cela fait 2 mois maintenant que je suis confronté à un mur.

Seriez-vous d'accord pour expliquer la logique suivie ? J'ai compris que vous analysiez toutes les combinaisons possibles pour chaque .XValues mais ce n'est pas clair dans mon esprit.

Merci encore.

voir feuille "Blad1"

les Y unique sont -2, -3 et -1 (colonne A) et leurs début&fin sont en colonne B en paires (paire = un segment de ligne dans le graphique).

Y=-2 a 4 éléments = 2 paires de 450 à 500 et de 100 à 300

Y=-3 égallement 4 éléments = 2 paires de 140 à 500 et de 50 à 120

Y=-1 a 8 éléments = 4 paires, de 400 à 600, de 200 à 350, de 160 à 180 et de 20 à 150.

Le nombre de combinaisons possibles = le produit = 2 * 2 * 4 = 16 combinaisons

voir colonnes D:F = ces 16 combinaisons avec chaque fois l'index du début, vous voyez que j'incremente avec 2 pour récuperer le prochain début. Par exemple combinaisons 16 = 3-3-7 = pour le premier Y = -2 je prend les éléments 3 et 4 (=100 et 300), le 2ième Y (=-3) aussi les éléments 3 et 4 (=50 et 120) et pour le 3ième Y (=-1) je prends les éléments 7 et 8 (=20 et 150)

Donc colonnes I:L vous montrent tous les valeurs "début" de toutes les combinaisons, même chose avec colonnes O:R pour les Fins. En colonne M et S, on prend le plus grand début et le plus petit fin de cette combinaison. Si ce min <= max, alors il y a une intervalle commune, (le MFC n'est pas rouge) et j'ajoute une nouvelle série au graphique. Il y a 5 combinaisons vertes, alors vous voyez 5 segments de ligne pour Y=1

Le clef est donc de bien régistrer vos X's pour chaque Y et puis de vérifier toutes les combinaisons possibles de ces X's et Y's.

La feuille "Blad1" n'est pas nécessaire, mais peut vous montrer la calculation.

8test-46.xlsm (107.44 Ko)

Si vous voulez, vous pouvez ajouter un fichier encore plus complexe, plus compliqué ...

Rechercher des sujets similaires à "series donnees graphique"