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

Calcul moyenne spéciale avec Sub et Function

9 réponses
Avatar
Tatanka
Bonjour,

La macro suivante calcule la moyenne des valeurs
d'une sélection quelconque de cellules en ignorant
les cellules vides et les cellules contenant une formule :

Sub Moy_Space()
For Each c In Selection
If c.HasFormula = False And c.Value <> "" Then
i = i + 1
s = s + c.Value
End If
Next c
MsgBox "Moyenne : " & s / i
End Sub

J'essaie maintenant de faire le même travail avec une fonction,
mais en vain. Qu'est qui cloche ( de Noël ) ?
J'ai essayé en utilisant ... Areas ... mais je tourne en O !

Function Moy(ici As Range) As Double
For Each c In ici
If c.HasFormula = False And c.Value <> "" Then
i = i + 1
s = s + c.Value
End If
Next c
Moy = s / i
End Function

Vous avez des suggestions ?
Joyeuses Fêtes à tous et à toutes.
Serge

9 réponses

Avatar
isabelle
salut serge,

pas de tintement de cloche par chez nous,
c'est quoi, un résultat faux ou un message d'erreur ?

isabelle

Le 2010-12-22 11:18, Tatanka a écrit :
Sub Moy_Space()
For Each c In Selection
If c.HasFormula = False And c.Value<> "" Then
i = i + 1
s = s + c.Value
End If
Next c
MsgBox "Moyenne : "& s / i
End Sub
Avatar
Tatanka
J'ai oublié le cas où des cellules de la sélection contiennent du texte.
Correction :

Sub Moy_Space()
For Each c In Selection
If c.HasFormula = False And Application.IsNumber(c.Value) Then
i = i + 1
s = s + c.Value
End If
Next c
If i = 0 Then
MsgBox "Ne s'applique pas."
Else
MsgBox "Moyenne : " & s / i
End If
End Sub

Mais toujours incapable d'en faire une fonction personnalisée !

Serge


"Tatanka" a écrit dans le message de news: iet8b9$p2v$
Bonjour,

La macro suivante calcule la moyenne des valeurs
d'une sélection quelconque de cellules en ignorant
les cellules vides et les cellules contenant une formule :

Sub Moy_Space()
For Each c In Selection
If c.HasFormula = False And c.Value <> "" Then
i = i + 1
s = s + c.Value
End If
Next c
MsgBox "Moyenne : " & s / i
End Sub

J'essaie maintenant de faire le même travail avec une fonction,
mais en vain. Qu'est qui cloche ( de Noël ) ?
J'ai essayé en utilisant ... Areas ... mais je tourne en O !

Function Moy(ici As Range) As Double
For Each c In ici
If c.HasFormula = False And c.Value <> "" Then
i = i + 1
s = s + c.Value
End If
Next c
Moy = s / i
End Function

Vous avez des suggestions ?
Joyeuses Fêtes à tous et à toutes.
Serge


Avatar
Tatanka
Si A1 est vide, vraiment vide, alors :

IsNumeric([A1]) renvoie VRAI
et
Application.IsNumber([A1]) renvoie FAUX

Numérique mais pas un nombre :-)

Serge
Avatar
Tatanka
Bonjour Isabelle,

Si plage discontinue : #VALEUR!

Serge

"isabelle" a écrit dans le message de news: iet9qu$sfl$
salut serge,

pas de tintement de cloche par chez nous,
c'est quoi, un résultat faux ou un message d'erreur ?

isabelle

Le 2010-12-22 11:18, Tatanka a écrit :
Sub Moy_Space()
For Each c In Selection
If c.HasFormula = False And c.Value<> "" Then
i = i + 1
s = s + c.Value
End If
Next c
MsgBox "Moyenne : "& s / i
End Sub
Avatar
michdenis
Bonjour,

C'est bien connu, il y a des différences entre les fonctions
écrites pour le VBA et cellules pour la feuille de calcul. C'est
quasiment inévitable puisque c'est des équipes de programmeurs
différents qui les ont pondus !

Selon le mathématicien, est-ce que ceci est numérique ?

Msgbox IsNumeric("($1,23$)")



MichD
--------------------------------------------
"Tatanka" a écrit dans le message de groupe de discussion : ietdbg$5am$

Si A1 est vide, vraiment vide, alors :

IsNumeric([A1]) renvoie VRAI
et
Application.IsNumber([A1]) renvoie FAUX

Numérique mais pas un nombre :-)

Serge
Avatar
michdenis
Bonjour Serge,

Et ceci ne fonctionne pas ?

Comme l'expression "Selection" fait référence à tout
objet sélectionné dans la feuille de calcul (pas seulement
des cellules), il est très souvent utilisé par l'enregistreur de macros
d'Excel, mais autrement, son utilisation n'est pas très judicieuse !

'----------------------------------
Sub Moy_Space()
Dim C As Range
If TypeName(Selection) = "Range" Then
For Each c In Selection.SpecialCells(xlCellTypeConstants, 1)
i = i + 1
s = s + c
Next c
MsgBox "Moyenne : " & s / i
End If
End Sub
'----------------------------------


MichD
--------------------------------------------
"Tatanka" a écrit dans le message de groupe de discussion : iet8b9$p2v$

Bonjour,

La macro suivante calcule la moyenne des valeurs
d'une sélection quelconque de cellules en ignorant
les cellules vides et les cellules contenant une formule :

Sub Moy_Space()
For Each c In Selection
If c.HasFormula = False And c.Value <> "" Then
i = i + 1
s = s + c.Value
End If
Next c
MsgBox "Moyenne : " & s / i
End Sub

J'essaie maintenant de faire le même travail avec une fonction,
mais en vain. Qu'est qui cloche ( de Noël ) ?
J'ai essayé en utilisant ... Areas ... mais je tourne en O !

Function Moy(ici As Range) As Double
For Each c In ici
If c.HasFormula = False And c.Value <> "" Then
i = i + 1
s = s + c.Value
End If
Next c
Moy = s / i
End Function

Vous avez des suggestions ?
Joyeuses Fêtes à tous et à toutes.
Serge
Avatar
isabelle
pour les plages discontinues ou non ça va bien avec ParamArray,

Function Moy(ByVal FirstRange As Range, ParamArray OtherRanges()) As Double
For Each c In FirstRange
If c.HasFormula = False And Application.IsNumber(c.Value) Then
i = i + 1
s = s + c.Value
End If
Next c

For y = LBound(OtherRanges) To UBound(OtherRanges)
For Each c In OtherRanges(y)
If c.HasFormula = False And Application.IsNumber(c.Value) Then
i = i + 1
s = s + c.Value
End If
Next c
Next y

If i = 0 Then
Moy = 0
Else
Moy = s / i
End If
End Function

passe de bonne fête,
bisou*
isabelle



Le 2010-12-22 12:21, Tatanka a écrit :
Sub Moy_Space()
For Each c In Selection
If c.HasFormula = False And Application.IsNumber(c.Value) Then
i = i + 1
s = s + c.Value
End If
Next c
If i = 0 Then
MsgBox "Ne s'applique pas."
Else
MsgBox "Moyenne : "& s / i
End If
End Sub
Avatar
michdenis
Pour ceux qui désirent un peu d'explication pourquoi
Msgbox IsNumeric("($1,23$)") retourne Vrai...

Les "programmeurs" ont considéré que la fonction devait
tenir compte des parenthèses (les nombres négatifs dans
certains formats de cellules) et du symbole monétaire qu'il
soit placé au début ou à la fin de la séquence du nombre
indiqué pour tenir compte des divers formats possibles.

Par exemple, une cellule pourrait contenir la valeur ($1.25)
les parenthèses (valeur négative) et le signe $ étant un format
de cellule.

En VBA, la propriété "Text" d'un "Range" retourne ceci : ($1.25)
x = Range("A1").Text
x = "($1.25)"

Et la fonction Msgbox isnumeric(x) retournerait Vrai
on pourrait aussi écrire directement Msgbox isNumeric(Range("A1").text)

Par exemple contenant en dur ($1,25) s'affiche à gauche dans la cellule
mais Msgbox isNumeric(Range("A1").Value) retourne Vrai
Mais x = Application.IsNumber([A1]) retourne Faux
Et pour cause, l'interface de calcul considère cette valeur comme du Texte
(affichage à gauche) pourquoi, la fonction "IsNumber" devrait en faire autrement ?

Selon les paramètres régionaux, il y a bien sûr des nuances...
Si je tape en dur dans une cellule (1,25$) , Excel applique le
format monétaire à la cellule. Résultat, le contenu de la cellule
est 1,25 et les parenthèses et le signe monétaire font désormais
partie du format de cellule.

Voilà! selon ce que l'on veut faire et selon son application, la
fonction IsNumeric() peut-être désarmante...Il faut être attentif!

C'était mes deux cents sur le sujet !

MichD
--------------------------------------------
"michdenis" a écrit dans le message de groupe de discussion : ietfeh$b73$

Bonjour,

C'est bien connu, il y a des différences entre les fonctions
écrites pour le VBA et cellules pour la feuille de calcul. C'est
quasiment inévitable puisque c'est des équipes de programmeurs
différents qui les ont pondus !

Selon le mathématicien, est-ce que ceci est numérique ?

Msgbox IsNumeric("($1,23$)")



MichD
--------------------------------------------
"Tatanka" a écrit dans le message de groupe de discussion : ietdbg$5am$

Si A1 est vide, vraiment vide, alors :

IsNumeric([A1]) renvoie VRAI
et
Application.IsNumber([A1]) renvoie FAUX

Numérique mais pas un nombre :-)

Serge
Avatar
Tatanka
Merci Denis pour ce beau discours !
En tous cas :
IsExplicit("michdenis") renvoie VRAI :-)

Bon réveillon,
Hunkesnit


"michdenis" a écrit dans le message de news: ievlo8$2co$
Pour ceux qui désirent un peu d'explication pourquoi
Msgbox IsNumeric("($1,23$)") retourne Vrai...

Les "programmeurs" ont considéré que la fonction devait
tenir compte des parenthèses (les nombres négatifs dans
certains formats de cellules) et du symbole monétaire qu'il
soit placé au début ou à la fin de la séquence du nombre
indiqué pour tenir compte des divers formats possibles.

Par exemple, une cellule pourrait contenir la valeur ($1.25)
les parenthèses (valeur négative) et le signe $ étant un format
de cellule.

En VBA, la propriété "Text" d'un "Range" retourne ceci : ($1.25)
x = Range("A1").Text
x = "($1.25)"

Et la fonction Msgbox isnumeric(x) retournerait Vrai
on pourrait aussi écrire directement Msgbox isNumeric(Range("A1").text)

Par exemple contenant en dur ($1,25) s'affiche à gauche dans la cellule
mais Msgbox isNumeric(Range("A1").Value) retourne Vrai
Mais x = Application.IsNumber([A1]) retourne Faux
Et pour cause, l'interface de calcul considère cette valeur comme du Texte
(affichage à gauche) pourquoi, la fonction "IsNumber" devrait en faire autrement ?

Selon les paramètres régionaux, il y a bien sûr des nuances...
Si je tape en dur dans une cellule (1,25$) , Excel applique le
format monétaire à la cellule. Résultat, le contenu de la cellule
est 1,25 et les parenthèses et le signe monétaire font désormais
partie du format de cellule.

Voilà! selon ce que l'on veut faire et selon son application, la
fonction IsNumeric() peut-être désarmante...Il faut être attentif!

C'était mes deux cents sur le sujet !

MichD
--------------------------------------------
"michdenis" a écrit dans le message de groupe de discussion : ietfeh$b73$

Bonjour,

C'est bien connu, il y a des différences entre les fonctions
écrites pour le VBA et cellules pour la feuille de calcul. C'est
quasiment inévitable puisque c'est des équipes de programmeurs
différents qui les ont pondus !

Selon le mathématicien, est-ce que ceci est numérique ?

Msgbox IsNumeric("($1,23$)")



MichD
--------------------------------------------
"Tatanka" a écrit dans le message de groupe de discussion : ietdbg$5am$

Si A1 est vide, vraiment vide, alors :

IsNumeric([A1]) renvoie VRAI
et
Application.IsNumber([A1]) renvoie FAUX

Numérique mais pas un nombre :-)

Serge