Bonjour à tous,
Voia 4 heures que j'essaie de me mettre à la programmation pour la création d'une fonction dans Excel.
J'ai lu quelques cours sur internet, des exemples... Puis je me suis lancée.
Je n'en avait jamais fait avant, mais j'ai des bases en C++ (et en Assembleur, m'enfin bon, là...).
Je veux créer une fonction qui me donne la moyenne des valeurs des 5 premiers plateaux présents sur un graphe de fonction, dont les valeurs des Y sont dans la colone B.
Je considère le plateau atteint si la valeur est supérieure à "la la valeur théorique du plateau - 2".
Voila le code :
Public Function plateauhaut(consignehaute As Integer, nbPlateaux As Integer) As Currency
Dim X As Range
Dim somme As Currency
Dim nbVal As Long
Dim nbP As Currency
Dim moyenne As Currency
nbVal = 0
somme = 0
nbP = 0
moyenne = 0
For Each X In ActiveSheet.Range("b2:b4002") If X.Value > consignehaute - 2 Then
some = some + X.Value
nbVal = nbVal + 1
Else
If nbVal <> 0 Then
moyenne = moyenne + somme / nbVal
nbVal = 0
nbP = nbP + 1
End If
End If If nbP = nbPlateaux Then
MsgBox "sortie car nbPlateaux atteint"
Exit For
End If Next X
plateauhaut = moyenne / nbP
End End Function
Voici l'affichage que j'obtient lorsque je tape =plateauhaut(60,5) dans une case du classeur : d'abord la boite message "sortie car nbPlateaux atteint" puis la case donne #VALEUR
Etant donné que je suis tout a fait nouvelle au truc, il est probable que l'erreur soit vraiment bête. Seulement je cherche toute seule depuis un moment, et je n'ai aucun prof sous la main (je suis en stage), donc si une âme charitable voulait bien m'aider
Je me dit aussi que le code pourrait certainement être amélioré, mais pour l'instant je veux vraiment comprendre le problème.
Voila, j'espère que quelqu'un aura la patience ! ^^
Merci
Bonjour,
Ce que j'ai pu voir est que some est déclaré et initialisé avec un seul 'm' (et pas utilisé) et somme est calculé et utilisé avec 2 'm'. Pardon, c'est le contraire, mais vous avez compris : "some" n'est pas déclaré (vive le C/C++)
26/09/2011 - 15h56
Calia_Eowyn
Date d'inscription
mars 2008
Localisation
Banlieue Parisienne
Âge
22
Messages
69
Re : Aide pour code dans Excel (simple)
Bonjour
Ouis, j'ai effectivement fait une faute de frappe double à somme (et j'ai franchement honte d'etre passé à coté lors de ma recherche de l'erreur ^^).
Cependant, même en le corrigeant, l'erreur reste.
Calia~°
26/09/2011 - 17h37
Dlzlogic
Date d'inscription
juillet 2011
Messages
1 112
Re : Aide pour code dans Excel (simple)
Je ne connais pas la structure (classe) Currency, c'est à dire que je ne comprend pas vraiment votre code.
Si j'étais vous, je limiterais la boucle à une vingtaine ou une trentaine de valeurs et j'afficherais la somme et/ou la moyenne à chaque passage.
A quoi sert le 'end' à l'avant dernière ligne ?
Dernière modification par Dlzlogic ; 26/09/2011 à 17h40.
27/09/2011 - 08h56
Calia_Eowyn
Date d'inscription
mars 2008
Localisation
Banlieue Parisienne
Âge
22
Messages
69
Re : Aide pour code dans Excel (simple)
Les currency sont dit plus precis, mais pour utiliser des classes plus classiques j'ai remplacé currency par double.
J'ai par ailleurs corrigé le code (le end était une erreur de copier-coller). Voila le nouveau code :
Code:
Public Function plateauhaut(consignehaute As Double, nbPlateaux As Integer) As Double
Dim X As Range
Dim somme As Double
Dim nbVal As Double
Dim nbP As Double
Dim moyenne As Double
nbVal = 0
somme = 0
nbP = 0
moyenne = 0
For Each X In ActiveSheet.Range("b2:b4002")
If X.Value > (consignehaute - 2) Then
somme = somme + X.Value
nbVal = nbVal + 1
Else
If nbVal <> 0 Then
moyenne = moyenne + somme / nbVal
nbVal = 0
nbP = nbP + 1
End If
End If
If nbP = nbPlateaux Then
MsgBox "sortie prématurée"
Exit For
End If
Next X
plateauhaut = moyenne / nbP
End Function
J'ai appliqué cela à un petit nombre de valeurs, cela semble marcher. Je suis étonnée car je ne vois pas ou le currency pouvait poser problème, mais j'ai finalement tout mis en double (même la valeur théorique d eplateau) pour éviter les problèmes de classes (je ne sais pas encore trop comment sont faites les conversions, donc prudence).
Merci pour votre aide Bonne journée à vous deux
Dernière modification par yoda1234 ; 27/09/2011 à 09h01.
Motif: Mise en place balise "Code"
Je n'ai pas eu le temps de me pencher sérieusement sur ton pb, mais pense que les paramètres passés à ta fonction doivent être séparés par un point-virgule et non pas par une virgule.
Donc à la place de
lorsque je tape =plateauhaut(60,5)
essaye
=plateauhaut(60;5)
Le reste corrigé m'a paru correct. Cela dit, tu utilises dans ta fonction une plage de cellules. Et ça je crois qu'Excel n'aime pas du tout dans les fonctions personnalisées (pb de #REF!). Je vérifierai.
28/09/2011 - 09h34
Dormeur74
Date d'inscription
mars 2011
Localisation
Annecy
Âge
64
Messages
658
Re : Aide pour code dans Excel (simple)
Il faut que tu apprennes à mettre des points d'arrêts dans ton code, pour pouvoir vérifier grâce à Alt+F8 le contenu de tes variables. Tu te serais alors rendu compte que tu ne passes jamais dans la boucle if nbVal<>0, donc que ta variable nbP ne s'incrémente jamais et que tout cela se termine par un très joli 0/0 ce qui est un smiley autorisé sur la toile, mais interdit en maths.
Donc ton algo est faux. Si tu veux t'assurer de la chose, mets un point d'arrêt sur la ligne moyenne = moyenne + somme / nbVal (au passage, je me demande si ce ne serait pas plutôt moyenne = somme / nbVal, mais comme je ne sais pas ce que tu veux faire ???).
...et tu remplaces la dernière ligne par plateauhaut = 4.
Tu verras que ta fonction ne donnera plus un #VALUE! et que le point d'arrêt n'arrête rien.
Je profite de l'occasion pour te signaler que elseif existe en VBA.
Un dernier conseil : commence toujours tes développements en mettant une gestion d'erreur, ça te facilitera la vie. N'oublie pas le Exit Function avant l'étiquette de gestion (GESTERREUR: ), car c'est assez fréquent.
Code:
Option Explicit
Public Function plateauhaut(consignehaute As Double, nbPlateaux As Integer) As Double
Dim X As Range
Dim somme As Double
Dim nbVal As Double
Dim nbP As Double
Dim moyenne As Double
On Error GoTo GESTERREUR
nbVal = 0
somme = 0
nbP = 0
moyenne = 0
For Each X In ActiveSheet.Range("b2:b4002")
If X.Value > (consignehaute - 2) Then
somme = somme + X.Value
nbVal = nbVal + 1
Else
If nbVal <> 0 Then
moyenne = moyenne + somme / nbVal
nbVal = 0
nbP = nbP + 1
End If
End If
If nbP = nbPlateaux Then
MsgBox "sortie prématurée"
Exit For
End If
Next X
plateauhaut = moyenne / nbP
Exit Function
GESTERREUR:
MsgBox "Erreur : " & Err.Number & " : " & Err.Description
End Function
28/09/2011 - 10h40
Calia_Eowyn
Date d'inscription
mars 2008
Localisation
Banlieue Parisienne
Âge
22
Messages
69
Re : Aide pour code dans Excel (simple)
Bonjour,
Dormeur74 :
Alors tout d'abord, j'ai mis une virgule par habitude, mais sous Excel j'ai bien mis le ; (cependant, typiquement le genre d'erreur que je pourrai faire un jour ^^ J'ai donc associé une macro pour taper toutes les formules dans les bonnes cases à ma place).
J'ai mis des points d'arrêt et je les ai utilisés. Mais mon algo me semble juste puisque je passe bien par le Else if nbVal <> 0. Mon but était de n'y passer qu'une fois, à la première valeur après la fin du plateau de valeurs, pour ainsi comptabiliser les plateaux.
moyenne = moyenne + somme/nbVal n'est pas une réelle moyenne, tu as raison, mais c'est pour ça qu'après le For Each je redivise par le nombre de plateaux. [Ma démarche est : faire la moyenne par plateau, les sommer, faire la moyenne des moyennes de chaque plateau.]
Merci beaucoup pour GESTERREUR ! Je note aussi le coup du Elseif, que je vais beaucoup utiliser ^^.
J'ai repris le code, et j'ai fait 4 fonctions : moyenne et écart-type pour plateaux haut; moyenne et ecart-type pour plateaux bas. Elles marchent correctement à présent, plus de #Value Merci
Je me posais une autre question : pourquoi lors de la ré-ouverture de mon .xlsm certains calculs se refont correctement, et d'autre pas ? Est-ce là les erreurs d'Excel que tu m'as dit courantes ?
[ Et puis je trouve que même en smiley, le 0/0 n'est pas très joli ^^]
Calia~°
28/09/2011 - 10h54
Calia_Eowyn
Date d'inscription
mars 2008
Localisation
Banlieue Parisienne
Âge
22
Messages
69
Re : Aide pour code dans Excel (simple)
J'ai un petit souci avec GESTERREUR : lorsque je place tel que vous me l'avez décrit, Excel m'indique en erreur que l'étiquette n'est pas définie... Il y a une démarche particulière pour les étiquette ?
Calia~°
28/09/2011 - 11h09
Dormeur74
Date d'inscription
mars 2011
Localisation
Annecy
Âge
64
Messages
658
Re : Aide pour code dans Excel (simple)
Je me posais une autre question : pourquoi lors de la ré-ouverture de mon .xlsm
Là, je suis désolé, mais cette extension xlms, je la maîtrise très mal, JPL m'ayant apporté un paquet de lumière qui ne passait pas dans mes lunettes de vieux soudeur. Comme je l'ai écrit sur un autre fil, j'ai arrêté d'enrichir le Bill avec la version 2003. Ai repris un peu de service avec 2010 pour dépanner les fans du gratosware, mais les limitations de la version light font que je n'ai pas envie de m'investir sérieusement dans un truc bridé. Qui est devenu, il faut le reconnaître, un langage orienté objet, contrairement à VB 6.0 qui prétendait l'être.
Est-ce là les erreurs d'Excel que tu m'as dit courantes
.
Non. Les problèmes de VBA (version 2003 puisque...) viennent de la façon arithmétique d'effectuer les calcul. PB dans les calculs qui imposent pratiquement de procéder à une conversion étrange : une variable du type Long en Long grâce à la fonction CLng().
Et surtout par de grosses difficultés (difficiles à identifier car les propriétés Err. sont discutables au niveau de la traduction : la division par zéro que j'ai rencontrée dans ton code se traduisant pas un "dépassement de capacité" que tu comprendras puisque tu fais de l'assembleur).
VBA, contrairement à VB 6.0, pose de sérieux pb dans la gestion des plages du tableur. Passons, ton pb n'est pas là. J'ai utilisé dans la colonne B des valeurs allant de 1 à 4002 et ne suis jamais passé dans la boucle en question.
28/09/2011 - 12h59
Dormeur74
Date d'inscription
mars 2011
Localisation
Annecy
Âge
64
Messages
658
Re : Aide pour code dans Excel (simple)
Il n'y a pas de démarche particulière dans les étiquettes, sauf qu'il ne faut pas d'espace entre le nom de l'étiquette et les deux points.
Bizarre...bizarre...
28/09/2011 - 13h23
Calia_Eowyn
Date d'inscription
mars 2008
Localisation
Banlieue Parisienne
Âge
22
Messages
69
Re : Aide pour code dans Excel (simple)
C'est bon, j'ai saisi ! Une erreur très bête. GESTERREUR fonctionne à présent.
Pour ce qui est du passage par la boucle, les valeurs dans ta colonne B sont peut-être selon une progression monotone ? (uniquement croissant/décroissant) Auquel cas pas de plateau considéré comme achevé, donc pas de passage par la boucle, qui incrémente nbP.
[J'ai même mis un MsgBox dans cette boucle pour vérifier le passage, en plus d'avoir vu qu'il y avait bien un passage par la méthode des points d'arrêt.]
Merci pour les précisions sur le souci du VBA, je comprend mieux. (Êtes vous professeur ?)
Calia~°
28/09/2011 - 14h10
Dormeur74
Date d'inscription
mars 2011
Localisation
Annecy
Âge
64
Messages
658
Re : Aide pour code dans Excel (simple)
Êtes vous professeur ?
Je suis loin d'avoir la classe d'un professeur.
Non, tout simplement un vieux retraité qui a démarré l'informatique sur le tas avec un bon vieux Commodore 64, en 19?? ! Passons !