Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Courbe personnalisée ajoutée sur un GCD

  • Initiateur de la discussion Initiateur de la discussion Simon85
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

S

Simon85

Guest
Bonjour à tous.

J'ai un petit problème que je n'arrive pas à résoudre sur excel et ça commence à me faire **bip**... 🙂
J'ai un tableau de valeurs quelconques (nombre de défaut disons) correspondant à différents types de produits (c'est peu clair mais vous trouverez un exemple en PJ un peu plus explicite).
De ce tableau je tire un GCD en colonne et je voudrais tirer un trait sur ce graphique qui représente la moyenne des défauts des produits, mais impossible de trouver une tactique qui fonctionne.

Je pensais rajouter une droite créée par une équation établie mais...

Merci d'avance
 

Pièces jointes

Dernière modification par un modérateur:
Re : Courbe personnalisée ajoutée sur un GCD

Re,

Maintenant passons à la 2ème partie du problème :

-tracer une seconde droite avec une équation de type y=ax+b

Une telle équation n'a pas de sens avec des catégories pour abscisses.

Je propose de définir la droite par 2 points extrêmes d'ordonnées Y1 et Y2 en P19 et R19.

Elle est positionnée par cette macro :

Code:
 Sub PositionDroite()
Dim W#, X#, Y1#, Y2#
On Error Resume Next 'les ordonnées peuvent être des valeurs d'erreur
With ActiveSheet.ChartObjects(1).Chart
  W = .PlotArea.InsideWidth
  X = .PlotArea.InsideLeft
  Y1 = PositionOrdonnee(.Parent.Chart, [Y_1])
  Y2 = PositionOrdonnee(.Parent.Chart, [Y_2])
  With .Shapes("Line 2") 'adapter le nom de la shape
    .Visible = Err = 0 'masquée si erreur
    .Width = W
    .Height = Abs(Y1 - Y2)
    .Left = X
    .Top = Application.Min(Y1, Y2)
    If (Y2 < Y1) <> [DroiteMonte] Then
      .Flip msoFlipVertical 'retournement
      ThisWorkbook.Names.Add "DroiteMonte", Y2 < Y1 'mémorisation
    End If
  End With
End With
End Sub
Les 2 procédures Sub utilisent cette fonction :

Code:
Function PositionOrdonnee(Ch As Chart, valeur)
Dim Y1#, Y2#, maxi#, mini#
With Ch
  Y1 = .PlotArea.InsideTop 'position du maximum
  Y2 = Y1 + .PlotArea.InsideHeight 'position du minimum
  maxi = .Axes(xlValue).MaximumScale 'échelle des ordonnées
  mini = .Axes(xlValue).MinimumScale
  PositionOrdonnee = Y2 - (valeur - mini) * (Y2 - Y1) / (maxi - mini)
End With
End Function
Fichier (7). Bien voir les noms définis Moyenne, Y_1, Y_2 et DroiteMonte.

A+
 

Pièces jointes

Dernière édition:
Re : Courbe personnalisée ajoutée sur un GCD

Bonsoir,

En fait le TCD peut aller jusqu'à la colonne L si l'on coche les (vides) pour Défault et subdef.

Dans le fichier (7) je vais donc modifier la formule de la moyenne en P16 :

Code:
=RECHERCHEV("Total";E:L;1+NBVAL(F6:L6);0)/(EQUIV("Total";E:E;0)-EQUIV("Objet";E:E;0)-1)
Bonne nuit.
 
Re : Courbe personnalisée ajoutée sur un GCD

Salut job75.

Bon déjà merci bcp, mais ne te prends pas la tête pour moi. Au vu de l'heure à laquelle tu post tes derniers articles, je me dis que je t'empêche de dormir.
Je n'ai pas le temps de regarder ça ce matin mais j'essaierai d'y jeter un oeil cet après-midi. Encore merci
 
Re : Courbe personnalisée ajoutée sur un GCD

Bonjour Simon, le forum,

Passons au 3ème objectif : la construction du graphique Camembert :

Code:
Sub AfficheCamembert()
Dim NbCol As Byte
On Error Resume Next 'si le graphique n'existe pas
With ActiveSheet.ChartObjects(2)
  If Intersect(ActiveCell, [Objet]) Is Nothing Then .Visible = False: Exit Sub
  Application.EnableEvents = False
  NbCol = [Champ].Count
  [Camembert].ClearContents
  [Camembert].Resize(1, NbCol) = [Champ].Value
  [Camembert].Rows(2).Resize(, NbCol) = ActiveCell.Resize(, NbCol).Value
  [Camembert].Rows(2).Cells(1) = "Objet " & ActiveCell
  .Chart.SetSourceData [Camembert].Resize(, NbCol)
  .Visible = True
  Application.EnableEvents = True
End With
End Sub
Fichier (8). Voir les noms définis Camembert, Champ, Objet.

A+
 

Pièces jointes

Dernière édition:
Re : Courbe personnalisée ajoutée sur un GCD

Re,

J'ai testé sur mon portable avec Excel 2010.

Dans certains cas "Total" est remplacé par "Total général" 😡

Edition : j'ai donc modifié la recherche dans Champ et Objet.

Au lieu de "Total" on recherche "zzz"...

La formule de la moyenne a été aussi modifiée :

Code:
=INDEX(E8:L14;LIGNES(Objet)+1;COLONNES(Champ)+1)/LIGNES(Objet)
Fichier (9).

A+
 

Pièces jointes

Dernière édition:
Re : Courbe personnalisée ajoutée sur un GCD

Bonjour Simon, le forum,

Un outil pour le graphique camembert qui peut être intéressant.

La zone de traçage est incolore. Si l'on veut la sélectionner (pour la déplacer), exécuter :

Code:
Sub ZoneTraçageCamembert() 'outil facultatif
With ActiveSheet.ChartObjects(2)
  .Visible = True
  .Activate
  .Chart.PlotArea.Select
End With
End Sub
Fichier (9bis).

A+
 

Pièces jointes

Re : Courbe personnalisée ajoutée sur un GCD

Re,

Je continue à rouler tout seul, mais j'ai cru comprendre que Simon a des problèmes avec la sécurité macros 🙁

Je me suis demandé ce que l'on pouvait bien pouvoir faire avec cette droite Y1 - Y2.

On peut par exemple supposer que les objets A E R T Z sont des produits fabriqués successivement.

Et l'on cherche à voir la tendance générale d'évolution des défauts.

Alors on peut utiliser une droite de régression, voir fichier (11).

Formule en P20 à tirer vers la droite :

Code:
=INDEX(DECALER(Objet;;COLONNES(Champ));P19)
En P23 (Y1) :

Code:
=PREVISION(0,5;DECALER(P20;;;;NB(P20:U20));DECALER(P19;;;;NB(P20:U20)))
En R23 (Y2) :

Code:
=PREVISION(0,5+NB(P20:U20);DECALER(P20;;;;NB(P20:U20));DECALER(P19;;;;NB(P20:U20)))
Edit : j'avais créé une fonction VBA, mais c'est plus simple par formule avec PREVISION.

A+
 

Pièces jointes

Dernière édition:
Re : Courbe personnalisée ajoutée sur un GCD

Bonsoir,

Commentaire sur le positionnement de la droite Y1 - Y2.

Sur Excel 2003 c'est toujourd impeccable.

Mais sur Excel 2010 la droite se décale quand le TCD n'affiche pas tous les 4 défauts.

Je n'essaye pas d'élucider ce mystère, et je vais me coucher.

Bonne nuit.
 
Re : Courbe personnalisée ajoutée sur un GCD

Bonjour Simon, le forum,

J'ai compris ce qui se passe pour la droite Y1 - Y2.

Sur Excel 2010, Excel limite automatiquement Y1 et Y2 aux ordonnées des bords inférieur et supérieur du graphique.

Sur Excel 2003 il n'y a pas cette limitation.

Je ne vois pas de solution pour Excel 2010 😡

A+
 
Re : Courbe personnalisée ajoutée sur un GCD

Re,

Bon, la solution c'est d'ajuster le maximum et le minimum de l'axe des ordonnées de manière que Y1 et Y2 soient dans le graphique :

Code:
With .Axes(xlValue) 'axe des ordonnées
    .MinimumScale = Int(Application.Min(0, [Y_1], [Y_2]))
    .MaximumScaleIsAuto = True
    .MaximumScale = Application.Max(.MaximumScale, [Y_1], [Y_2])
    .CrossesAt = .MinimumScale
End With
J'ai corrigé les fichiers (10) et (11), travaillez avec les fichiers joints.

A+
 

Pièces jointes

Re : Courbe personnalisée ajoutée sur un GCD

Bonjour Simon, le forum,

On a abandonné ?

La valeur du minimum doit s'adapter à l'unité de l'axe des ordonnées :

Code:
With .Axes(xlValue) 'axe des ordonnées
    .MinimumScale = Int(Application.Min(0, [Y_1], [Y_2]))
1   .MaximumScaleIsAuto = True
    .MaximumScale = Application.Max(.MaximumScale, [Y_1], [Y_2])
    If .MajorUnit >= 1 Then
      If .MinimumScale Mod .MajorUnit <> 0 Then .MinimumScale = .MinimumScale - 1: GoTo 1
    End If
End With
Voir les fichiers (12) et (13).

A+
 

Pièces jointes

Re : Courbe personnalisée ajoutée sur un GCD

Re,

J'ai revu (avec peine) l'itération pour déterminer le minimum :

Code:
With .Axes(xlValue) 'axe des ordonnées
    .MinimumScale = Int(CDec(Application.Min(0, [Y_1], [Y_2])))
    .MaximumScale = Application.Max([Y_1], [Y_2])
1   .MinimumScale = Int(CDec(.MinimumScale / .MajorUnit)) * .MajorUnit
    .MaximumScaleIsAuto = True
    .MaximumScale = Application.Max(.MaximumScale, [Y_1], [Y_2])
    If Int(CDec(.MinimumScale / .MajorUnit)) <> .MinimumScale / .MajorUnit Then GoTo 1
End With
Fichiers (14) et (15).

A+
 

Pièces jointes

Dernière édition:
Re : Courbe personnalisée ajoutée sur un GCD

Bonjour Simon, le frum,

L'utilisation d'une étiquette de données pour afficher "moyenne 11,60" n'est pas forcément une bonne idée.

Il vaut mieux finalement utiliser une Zone de texte dans le graphique.

Fichiers (16) et (17).

Edit : j'ai aussi ajouté l'équation de la droite de régression. Mais c'est promis, j'arrête...

A+
 

Pièces jointes

Dernière édition:
Re : Courbe personnalisée ajoutée sur un GCD

Bonjour job75, bonjour le forum

Désolé de ne pas avoir eu le tps de vous répondre. Je suis actuellement reparti sur un autre projet, devenu trop prioritaire sur celui-ci (ces clients... tous les mêmes 🙂 ). Toujours est-il que non, je ne compte pas abandonner, j'aimerais bien comprendre ce qui ne va pas, mais je suis actuellement un peu trop chargé pour plonger dans les profondeurs obscures de VBA (ne vous inquiétez pas, cela me servira dans les semaines (jours?) à venir.
Encore merci pour l'ENORME travail que vous avez accompli et toutes mes félicitations pour ça.

Cordialement
Simon
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…