Moyenne semaine de valeurs quotidiennes

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

B

brigadero

Guest
Bonjour à tous,

Je souhaterais, en vba, calculer pour les 52-53 semaines de l'année la moyenne des valeurs qui sont données par jours.
J'ai une fonction qui est la suivante :

Function Moyenne(nomF As String, NombreValeur As Long) As Long

Dim i As Integer
Dim ajout As Long
Dim f As Worksheet
Set f = Sheets("feuil1").Range(nomF)

For i = 1 To NombreValeur
ajout = ajout + f.Cells(i, 1).Value
Next i

calculmoyenne = ajout / NombreValeur

End Function

et je voudrais faire :
sheets("Feuil1").range("D" & i) = Moyenne ("B" & i)

Mais cela ne marche pas.
Qqn pourrait-il m'aider?

Merci bien.

Ps: mon fichier en piece jointe
 

Pièces jointes

Re : Moyenne semaine de valeurs quotidiennes

Bonjour Brigadero 🙂,
Pas très clair ta question 😱...
Peut-être
Code:
Function Moyennee(nomF As String) As Double
Dim i As Integer
Dim ajout As Long
Dim f As Range
Set f = Sheets("feuil1").Range(nomF)
For i = 1 To f.Count
    ajout = ajout + f.Cells(i, 1).Value
Next i
Moyennee = ajout / f.Count
End Function
voir fichier joint.
Bon courage 😎
 

Pièces jointes

Re : Moyenne semaine de valeurs quotidiennes

merci beaucoup,

je pensais avoir été clair pourtant... 🙂
par contre ce que je trouve bizarre c'est que je ne sais pas comment "sem1" est reconnu, d'ailleurs lorsque je veut moyenne("sem2" , "sem3" )... cela ne marche pas!
une explication?
 
Re : Moyenne semaine de valeurs quotidiennes

Re,

Je rajoute un doc pour que vous puissiez mieux comprendre, il faut que vous rentrez dans le code vba pour que ce soit le cas.

et donc ce que je veux c'est avoir en colonne "D", les moyennes des consos en colonne B par semaine.

Jespere que ma piste vous sera utile.

Ps: les valeurs colonne "B" sont simples pour facilité la tache
 

Pièces jointes

Re : Moyenne semaine de valeurs quotidiennes

Bonjour à tous,

Sans fonction personnalisée et sans VBA. En D2 et vers le bas :
Code:
=SI(C2=C3;"";SOMMEPROD(($C$2:$C$366=C2)*$B$2:$B$366)/NB.SI($C$2:$C$366;"="&C2))
A+ à tous
 
Re : Moyenne semaine de valeurs quotidiennes

Re, salut JC 🙂,
je pensais avoir été clair pourtant... 🙂
par contre ce que je trouve bizarre c'est que je ne sais pas comment "sem1" est reconnu, d'ailleurs lorsque je veut moyenne("sem2" , "sem3" )... cela ne marche pas!
une explication?
Ben non, la preuve 😛...
Tu appelles dans ta fonction une String, je ne peux qu'en déduire que tu souhaites utiliser des plages nommées...
Donc j'ai nommé la plage Sem1, et évidement, il faut nommer la plage Sem2, etc. pour que la fonction renvoie le bon résultat 😀...
Si tu avais mis à l'appel de ta fonction un Range, j'en aurais déduit que tu souhaitais travailler depuis une sélection de cellule 😉.
Mais je suis d'accord avec JC, ça peut être bien plus simple en formule, pour compléter la sienne, je te propose une petite matricielle, à valider avec Ctrl+Maj+Enter en D2 à tirer vers le bas.
Code:
=MOYENNE(SI(($C$2:$C$366=$C2);($B$2:$B$366)))
Bonne journée 😎
 

Pièces jointes

Re : Moyenne semaine de valeurs quotidiennes

Bonjour à vous,

C'est très gentil mais cette méthode je le connais...sans parraitre désobligeant si je vous dis que j'en ai besoin en vba c'est que les autres solutions ne m'interesse pas...
Parcequ'en fait à terme je vais avoir besoin de créer un tableau "virtuel" en vba ac ma fonction moyenne personnalisée qui fera cela.
Pour l'instant je le fais sur un tableau "physique" pour voir le résultat.

Cependant j'ai un peu de mal à coder...avez vous donc une idée?
 
Re : Moyenne semaine de valeurs quotidiennes

Re 🙂,
C'est très gentil mais cette méthode je le connais...sans parraitre désobligeant si je vous dis que j'en ai besoin en vba c'est que les autres solutions ne m'interesse pas...
Parcequ'en fait à terme je vais avoir besoin de créer un tableau "virtuel" en vba ac ma fonction moyenne personnalisée qui fera cela.
Pour l'instant je le fais sur un tableau "physique" pour voir le résultat.
Cependant j'ai un peu de mal à coder...avez vous donc une idée?
Le problème est de savoir ce qu'on a en entrée :
Si c'est du physique, logiquement, c'est du Range. Dans VBA, ce sera quoi, une variable Tableau ?
Si je repars de ta fonction initiale, rien ne peux aller :
Code:
Function Moyenne(nomF [COLOR=red]As String[/COLOR], NombreValeur As Long) As Long
[COLOR=blue]La String correspond à quoi ?[/COLOR]
[COLOR=blue]Si tu envois un lot de valeurs, à quoi sert d'envoyer le nombre de valeur,[/COLOR]
[COLOR=blue]vu que celui-ci est compris dans la référence ?[/COLOR]
Dim i As Integer
Dim ajout As Long
Dim f As [COLOR=red]Worksheet[/COLOR]
[COLOR=blue]Tu déclares une feuille[/COLOR]
Set f = [COLOR=seagreen]Sheets("feuil1").[/COLOR][COLOR=red]Range(nomF)[/COLOR]
[COLOR=blue]Et tu lui envois des cellules... Si toutefois nomF y fait référence...[/COLOR]
[COLOR=blue]En plus, tu fait [COLOR=seagreen]référence à une feuille[/COLOR] alors que ta fonction doit être absolue ![/COLOR]
For i = 1 To NombreValeur
ajout = ajout + f.Cells(i, 1).Value
Next i
[COLOR=red]calculmoyenne[/COLOR] = ajout / NombreValeur
[COLOR=blue]Tu charges le résultat dans une variable calculmoyenne, alors que tu dois[/COLOR]
[COLOR=blue]utiliser le nom de ta fonction (Moyenne) pour renvoyer le résultat.[/COLOR]
[COLOR=#0000ff]Cerise sur le gâteau, tu n'as pas le droit d'appeler une fonction Moyenne, [/COLOR]
[COLOR=#0000ff]vu que c'est une fonction native d'Excel... [/COLOR]
[COLOR=#0000ff]Il faudrait l'appeller par exemple MaMoyenne...[/COLOR]
End Function
Donc ce n'est pas "un peu de mal à coder", mais "pas vraiment compris ce que c'est qu'une fonction".
De là à dire, les matricielles, je connais 😀... on peux être Formule sans être VBA et vice versa, mais savoir construire une matricielle et ne pas avoir un seul poil de logique dans la construction VBA, excuses moi d'être septique 🙄.
Donc commence par le commencement, et essaie de nous dire ce qui entre dans ta fonction, et on s'arrangera pour que le bon résultat en sorte 😛...
Bon appétit 😎
Ajout : J'ai oublié, ta fonction est censée renvoyer un Long (qui est un entier), alors que la moyenne étant le résultat d'une division, c'est un décimal qui va revenir...
 
Dernière édition:
Re : Moyenne semaine de valeurs quotidiennes

JCGL encore une fois ce n'est pas contre vous! merci d'ailleurs car ce n'est pas la premiere fois que vous m'aidez et je vous remercie pour votre interet.

c'est juste qu'a chaque fois que j'ai demandé une aide macro en vba tt le monde ma donne une solution de code dans les cases, ce avec quoi je ne peux rien faire car les calculs sont trop longs!
et là JNP j'ai essayé ton code maisje n'arrive pas a le faire fonctionner, je ne comprends pas ou est le pb...(cf piece jointe).

et pr info j'avais renommé ma fonction moyennee et non moyenne!

en espérant que vous pourrez m'éclairer,

+++
 

Pièces jointes

Re : Moyenne semaine de valeurs quotidiennes

Re 🙂,
Un essai par VBA 😛, par formules et par TCD
Excellent Jean-Claude, mais, où est la fonction 😀 ?
Bon week-end à tous 😎
Ajout : Ma fonction fonctionne avec des plages nommées (voir l'aide en cherchant Gestionnaire de nom). Je pourrais tout imaginer, mais je n'ai toujours pas la réponse à ma question : Que souhaites-tu en entrée ???
 
Dernière édition:
Re : Moyenne semaine de valeurs quotidiennes

Bonjour à tous,
Re Jean-Noël,

Et le 😛 à côté de VBA... A quoi il sert... Arf et Niark....
Il me semble que ta fonction, déposée sur une autre discussion mais pour le même sujet, réglait le problème. Il y avait aussi, je crois, une fonction de Roger...

A+ à tous
 
Re : Moyenne semaine de valeurs quotidiennes

Re 🙂,
Il me semble que ta fonction, déposée sur une autre discussion mais pour le même sujet, réglait le problème. Il y avait aussi, je crois, une fonction de Roger...
J'avoue que je ne me rappelle plus de tous les posts où j'ai répondu, mais pour celle-ci, c'était juste de l'improvisation en essayant d'interpréter la fonction de départ, qui, une fois souligné toutes les incohérences, tient plus de la chasse d'eau dans un orchestre de free jazz (voir HFT) que du vol du bourdon 😛...
Mais c'est vrai qu'une discussion sur des moyennes avec Roger me dit quelque chose, mais c'est assez lointain dans mon esprit 😉.
Par contre, ma matricielle était largement inspirée de maître Tibo, dont j'essaie de m'inspirer régulièrement pour progresser dans ce domaine qui m'est assez étranger 🙂.
Ceci étant dit, je ne sais toujours pas si c'est des choux ou des carottes que je dois mettre dans mon mixer pour faire ma soupe 😀...
Bonne nuit 😎
 
Re : Moyenne semaine de valeurs quotidiennes

Bonjour à tous
(...)
Il me semble que ta fonction, déposée sur une autre discussion mais pour le même sujet, réglait le problème. Il y avait aussi, je crois, une fonction de Roger...
(...)
J'ai effectivement fait une proposition Lien supprimé. Mais notre ami avait estimé que cette proposition était défectueuse :
(...) il y'a juste un petit pb, cela prend les moyennes du mardi au lundi, alors que je voudrais du lundi au dimanche... (...)
Comme il n'a pas jugé bon de répondre à ma demande d'exemples prouvant ses dires, j'ai abandonné la discussion...

Mais puisque je suis têtu, j'ajoute une proposition dans le classeur joint, sous forme d'une fonction personnalisée :
Code:
[COLOR="DarkSlateGray"][B]Function moy(nSem$, dateRef As Range, valRef As Range)
[COLOR="SeaGreen"]'
'Arguments :
'      nSem$ : référence à une semaine au format normalisé.
'      dateRef As Range : plage des dates.
'      valRef As Range : plage des consommations.
'
'Utilise la fonction semaine.
'[/COLOR]
Application.Volatile
Dim i&, j&, s#, oDate, oVal
   moy = ""
   If dateRef.Count = valRef.Count Then
      oDate = dateRef.Value
      oVal = valRef.Value
      For i = 1 To UBound(oDate, 1)
         If IsDate(oDate(i, 1)) And IsNumeric(oVal(i, 1)) And oVal(i, 1) <> "" Then
            If semaine(CDate(oDate(i, 1))) = nSem Then s = s + oVal(i, 1): j = j + 1
         End If
      Next i
      If j > 0 Then moy = s / j
   End If
End Function

Function semaine(d As Date) As String
Application.Volatile
Dim ns&
   d = Int(d)
   ns = DateSerial(Year(d + (8 - Weekday(d, vbSunday)) Mod 7 - 3), 1, 1)
   ns = ((d - ns - 3 + (Weekday(ns, vbSunday) + 1) Mod 7)) \ 7 + 1
   semaine = Year(d) - (ns > 50) * (Month(d) = 1) + (ns < 5) * (Month(d) = 12) & "-W" & Right$("0" & ns, 2)
End Function[/B][/COLOR]
ROGER2327
#3706


Jeudi 5 Gidouille 137 (Saint Ugolin, mansuet, SQ)
1er Messidor An CCXVIII
2010-W24-6T01:15:21Z
 

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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
5
Affichages
418
Réponses
9
Affichages
884
Réponses
3
Affichages
879
Retour