Calcul moyenne spéciale avec Sub et Function

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
isabelle
Le #22950811
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
Tatanka
Le #22950921
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"
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


Tatanka
Le #22950951
Si A1 est vide, vraiment vide, alors :

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

Numérique mais pas un nombre :-)

Serge
Tatanka
Le #22951011
Bonjour Isabelle,

Si plage discontinue : #VALEUR!

Serge

"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
michdenis
Le #22951041
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
michdenis
Le #22951031
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
isabelle
Le #22951111
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
michdenis
Le #22953011
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
Tatanka
Le #22954031
Merci Denis pour ce beau discours !
En tous cas :
IsExplicit("michdenis") renvoie VRAI :-)

Bon réveillon,
Hunkesnit


"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

Publicité
Poster une réponse
Anonyme