XL 2019 Supprimer message d'alerte excel (valeur nulles ou négatives échelle logarithmique)

WIsh_

XLDnaute Occasionnel
Bonsoir à tous,

Je n'arrive pas à empêcher le message suivant d'apparaitre lors de la création d'un graph via une macro :
"impossible de représenter correctement des valeurs nulles ou négatives sur des graphiques logarithmiques [...]".

En effet, le graph se créée à partir d'une table variable, dans laquelle certaines valeurs peuvent être nulles.
J'ai du mettre une échelle logarithmique pour que le graph soit lisible car j'ai de très grandes valeurs et de très petites valeurs.

Le message d'erreur bloque l'exécution de la macro (même d'excel, on est obligé de cliquer sur ok), sans toutefois la bugger. Une fois qu'on clique sur ok, le reste de l'event se poursuit et le graphique se génère.

- Y a-t-il un moyen du genre application.displayalerts = false pour empêcher ce message d'apparaitre ?
- Y a-t-il un moyen de cliquer sur ok automatiquement via macro ?
- y a-t-il une autre solution (sans modifier mes données) ? Peut-être en précisant dans la macro d'exclure de la série les valeurs à 0 ?

Merci d'avance pour votre retour,
Wish
 

job75

XLDnaute Barbatruc
Voyez le fichier joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Variant, n&
With [A1].CurrentRegion
    .Sort .Columns(2), xlAscending, Header:=xlYes 'tri sur la 2ème colonne
    lig = Application.Match(0, .Columns(2))
    If IsError(lig) Then lig = 1
    n = Application.CountIf(.Columns(2), ">0")
    If n < 2 Then n = 2
    ThisWorkbook.Names.Add "X", Cells(lig + 1, 1).Resize(n).Value 'nom défini
    ThisWorkbook.Names.Add "Y", Cells(lig + 1, 2).Resize(n).Value 'nom défini
    ChartObjects(1).Chart.Axes(xlCategory).MinimumScale = Application.Min([X])
    ChartObjects(1).Chart.Axes(xlCategory).MaximumScale = Application.Max([X])
End With
End Sub
Elle se déclenche quand on modifie ou valide une cellule quelconque.

Pour tester ajoutez ou retranchez des valeurs <= 0 dans la colonne des ordonnées Y.
 

Pièces jointes

  • Graphe Log(1).xlsm
    25.5 KB · Affichages: 2
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour le fil, le forum,

Les noms X et Y sont définis par des formules, celles-ci comme toutes les formules sont limitées à 8192 caractères.

Donc le nombre de points traités par la macro a aussi une limite.

Bonne journée.
 

job75

XLDnaute Barbatruc
Ah mais non, au lieu de définir les noms X et Y sur des valeurs (.Value) on peut les définir sur les cellules :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Variant, n&
With [A1].CurrentRegion
    .Sort .Columns(2), xlAscending, Header:=xlYes 'tri sur la 2ème colonne
    lig = Application.Match(0, .Columns(2))
    If IsError(lig) Then lig = 1
    n = Application.CountIf(.Columns(2), ">0")
    If n < 2 Then n = 2
    ThisWorkbook.Names.Add "X", Cells(lig + 1, 1).Resize(n) 'nom défini
    ThisWorkbook.Names.Add "Y", Cells(lig + 1, 2).Resize(n) 'nom défini
    ChartObjects(1).Chart.Axes(xlCategory).MinimumScale = Application.Min([X])
    ChartObjects(1).Chart.Axes(xlCategory).MaximumScale = Application.Max([X])
End With
End Sub
Contrairement à ce que je croyais il n'y a pas d'alerte si l'on met zéro par exemple en B8.

Donc maintenant il n'y a plus de limite, utilisez ce fichier (2).

Edit : je conclus de ce qui précède que chez moi sur Excel 2019 le graphique se met à jour après l'exécution de la macro, est-ce bien le cas sur toute version Excel ?
 

Pièces jointes

  • Graphe Log(2).xlsm
    25.5 KB · Affichages: 4
Dernière édition:

WIsh_

XLDnaute Occasionnel
Re bonjour @job75 ,

Après avoir longuement essayé je dois faire part de mon échec dans ma tentative d'adaptation de cet exemple à mon type de graphique et à mes données...

L'idéal serait de pouvoir exclure de chaque série les points qui valent 0.

Wish
 
Dernière édition:

WIsh_

XLDnaute Occasionnel
Re bonsoir,

J'ai ajouté une formule dans ma table qui remplace les données à 0 par 1.
1 étant le 0 de mon échelle logarithmique, je n'ai plus le message.

Je n'ai pas trouvé la syntaxe pour masquer les étiquettes de données de mon graphique si la valeur du point = 0.

Quelqu'un une idée ?
Merci d'avance,

Wish
 

job75

XLDnaute Barbatruc
Le graphique étant créé il est totalement inutile de le recréer à chaque modification !

Voyez le fichier joint et cette macro dans le code de la feuille "Graph" :
VB:
Private Sub Worksheet_Activate()
Dim a, ch As Chart, P As Range, j%, b, i&, sc As Series
a = Array("YA", "YB", "YC")
Set ch = Sheets("Graph").ChartObjects(1).Chart
Set P = [Tableau9] 'tableau structuré
ThisWorkbook.Names.Add "X", P.Columns(1) 'définit les abscisses
For j = 0 To UBound(a)
    b = P.Columns(j + 2)
    If Not IsArray(b) Then b = P.Columns(j + 2).Resize(2) 'au moins 2 éléments
    For i = 1 To UBound(b)
        If Val(b(i, 1)) <= 0 Then b(i, 1) = 1 'valeur suffisamment petite
    Next i
    ThisWorkbook.Names.Add a(j), b 'définit les ordonnées
    '---étiquettes---
    Set sc = ch.SeriesCollection(Right(a(j), 1))
    For i = 1 To UBound(b)
        sc.Points(i).DataLabel.Characters.Text = IIf(b(i, 1) = 1, "", b(i, 1))
Next i, j
End Sub
Bonne nuit.
 

Pièces jointes

  • Test(1).xlsm
    34.7 KB · Affichages: 4
Dernière édition:

WIsh_

XLDnaute Occasionnel
Bonjour @job75 ,

Merci beaucoup déjà.

Je suis entrain de tester, le graphique ne se met pas à jour lors de la 1ère activation de la feuille après la modification des données sur la feuille "dongraph1". Et lors de la 2ème activation de la feuille du graph, le message "impossible de représenter les valeurs nulles ou..." apparait la première fois.

Aussi, je n'arrive pas à redimensionner le graphique ( .height = X) en fonction du nombre de valeurs affichées.
Si on applique un filtre sur la colonne 1 de la feuille "dongraph1", le graph devrait se redimensionner suivant le code.

Merci encore et bon dimanche,
Wish
 

Pièces jointes

  • test3.xlsm
    36.3 KB · Affichages: 4

job75

XLDnaute Barbatruc
Avec le tableau structuré il y avait un message d'alerte intempestif quand on y ajoutait une ligne.

Je l'ai transformé en plage normale dans ce fichier (2) et modifié le code :
VB:
Private Sub Worksheet_Activate()
Dim a, ch As Chart, P As Range, j%, b, i&, sc As Series
a = Array("YA", "YB", "YC")
Set ch = Sheets("Graph").ChartObjects(1).Chart
Set P = Sheets("Dongraph1").[A1].CurrentRegion
If P.Rows.Count > 1 Then Set P = P.Rows(2).Resize(P.Rows.Count - 1)
ThisWorkbook.Names.Add "X", P.Columns(1) 'définit les abscisses
For j = 0 To UBound(a)
    b = P.Columns(j + 2)
    If Not IsArray(b) Then b = P.Columns(j + 2).Resize(2) 'au moins 2 éléments
    For i = 1 To UBound(b)
        If Val(b(i, 1)) <= 0 Then b(i, 1) = 1 'valeur suffisamment petite
    Next i
    ThisWorkbook.Names.Add a(j), b 'définit les ordonnées
    '---étiquettes---
    Set sc = ch.SeriesCollection(Right(a(j), 1))
    For i = 1 To UBound(b)
        sc.Points(i).DataLabel.Characters.Text = IIf(b(i, 1) = 1, "", b(i, 1))
Next i, j
End Sub
PS : je vois que vous n'avez pas compris ce que je fais : allez voir dans le graphique comment sont définies les 3 séries à partir des noms X YA YB YC.

Par ailleurs il ne doit pas y avoir d'autre macro.
 

Pièces jointes

  • Test(2).xlsm
    31.1 KB · Affichages: 2
Haut Bas