IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Insertion formule dans variable d'une fonction


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut Insertion formule dans variable d'une fonction
    Bonsoir tout le monde,

    Je sollicite votre aide car je peine à trouver une solution à mon problème. J'ai dans mes calculs besoin de faire des sommes répétitives. Pour donner un exemple au hasard, disons somme(2*i²) pour i variant de 1 à 50.
    Pour le moment je me contente de faire des boucles for avant mon calcul dont j'implémente le résultat. Seulement je trouve que ce n'est pas une solution à long terme car cela me fait du code très gros avec pleins de variables à créer pour les boucles.

    1) Je me demande donc si il y aurait une fonction somme dans VBA ? Bien évidement appropriée au calcul mathématiques et non pour sommer des cellules.
    2) N'ayant pas trouvé de réponse à ma question 1 ci-dessus, j'ai commencé à coder un morceau mais je bloque sur le passage de l'expression mathématiques en guise de variable fonctionnelle. Ci-joint mon début de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Function somme(expression As Double, min as Integer, max as Integer)
     
    Dim total As Double
     
    total = 0
    For i = min To max
     
        total = total + expression
     
    Next
     
    somme = total
     
    End Function
     
    Sub test()
    Dim i As Integer
     
    MsgBox somme(2 * i^2, 1, 50)
     
    End Sub
    Je sollicite donc votre aide en gros pour savoir si la fonction Sum de VBA permet de faire ce que je souhaite et au cas échéant si quelqu’un pourrait bien m'aider à compléter mon bout de code. Je pense à une piste mais je n'arrive pas à la mettre en pratique : pourquoi ne pas passer l'expression en string puis la convertir en autre chose dans la fonction ? Mais pas sûr...


    En tout cas merci par avance pour votre aide future.

    Cdlt,
    Gordon.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2015
    Messages : 118
    Par défaut
    Salut,

    J'ai déjà au à réfléchir sur ce type d'application et voici ce que j'avais mis en oeuvre :

    Le programme écrit les données d'entrées de "Expression" dans 2 (ou+) cellules du classeur.
    Une cellule du classeur contient le calcul à réaliser (Formula).
    Récupération du résultat par le programme

    Exemple :

    somme(2*i²) pour i variant de 1 à 50.

    Le programme (boucle) écrit 1 en A1.
    Sur la feuille, une formule en A2 dit : = 2*A1*A1
    Le programme récupère le résultat en A2 puis somme...

    A+

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    difficile d'avoir un avis tranché et une proposition adéquate, puisqu'on ne connait pas toutes les formules répétitives que tu vas vouloir simplifier
    dans ce genre d'objectif, et pour éviter les usines à gaz impossibles à maintenir ou faire évoluer, il faut dans un premier temps :

    - lister les combinaisons de formules possibles. J'entend par combinaisons les "motifs" récurrents qui apparaissent dans tes formules
    - transformer les progressions en leur correspondance globale, c'est à dire casser la boucle de progression (tes boucle For/Next) en utilisant la formule qui agrège tout en une fois

    c'est à dire que tu dois impérativement travailler la partie purement mathématique avant d'attaquer la programme

    si on prend ton exemple : calculer "2 * i^2" pour i allant de 1 à 4

    on constate qu'on va devoir se farcir : (2 * 1^2) + (2 * 2^2) + (2 * 3^2) + (2 * 4^2)

    on va déjà extraire le multiplicateur et on obtient : 2* (1^2 + 2^2 + 3^2 + 4^2)

    on arrive donc à une banale multiplication entre une constante (2) et une somme de carrés consécutifs en partant de 1

    Ca tombe bien, il y a une formule pour ça : 1² + 2² + 3² + .... + n² = (1/3 * n^3) + (1/2 * n²) + (1/6*n)

    Ce pattern de formule est donc agrégable, comme tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function sommeCarreConsecutifs(max)
        sommeCarreConsecutifs = 2 * (((1 / 3) * max ^ 3) + ((1 / 2) * max ^ 2) + ((1 / 6) * max))
    End Function
     
    Sub test()
    Dim i As Double
        MsgBox sommeCarreConsecutifs(4)
    End Sub

    Comme tu commences à le deviner, ton souhait demande beaucoup d'études préalables

  4. #4
    Membre confirmé
    Profil pro
    Administration et finances
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administration et finances
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut
    Bonsoir,
    Il me semble que cela peut se résoudre ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub CalculeDoubleCarré()
        MsgBox SommeDoubleCarré(1, 50)
    End Sub
     
    Private Function SommeDoubleCarré(iMin As Integer, iMax As Integer) As Double
        Dim dTotal As Double
        Dim i As Integer
        For i = iMin To iMax
            dTotal = dTotal + DoubleCarré(i)
        Next
        SommeDoubleCarré = dTotal
    End Function
     
    Private Function DoubleCarré(i As Integer) As Double
        DoubleCarré = CDbl(2 * i ^ 2)
    End Function

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Bonsoir à vous et merci pour vos réponses.

    Alors justement je veux créer une vraie fonction somme qui soit capable de me faire les sommes de toute fonction de i. La partie mathématiques n'est pas un soucis, je donnais l'exemple de 2*i^2 comme ça pour que l'on parle de la même somme...

    Coder une fonction somme pour une formule de i connue ça je sais faire, mais coder une fonction somme capable de sommer n'importe quelle fonction de i pour n'importe quel intervalle de i là je sèche...

    Après si vous voulez je vous mets un screen de ce que je cherche à sommer exactement mais c'est plutôt chaud à digérer.

    Merci de votre aide en tout cas.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Je vais personnellement me contenter de répondre ainsi : ce n'est pas la variable expression, qu'il convient de passer en paramètre de la fonction, mais son résultat.

    J'ajoute à l'intention du seul demander que la variable tremplin total est inutile. Il suffit de travailler directement avec la variable somme, puisque la fonction somme est un numérique. Je déplore à ce propos que cette fonction n'ait pas été typée !

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Citation Envoyé par unparia Voir le message
    ce n'est pas la variable expression, qu'il convient de passer en paramètre de la fonction, mais son résultat.
    Bonsoir Unparia et merci de votre intérêt. Par contre désolé mais je ne vois pas bien où vous voulez en venir. Comment la fonction peut-elle sommer une expression si on ne lui indique pas au minimum f(i) et [iMin;iMax]?

  8. #8
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Si le but n'était pas de modifier la structure des formules et/ou éviter les boucles, et qu'en plus il ne s'agit que de sommer progressivement une même expression composé d'une (ou deux) parties "dures" et une partie "variable".

    voici un exemple appliqué lui-même sur ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function Somme(Expression As String, Debut As Long, Fin As Long) As Double
    Dim ExpressionEnCours As String
        For i = Debut To Fin
            ExpressionEnCours = Replace(Expression, "#i", i)
            Somme = Somme + Evaluate(ExpressionEnCours)
        Next i
    End Function
     
    Sub test()
    Dim MaFormule As String
        MaFormule = "(4/2^#i) - Sin(45)"
    Debug.Print Somme("2 * " & MaFormule & " ^ 2", 1, 10)
    End Sub
    On peut éviter bien sûr la variable MaFormule

    prise en compte d'une seule partie "ajustable" tant dans l'appel (donc les paramètres de la fonction ... Variant et éventuellement Paramarray) que dans le traitement qui obligera à un peu plus de rigueur et de structure dans la méthode d'identification de la position pour faire le remplacement. Sans oublier les éventuelles boucles multiples (et potentiellement des croisements récursifs possibles)


    Bien sûr, car nous n'avons toujours pas un aperçu assez large du nombre et du type d'expressions que tu veux "passer", ainsi que de l'aspect général des formules (c'est à dire l'expression "globale" que tu vas envoyer à ta formule)

Discussions similaires

  1. Récupérer la variable d'une fonction JavaScript dans PHP
    Par Nix6800 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/11/2009, 15h13
  2. récupérer une variable d'une fonction dans une classe
    Par free_dom dans le forum Général Python
    Réponses: 20
    Dernier message: 08/07/2009, 12h35
  3. Réponses: 10
    Dernier message: 12/11/2008, 17h57
  4. [MySQL] Récupérer une variable d'une fonction et enregistrement dans une base de données
    Par Mikke dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/03/2008, 17h02
  5. Réponses: 4
    Dernier message: 09/08/2006, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo