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 :

Résultat d'une fonction dans une cellule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Février 2017
    Messages : 14
    Par défaut Résultat d'une fonction dans une cellule
    Bonjour,

    Je m'excuse d'avance si mon post n'est pas au bon endroit, je ne savais pas trop où le mettre.

    Mon problème est sûrement très simple, mais j'avoue que je bloque dessus depuis vendredi après-midi.

    J'ai une fonction en vba qui me permets de calculer un prix de vente, ainsi que le total des achats puis à partir de la le taux de marge brute.

    Le soucis étant que je n'arrive pas afficher le résultat de ces trois fonctions dans une cellule bien spécifique (pour le coup H2 pour le prix de vente, I2 pour le total et J2 pour le taux de marge.) J'arrive bien à appeler la fonction depuis ma sub ça ce n'est pas un soucis, mais afficher le résultat, impossible.

    J'ai beau cherché sur internet et tout les forums possible, rien. Ou alors, ça ne correspond pas à ce que je veux, puisque bien souvent c'est dans un msgbox.

    Une solution, ou une piste à me proposer ?

    Merci,
    Junfiizz.

  2. #2
    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 ne suis pas certain d'avoir bien "cerné" ta difficulté.
    Elle parait être résumée par :
    J'ai beau cherché sur internet et tout les forums possible, rien. Ou alors, ça ne correspond pas à ce que je veux, puisque bien souvent c'est dans un msgbox.

    Une solution, ou une piste à me proposer ?
    Si tel était bien le cas, cela voudrait dire que tu ne sais pas encore ce que sont les objets de Excel, à commencer par l'objet Range, et que tu as vraiment besoin de commencer par là ton apprentissage.
    Une "piste" ? --->> Ouvre la rubrique Range, objet de ton aide VBA.

  3. #3
    Membre averti
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Février 2017
    Messages : 14
    Par défaut
    Bonjour,

    Je sais ce que fais mon objet Range, je l'utilise déjà partout ailleurs dans le programme et tout va bien avec.
    Je vais être un peu plus explicite, lorsque que depuis mon sub j'appelle ma fonction (module3.prixdeventeM), tout ce passe bien, PV prends bien 30 en valeur, mais lorsque je quitte la fonction et reviens dans ma sub pour continuer, PV et redevenu vide. Donc impossible d'attribuer à H2 la valeur de PV.

    En gros la valeur de PV n'est pas sauvegardé après avoir quitter la fonction.

    Bonne journée, merci de ta réponses, et vos réponses futures.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sans afficher le code de ta fonction qui pose problème, il est difficile de t"aider.
    En attendant, un peu de lecture Les fonctions personnelles dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Février 2017
    Messages : 14
    Par défaut
    Bonjour,

    Voici à quoi ressemble ma fonction

    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
    22
    23
    24
    25
    26
    27
    Function PrixdeventeM()
     
        Dim PV As Double
        Dim Q12, Q13, Q16, Q17, Q18, Q19, Q20, Q21, Q25, Q27, Q29, Q33, Q34, Q36, Q39, Q41 As Double
     
        Call Module1.Workbook_Open_calculprix
     
        Q12 = Sheets("calculprix").Range("Q12").Value
        Q13 = Sheets("calculprix").Range("Q13").Value
        Q16 = Sheets("calculprix").Range("Q16").Value
        Q17 = Sheets("calculprix").Range("Q17").Value
        Q18 = Sheets("calculprix").Range("Q18").Value
        Q19 = Sheets("calculprix").Range("Q19").Value
        Q20 = Sheets("calculprix").Range("Q20").Value
        Q21 = Sheets("calculprix").Range("Q21").Value
        Q25 = Sheets("calculprix").Range("Q25").Value
        Q27 = Sheets("calculprix").Range("Q27").Value
        Q29 = Sheets("calculprix").Range("Q29").Value
        Q33 = Sheets("calculprix").Range("Q33").Value
        Q34 = Sheets("calculprix").Range("Q34").Value
        Q36 = Sheets("calculprix").Range("Q36").Value
        Q39 = Sheets("calculprix").Range("Q39").Value
        Q41 = Sheets("calculprix").Range("Q41").Value
     
        PV = Q12 + Q13 + Q16 + Q17 + Q18 + Q19 + Q20 + Q21 + Q25 + Q27 + Q29 + Q33 + Q34 + Q36 + Q39 + Q41
     
    End Function

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Si tu veux que ta fonction renvoie une valeur, il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        PrixdeventeM = Q12 + Q13 + Q16 + Q17 + Q18 + Q19 + Q20 + Q21 + Q25 + Q27 + Q29 + Q33 + Q34 + Q36 + Q39 + Q41
    Et il serait mieux de déclarer son type dans sa déclaration (première ligne).

    Je pense qu'il serait utile pour toi de lire ceci : https://msdn.microsoft.com/fr-fr/lib.../gg264233.aspx

  7. #7
    Inactif  
    Homme Profil pro
    Analyste-Programmeur / Intégrateur ERP
    Inscrit en
    Mai 2013
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur / Intégrateur ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 511
    Par défaut
    Bonjour,

    2 solutions possibles à votre problème :

    - soit vous venez remplir votre cellule directement depuis votre fonction à la fin de celle-ci.

    - soit vous modifiez votre fonction afin qu'elle puisse vous retourner une valeur, en changeant légèrement sa déclaration. Pour cela, consulter le lien fourni par Philippe Tulliez, notamment la partie II-B-8. Type.


    Edit: post de Menhir entre temps, désolé.

  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
    Bonjour,

    dans ta Function, si tu n'affectes pas le résultat à cette dernière, elle ne peut pas ramener le résultat à la procédure appelante


    donc deux aménagements à faire

    1) Typer le retour de ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function PrixdeventeM() as Double
    2) Lui donner le résultat à la fin du traitement

    dernière ligne de ta fonction avant le End Function :



    A titre accessoire (mais pas inoportun), toutes les données utilisées par ta Function sont récupérées en dur dans ta fonction
    Il est également possible de transmettre à ta fonction les valeurs (les "arguments") qui seront utilisés dans ta fonction

    L'avantage, c'est que ta fonction pourra donc servir à additionner d'autres sources de données que cette plage figée
    par exemple, en utilisant un paramètre qui est un tableau contenant toutes tes valeurs, on peut même très facilement additionner toutes les valeurs du tableau

    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
    22
    23
    Function PrixdeventeM(MesValeurs As Variant) As Double
        PrixdeventeM = Application.Sum(MesValeurs)
    End Function
     
     
    Sub TestFunction()
    Dim Resultat As Double
    Dim MonTableau
     
    Call Module1.Workbook_Open_calculprix
     
    With Sheets("calculprix")
        MonTableau = Array(.Range("Q12").Value, .Range("Q13").Value, .Range("Q16").Value, .Range("Q17").Value, _
                           .Range("Q18").Value, .Range("Q19").Value, .Range("Q20").Value, .Range("Q21").Value, _
                           .Range("Q25").Value, .Range("Q27").Value, .Range("Q29").Value, .Range("Q33").Value _
                           .Range("Q34").Value, .Range("Q36").Value, .Range("Q39").Value, .Range("Q41").Value)
     
    End With
     
    Resultat = PrixdeventeM(MonTableau)
    MsgBox Resultat
     
    End Sub

    Si on pousse la logique au bout, on voit donc que la fonction n'a plus de réelle utilitée, puisqu'on peut sommer directement les valeurs dans la procédure appelante (le Application.Sum(MonTableauAvecMesValeurs)

    Mais bien sûr, tout dépend de ton projet, ce ne sont que des remarques pour t'ouvrir les horizons

  9. #9
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Une fonction "n'affiche pas" une valeur, elle se contente de la renvoyer.

    Il faut ensuite utiliser une autre commande, méthode ou propriété pour exploiter cette valeur.

    Par exemple, prenons une fonction très simple qui ajoute 1 (c'est une fonction qui ne sert à rien mais c'est juste pour l'exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function Plus(Param As Integer) As Integer
       Plus = Param + 1
    End Function
    En elle-même, elle n'affiche rien. Elle se contente de renvoyer une itération de la valeur qu'on lui a transmise.
    Pour l'utiliser, il faut autre chose.

    Par exemple, si on veut ajouter 1 à la valeur de la cellule A1 en utilisant cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Value = Plus(Range("A1").Value
    Si on veut afficher la valeur +1 de la variable MaVar dans la fenêtre d'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Plus(MaVar)
    Si on veut l'utiliser pour modifier le numéro de ligne d'une cellule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(Plus(MaVar), 10).Value = "test"
    etc.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Value = Plus(Range("A1").Value
    juste pour te dire qu'il manque une ) dans ton code désolé je retourne en réunion

  11. #11
    Membre averti
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Février 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Février 2017
    Messages : 14
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Par exemple, si on veut ajouter 1 à la valeur de la cellule A1 en utilisant cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Value = Plus(Range("A1").Value
    Je vais tester ça tout de suite et je vous redis.
    Peut tu juste me dire pourquoi rajouter (Range("A1").Value derrière Plus ?

    Sinon, est ce possible depuis la fonction de lui faire inscrire directement dans la cellule voulut ? Comme ça mon problème de sauvegarde de valeur de PV disparaît, vu qu'on est dans la fonction il l'a en mémoire.

    Merci.

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

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Réponses: 2
    Dernier message: 04/01/2015, 15h28
  3. [XSLT 1.0] Mettre le résultat de l'appel d'une fonction dans une variable
    Par Giovanny Temgoua dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/01/2012, 17h47
  4. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  5. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04

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