Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur sur une macro?

10 réponses
Avatar
Pierre
Bonsoir
Pourriez vous me sortir une epine du pied?
Sur la macro suivante, qui change la couleur des barres horizontales d'un
graphique selon leur valeur, j'ai parfois un message d'erreur du type:
erreur d'execution 13, incompatibilté de type.
Toujours sur la ligne If CDbl(rep) < 44 Then.
Et là, la macro coince...
Voici la macro dans sa totalité. D'ou peut bien venir ce bug?


Sub FormatConditionnelGraphiqueCMJ()
'
' Macro enregistrée le 04/12/2005 par PG
'Compte le nombre de séries
For c = 1 To ActiveChart.SeriesCollection.Count
'compte le nombre de points
For d = 1 To ActiveChart.SeriesCollection(c).Points.Count
'teste la présente des étiquettes sur le graphs
If ActiveChart.SeriesCollection(c).Points(d).HasDataLabel = False Then
test = 1
'affiche les étiquettes
ActiveChart.SeriesCollection(c).Points(d).HasDataLabel = True
'récupère les informations des étiquettes
rep = ActiveChart.SeriesCollection(c).Points(d).DataLabel.Text
'convertit l'étiquette en nombre et fais le test
If CDbl(rep) < 44 Then
'suivant le résultat, change la couleur
ActiveChart.SeriesCollection(c).Points(d).Interior.ColorIndex = 3
Else
ActiveChart.SeriesCollection(c).Points(d).Interior.ColorIndex = 19
End If
'remets dans l'état initial le graphique
'If test = 1 Then ActiveChart.SeriesCollection(c).Points(d).HasDataLabel =
False
Next d
Next c
End Sub

10 réponses

Avatar
JB
Bonjour,

If CDbl(Replace(rep,".",",")) < 44 Then.

JB

Bonsoir
Pourriez vous me sortir une epine du pied?
Sur la macro suivante, qui change la couleur des barres horizontales d'un
graphique selon leur valeur, j'ai parfois un message d'erreur du type:
erreur d'execution 13, incompatibilté de type.
Toujours sur la ligne If CDbl(rep) < 44 Then.
Et là, la macro coince...
Voici la macro dans sa totalité. D'ou peut bien venir ce bug?


Sub FormatConditionnelGraphiqueCMJ()
'
' Macro enregistrée le 04/12/2005 par PG
'Compte le nombre de séries
For c = 1 To ActiveChart.SeriesCollection.Count
'compte le nombre de points
For d = 1 To ActiveChart.SeriesCollection(c).Points.Count
'teste la présente des étiquettes sur le graphs
If ActiveChart.SeriesCollection(c).Points(d).HasDataLabel = False Then
test = 1
'affiche les étiquettes
ActiveChart.SeriesCollection(c).Points(d).HasDataLabel = True
'récupère les informations des étiquettes
rep = ActiveChart.SeriesCollection(c).Points(d).DataLabel.Text
'convertit l'étiquette en nombre et fais le test
If CDbl(rep) < 44 Then
'suivant le résultat, change la couleur
ActiveChart.SeriesCollection(c).Points(d).Interior.ColorIndex = 3
Else
ActiveChart.SeriesCollection(c).Points(d).Interior.ColorIndex = 19
End If
'remets dans l'état initial le graphique
'If test = 1 Then ActiveChart.SeriesCollection(c).Points(d).HasDataLa bel =
False
Next d
Next c
End Sub


Avatar
Francois L
Bonsoir
Pourriez vous me sortir une epine du pied?
Sur la macro suivante, qui change la couleur des barres horizontales d'un
graphique selon leur valeur, j'ai parfois un message d'erreur du type:
erreur d'execution 13, incompatibilté de type.
Toujours sur la ligne If CDbl(rep) < 44 Then.
Et là, la macro coince...
Voici la macro dans sa totalité. D'ou peut bien venir ce bug?


Bonjour,

Indépendamment de la réponse de JB, tu peux simplifier ton code. Inutile
de toucher aux étiquettes pour récupérer la valeur de chaque point.

Essaie ce qui suit :

Sub FormatConditionnelGraphiqueCMJ()
For c = 1 To ActiveChart.SeriesCollection.Count
For d = 1 To ActiveChart.SeriesCollection(c).Points.Count
With ActiveChart.SeriesCollection(c)
rep = Application.WorksheetFunction.Index(.Values, d)
If rep < 44 Then
.Points(d).Interior.ColorIndex = 3
Else
.Points(d).Interior.ColorIndex = 19
End If
End With
Next d
Next c
End Sub

--
François L

Avatar
Pierre
Merci à tous, la solution de François marche impec
Pierre
Avatar
Michel Gaboly
Bonjour François,

Si tu veux simplifier, tu peux aussi remplacer le If Then Else par IIf :

.Points(d).Interior.ColorIndex = IIf(rep < 44, 3, 19)

au lieu de

If rep < 44 Then
.Points(d).Interior.ColorIndex = 3
Else
.Points(d).Interior.ColorIndex = 19
End If


On peut même se passer de la variable avec :

.Points(d).Interior.ColorIndex = IIf(Application.WorksheetFunction .Index(.Values, d) < 44, 3, 19)

au lieu de

rep = Application.WorksheetFunction.Index(.Values, d)
If rep < 44 Then
.Points(d).Interior.ColorIndex = 3
Else
.Points(d).Interior.ColorIndex = 19
End If



Bonsoir
Pourriez vous me sortir une epine du pied?
Sur la macro suivante, qui change la couleur des barres horizontales
d'un graphique selon leur valeur, j'ai parfois un message d'erreur du
type:
erreur d'execution 13, incompatibilté de type.
Toujours sur la ligne If CDbl(rep) < 44 Then.
Et là, la macro coince...
Voici la macro dans sa totalité. D'ou peut bien venir ce bug?


Bonjour,

Indépendamment de la réponse de JB, tu peux simplifier ton code. In utile
de toucher aux étiquettes pour récupérer la valeur de chaque poin t.

Essaie ce qui suit :

Sub FormatConditionnelGraphiqueCMJ()
For c = 1 To ActiveChart.SeriesCollection.Count
For d = 1 To ActiveChart.SeriesCollection(c).Points.Count
With ActiveChart.SeriesCollection(c)
rep = Application.WorksheetFunction.Index(.Values, d)
If rep < 44 Then
.Points(d).Interior.ColorIndex = 3
Else
.Points(d).Interior.ColorIndex = 19
End If
End With
Next d
Next c
End Sub




--
Cordialement,

Michel Gaboly
www.gaboly.com


Avatar
Francois L
Bonjour François,

Si tu veux simplifier, tu peux aussi remplacer le If Then Else par IIf :

.Points(d).Interior.ColorIndex = IIf(rep < 44, 3, 19)

au lieu de

If rep < 44 Then
.Points(d).Interior.ColorIndex = 3
Else
.Points(d).Interior.ColorIndex = 19
End If


On peut même se passer de la variable avec :

.Points(d).Interior.ColorIndex =
IIf(Application.WorksheetFunction.Index(.Values, d) < 44, 3, 19)



Bonjour,

Oui mais, le IIf je connais pas bien, c'est trop fort pour moi.

Le but était surtout d'éviter de passer par les DataLabel.

--
François L

Avatar
Francois L
Bonjour François,

Si tu veux simplifier, tu peux aussi remplacer le If Then Else par IIf :

.Points(d).Interior.ColorIndex = IIf(rep < 44, 3, 19)




Re,

En fait, je viens d'aller voir IIf, c'est simple. Mis à par la concision
du code, quel avantage par rapport à un If Then Else (plus rapide ?).

--
François L

Avatar
Francois L
Merci à tous, la solution de François marche impec
Pierre






Re,

Merci pour le merci.

Regardes le code raccourci proposé par Michel. Pas mal.

--
François L

Avatar
Michel Gaboly
Re,

Pas si compliqué le IIf, il fonctionne comme la fonction SI() d'une feu ille de calcul ;-))

Bonjour François,

Si tu veux simplifier, tu peux aussi remplacer le If Then Else par IIf :

.Points(d).Interior.ColorIndex = IIf(rep < 44, 3, 19)

au lieu de

If rep < 44 Then
.Points(d).Interior.ColorIndex = 3
Else
.Points(d).Interior.ColorIndex = 19
End If


On peut même se passer de la variable avec :

.Points(d).Interior.ColorIndex =
IIf(Application.WorksheetFunction.Index(.Values, d) < 44, 3, 19)



Bonjour,

Oui mais, le IIf je connais pas bien, c'est trop fort pour moi.

Le but était surtout d'éviter de passer par les DataLabel.




--
Cordialement,

Michel Gaboly
www.gaboly.com


Avatar
Michel Gaboly
Je n'avais pas vu ce message avant de poster ma réponse précédente ;-((

Pas vraiment d'autre avantage que la concision, et le moindre effort au c lavier, mais cela n'est déjà pas mal. ;-))

Bonjour François,

Si tu veux simplifier, tu peux aussi remplacer le If Then Else par IIf :

.Points(d).Interior.ColorIndex = IIf(rep < 44, 3, 19)




Re,

En fait, je viens d'aller voir IIf, c'est simple. Mis à par la concis ion
du code, quel avantage par rapport à un If Then Else (plus rapide ?).




--
Cordialement,

Michel Gaboly
www.gaboly.com


Avatar
Paul V
hello Michel,

Je me permets de mettre mon grain de sel pour te contredire un peu quoique
je me doute que tu dois savoir ce qui suit;-)))))

Il est évident que dans la procédure dont vous parler, le gain de temps sera
minime.

Mais d'un point de vue théorique, il faut savoir que les instructions en VBA
s'effectuent une à une. Un appel au processeur.
Donc il vaut toujours meius pour optimiser un code qui en a besoin faires
des instructions complexe que multiplier les instructions.

Si l'appli est petite, il vaut mieux garder les multiples instructions pour
la lisibilité, par contre. Le gain de temps étant dérisoire.

Pour optimiser, il vaut mieux, par exemple, écrire (code exemple non testé
;-) ) :

if inputbox("TARATA") > 10 then msgbox"Toto" : exit sub

que

Rep = inputbox("Tarata"
if rep > 10 then
msgbox "toto"
exit sub
end if

Le gain de temps théorique est de l'ordre du 500% ce qui à l'échelle du
milliardième de seconde , ne représente rien mais multiplié, par exemple,
dans un boucle, se fait vite sentir.

A+

Paul V, jour J - 5






"Michel Gaboly" a écrit dans le message de news:

Je n'avais pas vu ce message avant de poster ma réponse précédente ;-((

Pas vraiment d'autre avantage que la concision, et le moindre effort au
clavier, mais cela n'est déjà pas mal. ;-))

Bonjour François,

Si tu veux simplifier, tu peux aussi remplacer le If Then Else par IIf :

.Points(d).Interior.ColorIndex = IIf(rep < 44, 3, 19)




Re,

En fait, je viens d'aller voir IIf, c'est simple. Mis à par la concision
du code, quel avantage par rapport à un If Then Else (plus rapide ?).




--
Cordialement,

Michel Gaboly
www.gaboly.com