Aide pour code dans Excel (simple)
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Aide pour code dans Excel (simple)



  1. #1
    invite7c3c9aaf

    Question Aide pour code dans Excel (simple)


    ------

    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

    -----

  2. #2
    Dlzlogic

    Re : Aide pour code dans Excel (simple)

    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++)

  3. #3
    invite7c3c9aaf

    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.

  4. #4
    Dlzlogic

    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.

  5. A voir en vidéo sur Futura
  6. #5
    invite7c3c9aaf

    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"

  7. #6
    invite8666d089

    Re : Aide pour code dans Excel (simple)

    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.

  8. #7
    invite8666d089

    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

  9. #8
    invite7c3c9aaf

    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 ^^]

  10. #9
    invite7c3c9aaf

    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 ?

  11. #10
    invite8666d089

    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.

  12. #11
    invite8666d089

    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...

  13. #12
    invite7c3c9aaf

    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 ?)

  14. #13
    invite8666d089

    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 !

Discussions similaires

  1. aide pour excel 2007
    Par invite994dba8c dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 19/10/2010, 16h52
  2. Aide pour circuit simple
    Par p2rib dans le forum Électronique
    Réponses: 6
    Dernier message: 26/05/2010, 20h30
  3. Aide collage séparé dans excel
    Par invite962bb108 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 11/01/2010, 16h23
  4. Aide pour compréhension des formules sur un fichier excel
    Par invite9d979fbf dans le forum Physique
    Réponses: 0
    Dernier message: 04/09/2009, 10h43
  5. Aide pour montage electrique simple
    Par invite6d77155f dans le forum Électronique
    Réponses: 2
    Dernier message: 27/03/2007, 19h08