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

  • Initiateur de la discussion Initiateur de la discussion WIsh_
  • 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 !

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
 
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

Dernière édition:
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.
 
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

Dernière édition:
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:
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
 
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

Dernière édition:
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

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

- 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

Discussions similaires

Réponses
10
Affichages
1 K
Compte Supprimé 979
C
Retour