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 :

Créer une fonction pour interpoler une série [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 126
    Par défaut Créer une fonction pour interpoler une série
    Bonjour,

    Je veux remplir des valeurs manquantes dans une colonne par interpolation: prendre l'écart entre la dernière valeur avant le "trou" et la première valeur après le "trou", et répartir la progression dans les cellules du "trou".
    Avec une formule, je fais cela comme ceci:
    =(D$17-D$11)/(1+5)+D11
    Et ce, pour chacune des cellules du "trou".

    Exemple:
    Interpoler(D$17, D$11, 5)

    Résultat:
    05/12/2017 1188,36 64,18
    06/12/2017 1252,54 13,41
    07/12/2017 1265,95 13,41
    08/12/2017 1279,36 13,41
    09/12/2017 1292,77 13,41
    10/12/2017 1306,18 13,41
    11/12/2017 1319,59 13,41
    12/12/2017 1333,00 17,68
    13/12/2017 1350,68 94,13

    Les cellules interpolées sont en italique
    La 3ème colonne ne sert qu'à verifier que le calcul est bon: l'accroissement est constant.
    (1+5) donne le nombre de cellules à remplir (auquel il faut ajouter 1).
    Notez que pour chacune des cellules du "trou", la dernière valeur avant le "trou" (cellule_de_depart) est toujours la même. Idem pour la première valeur après le "trou" (cellule_de_fin), d'où le $.

    Je voudrais faire une function avec des paramètres, plutôt que de copier la formule:
    Interpoler=(cellule_de_depart, cellule_de_fin, nombre_de_cellules).


    J'ai besoin d'aide pour faire cela avec une function en VBA, en particulier pour les références des cellules (cellule_de_depart et cellule_de_fin).

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, commence par lire et pratiquer : Les fonctions personnelles dans Excel

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 126
    Par défaut
    Citation Envoyé par kiki29 Voir le message
    Salut, commence par lire et pratiquer : Les fonctions personnelles dans Excel
    Réponse de prof ... (sans cynisme).
    Si je viens sur un forum, c'est parce que j'ai un besoin ponctuel et pas le temps ni l'utilité de me former à l'entièreté de la programmation VBA pour Excel.
    C'est l'efficacité qui prime.

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Un prof doit connaître les règles et les lire (et les comprendre un faisant les changements qui s'imposent.)

    Et puis un prof devrait savoir que pour interpoler, le plus simple c'est encore de connaître l'équation de la courbe.

    Et puis, ce n'est pas en exigeant que des bénévoles fassent ton travail à ta place et te fournissent gratuitement un code clef-en-main que tu vas te faire des amis ici.

    Et puis, tu vas faire quoi si tu te trouves un esclave pour faire ton travail à ta place et qu'il n'est pas capable de te fournir les valeurs interpolées que tu veux avoir ?

    Tu vas peut-être trouver des trucs par là, c'est un classique.

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

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    et pas le temps ni l'utilité de me former.
    tu as dans ce cas celui (le temps) de solliciter un prestataire de services, hein ...
    Ici : on bosse et on prend le temps de se former ou on choisit l'efficacité : rémunérer quelqu'un qui, lui, a pris le temps de se former et bosse.
    Ce n'est ici pas un magasin, mais un atelier.

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour Jacques

    Au cas où tu n'aurais pas vu celui-là.

    L'année commence mal.

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 126
    Par défaut
    Je suis surpris que ma discussion ait été comprise dans ce sens-là.
    Mon experience sur ce forum avait toujours été positive jusqu'ici.
    Aucun conseil donc, même pas pour comment passer des references absolues (ex. B$24) dans les paramètres d'une function VBA ?

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Citation Envoyé par kiki29 Voir le message
    Salut, commence par lire et pratiquer : Les fonctions personnelles dans Excel
    Réponse de prof ... (sans cynisme).
    Si je viens sur un forum, c'est parce que j'ai un besoin ponctuel et pas le temps ni l'utilité de me former à l'entièreté de la programmation VBA pour Excel.
    on peut en conclure que tu auras aussi la flemme de lire les réponses apportées et qu'il faut aller te faire la lecture ?

    Allez, on va être magnanime en ce début d'année.
    Comme tu n'as pas le temps d'apprendre vba, apprend les fonctions d'excel.
    Prevision() fait ce dont tu as besoin.
    eric

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Réponse de prof ... (sans cynisme).
    Si je viens sur un forum, c'est parce que j'ai un besoin ponctuel et pas le temps ni l'utilité de me former à l'entièreté de la programmation VBA pour Excel.
    C'est l'efficacité qui prime.
    dit un peu plus tard

    Je suis surpris que ma discussion ait été comprise dans ce sens-là.
    Mon experience sur ce forum avait toujours été positive jusqu'ici.
    Aucun conseil donc, même pas pour comment passer des references absolues (ex. B$24) dans les paramètres d'une function VBA

    moi non je suis pas surpris

    j'ajouterais que ceci: veut dire quoi?
    C'est l'efficacité qui prime.
    la tienne vis a vis de ton employeur ?
    ou
    celle de celui qui voudra bien t'aider?

    si tu parle de la tienne alors tu a pour habitude de récolter les lauriers a la place des autres peu etre meme pécunierement

    on dit il y a que le culot qui paye .....et bien aujourd'hui pour toi c'est vache maigre
    inscrit en 2007 en plus

    "code pret a l'emploi pour tous" bonjour que puis-je pour vous ?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 126
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Prevision() fait ce dont tu as besoin.
    eric
    Merci Eric.
    La function Prevision() calcule une valeur par regression linéaire (simple).

    C'est une bonne idée pour calculer des valeurs futures au depart d'une série.
    Mais ce n'est pas bien adapté dans le cas d'une interpolation, où il y a un "trou" dans la série.
    On peut bien sûr considerer que les valeurs du "trou" sont les valeurs futures, mais le résultat ne colle pas avec les valeurs quand la série reprend.

    La formule D$17-D$11)/(1+5)+D11 donne le bon résultat parce qu'elle tient compte de la dernière valeur avant le trou et aussi de celle juste après le trou.
    Le problème qui reste, c'est de passer dans les paramètres d'une function VBA les addresses (cellules en absolu) de ces deux valeurs, et obtenir en sortie le résultat de la formule.

    A toutes fins utiles pour ceux qui ont réagi, j'ai posté cette discussion en vue d'améliorer la solution d'un problème que j'ai déjà résolu, et c'est seulement pour moi perso ("lauriers, "péculiairement, etc. relevant d'un procès d'intention).

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

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    J' "adore" certains paradoxes, tels celui-ci :

    Si je viens sur un forum, c'est parce que j'ai un besoin ponctuel
    j'ai posté cette discussion en vue d'améliorer la solution d'un problème que j'ai déjà résolu
    Je vais mettre cela dans un coin libre (il en reste) de ma mémoire...

  12. #12
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    En passant, quand un étudiant dit à son prof qu'il n'a pas eu le temps d'étudier pour faire son devoir, mais qu'il l'a fait faire par quelqu'un d'autre, il se passe quoi ?

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 126
    Par défaut
    C'est amusant de voir que le principal intéressé a priori n'a pas réagi.
    Il a probablement d'autres choses plus intéressantes à faire (que de polémiquer) et dans ce cas il a bien raison.
    C'est un fait que de répondre à la discussion fait grimper le compteur des messages envoyés, même si on n'y apporte rien du tout.
    Mais est-ce aussi comme cela que l'on accumule tant de points ... ?
    C'est juste pour souffler un peu sur la braise :-)

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

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    C'est juste pour souffler un peu sur la braise
    Il se trouve, voxov, que "la braise" est sur ta chaise. Et qu'elle est bien pâle et plutôt anémique (si l'on excepte ses racontars dignes de bacs à sable). Tu as un besoin manifeste de "grandir", toi ... Ne tarde pas trop.

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    C'est une bonne idée pour calculer des valeurs futures au depart d'une série.
    Mais ce n'est pas bien adapté dans le cas d'une interpolation, où il y a un "trou" dans la série.
    On peut bien sûr considerer que les valeurs du "trou" sont les valeurs futures, mais le résultat ne colle pas avec les valeurs quand la série reprend.
    Ah ?
    Pourtant si ce n'est que les paramètres de prevision() n'accepte pas n'importe quelle écriture et oblige à ce que les 'extrémités du trou' soient consécutifs (du moins je n'ai pas trouvé), je ne vois pas bien la différence avec tes valeurs :
    Nom : 2018-01-11_13-42-32.png
Affichages : 1307
Taille : 21,0 Ko

  16. #16
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 126
    Par défaut
    Merci Eric.

    C'est exact. Moyennant ton astuce (recopier les extrémités du "trou" pour qu'elles soient consécutives), les valeurs données par la fonction Prevision() sont les bonnes.

    Avec la function suivante, pas besoin de recopier les extrémités:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Function Interpoler(x1, y1, x2, y2, ypreced As Range) As Double
     
       Interpoler = ((y2 - y1) / (x2 - x1)) + ypreced
     
    End Function
    avec les x... pour variable indépendante et les y... pour variable dépendante,
    et les ...1 pour les dernières valeurs avant le trou et les ...2 pour les premières valeurs après le trou,
    et x1, y1, x2, y2 en absolu,
    et ypreced pour la valeur précédente de la variable dépendante (la function cumule)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une fonction pour le max de jours d'un mois..
    Par kim mading dans le forum WinDev
    Réponses: 4
    Dernier message: 05/10/2012, 13h51
  2. [Free Pascal] Une fonction pour calculer la variance
    Par eldoir dans le forum Free Pascal
    Réponses: 0
    Dernier message: 10/11/2011, 20h39
  3. Créer une fonction pour remplacer des caractères
    Par virtuadrack dans le forum C++
    Réponses: 4
    Dernier message: 11/09/2008, 14h52
  4. Créer une fonction pour un update avec phppgadmin
    Par Peewee766 dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 19/06/2008, 11h56
  5. Existe-t-il une fonction pour calculer le kurtosis
    Par bichou dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/06/2007, 17h01

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