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 :
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 :
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 Subre,
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 SubC'est un chantier, ne jugez pas ^^
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,
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 ....
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.
Si vous voulez, vous pouvez ajouter un fichier encore plus complexe, plus compliqué