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 :

appels de fonction et procédure


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 87
    Par défaut appels de fonction et procédure
    Bonjour,

    Je réalise un programme dans lequel j'utilise des procédures ainsi que des fonctions.
    Ce programme est destiné à être exécuté depuis Excel uniquement, ce qui signifie que pour exécuter certaines fonctions, je dois créer des procédures liées à des boutons, seul moyen pour l'utilisateur de les exécuter.

    Si j'énumère les étapes je dois:
    1.Récupérer et stocker les valeurs saisies dans Excel par l'utilisateur à travers la procédure SOLLICITATION.
    2.Utiliser les valeurs stockées dans la précédente procédure et les traiter (divers calculs) dans la fonction COMB
    3.Exécuter et stocker des valeurs intermédiaires de la précédente fonction dans Excel à l'aide de la procédure CAL: cette procédure sera exécutée par l’intermédiaire d'un bouton dans Excel.

    J'espère avoir été claire dans mes explications.

    1.Procédure SOLLICITATION :
    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
    Public Sub sollicitation()
     
    Dim ELU, Nu, Vyu, Vzu, Myu, Mzu, Tu As Double
    Dim type_soll As String
     
    ELU = Cells(9, 28).Value
    '*****************************************************RECUPERE SOLLICITATIONS************************************************************************
    'ELU
    ligne_ELU = Switch(ELU = 100, 17, ELU = 101, 18, ELU = 102, 19, ELU = 103, 20, ELU = 104, 21)
        Nu = Cells(ligne_ELU, 4).Value
        Vyu = Cells(ligne_ELU, 5).Value
        Vzu = Cells(ligne_ELU, 6).Value
        Myu = Cells(ligne_ELU, 7).Value
        Mzu = Cells(ligne_ELU, 8).Value
        Tu = Cells(ligne_ELU, 9).Value
        type_soll = Cells(ligne_ELU, 10).Value
     
    'nommer ici les différentes fonctions et procédures qui utilisent les variables
    Comb Nu, Vyu, Vzu, Myu, Mzu, Tu 'test
     
    End Sub
    2.Fonction COMB: (je l'ai simplifié car code trop long)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function Comb (Nu, Vyu, Vzu, Myu, Mzu, Tu)
    Dim a As Double
    'Call sollicitation
    a = Nu + Vyu + Vzu + Myu + Mzu + Tu
    End Function
    3.procédure CAL


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub Cal()
    Call sollicitation
    Call Comb(Nu, Vyu, Vzu, Myu, Mzu, Tu)
    MsgBox "BINGO "
    Cells(14, 4) = a
    End Sub
    Le problème est que lorsque j'exécute la procédure CAL, la variable a est vide.. Il semblerai que les variables Nu, Vyu, Vzu, Myu, Mzu et Tu ne stockent rien alors que j'appelle la procédure sollicitation...
    D'avance merci pour votre aide

  2. #2
    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,

    sans revoir la mécanique de tes appels qui pourrait être rationnalisée ... ton problème ici est un "simple" problème de portée des variables

    chaque variable a une portée "procédure" (ou fonction), ce qui signifie que quand tu veux les réutiliser ailleurs (par exemple Call Comb(Nu, Vyu, Vzu, Myu, Mzu, Tu) dans ta procédure Cal()), ce sont de nouvelles variables et pas celles de tes autres procédures.


    La solution la plus simple pour toi, c'est de déclarer tes variables tout en haut du module qui contient tes procédures/fonctions .... ceci afin d'augmenter leur portée à l'ensemble du module


    Bien sûr, mais ça demande un peu plus d'expertise, j'aurai plutôt opté pour des passages de paramètres entre tes procédures, car l'idée d'une procédure maîtresse qui appelle le reste, c'est conseillé.

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 87
    Par défaut
    Merci pour ton retour,
    Alors j'ai déclaré tout en haut du module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Nu, Vyu, Vzu, Myu, Mzu, Tu, a As Double
    et j'ai supprimé la déclaration de ces variables dans les procédure et fonction.
    Par contre je retourne la valeur a=0 et les variables Nu,Vyu,Myu,Mzu,Tu sont vides....
    Y a -t-il autre chose à ajouter?

  4. #4
    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
    Déjà, seule ta variable a est un Double, les autres sont des Variant
    lors d'une déclaration multiples sur une seule ligne, il faut préciser le type de CHAQUE variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Toto As Double, Titi As Double, Toutou, Tonton As Double  ' Ici Toutou est un Variant

    Ensuite, ta fonction ne retourne rien
    Ton résultat de fonction est dans la variable "a", il faut ensuite transmettre à la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function MaFonction(MaVariable As Double) As Double
    Dim a As Double
    a = MaVariable *2
    MaFonction = a  ' ou directement faire MaFonction = MaVariable *2
    End Function
    Et on ne la "Call" pas la fonction, on affecte son résultat à une variable appelante par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub LancerMaFonction
    Dim b as Double
    b = MaFonction(8)
    MsgBox b
    End Sub

  5. #5
    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
    L'un de tes problèmes est que tu ne comprends pas la différence entre un Sub et une Function.
    En gros, un Sub réalise une action alors qu'une Function renvoie une valeur (oui, je sais, c'est très simplifié comme explication mais c'est à peu près la philosophie du truc).
    https://msdn.microsoft.com/fr-fr/VBA...tion-statement

    Donc, dans ta fonction Comb, il doit y avoir quelque part un "Comb = ..." qui définit la valeur renvoyée par la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function Comb(Op1 As Double, Op2 As Double, Op3 As Double, Op4 As Double, Op5 As Double, Op6 As Double) As Double
        Comb = Op1 + Op2 + Op3 + Op4 + Op5 + Op6
    End Function
    Du coup, tes deux Sub (sollicitation et Cal) peuvent être fusionnées :

    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
    Public Sub Cal()
       Dim ELU As Double, Nu As Double, Vyu As Double, Vzu As Double, Myu As Double, Mzu As Double, Tu As Double
       Dim type_soll As String
     
       ELU = Cells(9, 28).Value
       ligne_ELU = Switch(ELU = 100, 17, ELU = 101, 18, ELU = 102, 19, ELU = 103, 20, ELU = 104, 21)
     
       Nu = Cells(ligne_ELU, 4).Value
       Vyu = Cells(ligne_ELU, 5).Value
       Vzu = Cells(ligne_ELU, 6).Value
       Myu = Cells(ligne_ELU, 7).Value
       Mzu = Cells(ligne_ELU, 8).Value
       Tu = Cells(ligne_ELU, 9).Value
       type_soll = Cells(ligne_ELU, 10).Value
     
        Cells(14, 4) = Comb(Nu, Vyu, Vzu, Myu, Mzu, Tu)
        MsgBox "BINGO "
    End Sub
    Petite remarques en passant : dans un Dim, il faut indiquer le type de chaque élément.
    Si on n'indique que le type de l'élément final (comme tu l'as fait dans ta macro solicitation), seul Tu est défini comme Double, les autres restent de type Variant.

    Autre conseil : dans ton cas, il me semble que la fonction Choose aurait été plus pratique que Switch.
    https://msdn.microsoft.com/fr-fr/VBA...hoose-function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       ligne_ELU = Choose(ELU - 99, 17, 18, 19, 20, 21)
    Voir même une simple soustraction :

Discussions similaires

  1. procédure stockée et appel de fonctions
    Par *alexandre* dans le forum Développement
    Réponses: 3
    Dernier message: 11/03/2009, 13h12
  2. Appel dynamique de Fonction ou Procédure
    Par bepbep dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/02/2009, 13h18
  3. Appel de fonction dans une procédure stockée
    Par Nuloprog dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2008, 16h00
  4. Appel de fonction depuis procédure stockée
    Par sasy22 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2008, 14h39
  5. [VBA-E] Appel de fonction/procédure depuis une variable
    Par truman dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/05/2006, 16h20

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