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 :

Problème de variables dans un module


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 17
    Points
    17
    Par défaut Problème de variables dans un module
    Bonjour,

    J'aimerai utiliser une fonction dans un module.
    Cette fonction fait plus de 300 lignes et je devrais l'appeler plusieurs fois dans une feuille de mon program principal.

    Lorsque cette fonction est dans la feuille du programme principal, tout se deroule bien.
    Mais lorsque je la copie colle dans le module et que je l'appelle dans le programme principal, j'ai une erreur de type '1004' (application-defined or object-defined error)

    Dans cette fonction que je veux mettre dans le module, je recupere des variables du programme principale.
    Je presume qu'il faut faire quelquechose pour que ces variables soient compatibles dans le module et le programme principal.
    Mais je ne sait pas ce quoi faire.

    Pouvez-vous m'aidez merci.

  2. #2
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Lors de l'appel de la procédure en question, tu dois spécifier le nom du module. Si la procédure est déclarée Private, ça ne marchera pas. Il faut qu'elle soit Public (par défaut si non spécifié). Exemple d'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Module1.maProcedure [etSesArguments]
    [edit]
    après vérification, il n'est pas nécessaire de spécifier le nom du module où se trouve la procédure. Mais celle-ci doit être publique.

    Par contre, pour appeler depuis un module une procédure se trouvant dans un UserForm, il faut non seulement que celle-ci soit Publique, mais il faut aussi spécifier le nom du UserForm.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Je ne comprends pas bien les termes programme principal, feuille du programme principal et je la copie colle dans le module.

    Normalement, les fonctions et procédures "générales" (non attachées à un objet particulier) sont placées dans un module standard (Insertion/module). En les plaçant là, on les met, par défaut, à disposition de tout le code de l'ensemble du projet.

    Si ta fonction a besoin de variables pour être utilisée, tu as trois solutions:
    1. Passer les paramètres désirés à la fonction lorsque tu l'appelles
    2. Rendre toutes tes variables publiques en les déclarant dans un module standard, avant toute procédure ou fonction (Pas très conseillé)
    3. Faire un mix des deux (encore plus déconseillé)

    Si tu choisis l'option 2, tu auras peut-être besoin d'utiliser dans ta fonction des variables attachées à des objets précis (feuille, classeur, dans une moindre mesure Userform), tu devras alors préfixer ta variable du nom de l'objet dont elle est une propriété.

    Pourquoi choisir l'option 1, puisque je ne conseille pas les autres? Parce que c'est ce qui va t'amener à écrire une fonction propre, et surtout portable (réutilisable ailleurs)

    Tu pourras utilement lire le chapitre III-C de ce tutoriel de Morgane. Il concerne Outlook mais est transposable sur Excel
    J'espère t'avoir aidé

  4. #4
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Le temps que je modifie mon message, Pierre a eu le temps de donner une explication complète... Je deviens lente... ça veut dire qu'il est temps que je quitte. Allez! À demain tout l'monde!

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 17
    Points
    17
    Par défaut
    Merci d'avoir repondu.
    J'ai pas tres bien compris les reponses (je suis pas un familier de vba)

    Mais pour porter des clarification.
    quand j'utilise le terme programme principal je parle du dossier xls.
    le terme feuille du programme principal se trouve etre une feuille du dossier xls, (pour le moment j'en ai six) qui est appellé Microsoft Excel Objects sous vba.
    et enfin pour le copie colle... je voulais dire que je passe des lignes de codes qui etaient avant dans une feuille (Object) dans un module (içi sous module 1).

    Serait-il possible de m'expliquer le terme
    Passer les paramètres désirés à la fonction lorsque tu l'appelles
    car je pense que c'est que je cherche a faire. Mais je ne saisis pas vraiment.
    Sinon pour le lien vers un tutoriel, je sais qu'il faut que je passe mes variables en public.

    Mais j'ai des variables de meme noms dans d'autres procedures mais qui n'ont pas la meme fonction, et je les redefini a chaque debuts de procedures. Y-a-t'il un risque de probleme de declaration pour ces variables ?


    Je m'explique:
    J'ai la variable J qui est un compteur dans une procedure1, dans la procedure2 J correspond au numero d'une ligne. et j'ai besoin aussi de recuperer la valeur de J pour un module.


    merci pour toutes reponses.
    Si ce n'est pas tres clair, n'hesitez pas à me demander une clarification.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    bonjour,

    Peut tu nous montrer ton code.

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 17
    Points
    17
    Par défaut
    mon code fait a peu pres 500 lignes.
    donc c'est un peu difficile de le montrer.

    deplus le sujet est confidentiel.

    désolé.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Il est délicat de t'aider sans voir ton code.

    Tu dis par ailleurs que, suite à lecture du tuto, tu as compris que tu devais mettre tes variables publiques...

    Oui et non. Si tu déclares tes variables comme étant publiques à l'intérieur de module de feuille de calcul, tu ne peux quand même pas les utiliser telles quelles n'importe où dans ton code, mais tu dois les préfixer du nom de ta feuille...

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 17
    Points
    17
    Par défaut
    voici comment je declare les variables dans la feuille vba qui est lié a la feuille 'compare'. que j'appele dans le programme sheets("compare")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CB_compare_Click()
    Dim k, j, l, i As Integer
    Dim aux, aux1, aux2, aux3, weight_exceedance As Integer
    ...
    apres je les utilise dans un programme qui fait 500 lignes.
    comme je dois appeler de facon repeter ces 500 lignes, je veux les mettre dans un module (enregistrer sous le nom module1).

    Comment dois-je declarer les variables j,k,l et i pour quel soit aussi defini dans le module?

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Heureusement que tu as lu le tutoriel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public k, j, l, i As Integer
    dans un module standard...

    De plus, un code qui fait 500 lignes, brrr.. cela fait un peu peur. Il y aurait probablement moyen d'optimiser tout cela, mais vu que c'est confidentiel...

  11. #11
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    si on considère qu'il vaut mieux prévoir que guérir.... ce post ne te donnera pas une solution, mais pourra te faire gagner énormément de temps dans l'avenir

    Je m'explique:
    J'ai la variable J qui est un compteur dans une procedure1, dans la procedure2 J correspond au numero d'une ligne. et j'ai besoin aussi de recuperer la valeur de J pour un module.
    Je dirai qu'il vaut mieux éviter toute ambiguité dans un code , il y a assez de sources d'erreur sans en rajouter... dans 6 mois ( je suis cool sur le délai...) tu relis et tu patines...

    Donc évite, à la création ce genre de chose en ayant des noms de variables Explicites et les attribuant à une même catégorie dans différentes procédures selon leur portée.

    Implicitement quand on voit un I, un J "tous nus"on pense à une variable compteur

    Lis ceci :

    http://argyronet.developpez.com/office/vba/convention/

    Je te garantis que le temps de lecture (non négligeable) sera récupéré avec un coef multiplicateur important.

    Dernier point, un code long avec des variables , fera que tu trouveras moins de gens pour t'aider, vu que leur passion n'est pas forcément le décrytage, n'est pas Champolion qui veut....

    cordailement,

    Didier

  12. #12
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 17
    Points
    17
    Par défaut
    le code de 500 lignes n'est pas simplifiable malheuresment car cela traite beaucoup de cas de scenario possible.


    je vous montre le probleme que j'arrive pas a regler.
    ps: j'ai mis la procedure en public

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    If Sheets("compare").CB_type.Value = "A320" Then
            l = 2
            For j = 2 To k
            If Sheets("DATA base").Cells(j, 3).Value = "A320" Then
     
     
            compare_SA
     
     
     
            End If
            Next j
    End If

    apres la fonction compare_SA est appelé dans le module 'module1'

    et le probleme est qu'il ne reconnait pas ensuite l'application ou la procedure. (erreur 1004)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub compare_SA()
    
    'pour un hard landing
            If Sheets("compare").OB_hardlanding.Value = True Then
              If (Sheets("Data base").Range("a" & j).Text = "Hard landing" Or Sheets("Data base").Range("a" & j).Text = "Severe hard landing") Then
    ...

    alors que si je met le code ci-dessus dans la premiere feuille, de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'cas d'une comparaison pour l'A320
    If Sheets("compare").CB_type.Value = "A320" Then
            l = 2
            For j = 2 To k
            If Sheets("DATA base").Cells(j, 3).Value = "A320" Then
            'pour un hard landing
            If Sheets("compare").OB_hardlanding.Value = True Then
              If (Sheets("Data base").Range("a" & j).Text = "Hard landing" Or Sheets("Data base").Range("a" & j).Text = "Severe hard landing") Then
    ...
    tout marche bien

    J'ai essayé de montrer des petits bout de programme sans trop en faire voir. mais je pense que vous pouvez savoir pour qu'elle boite je travaille avec les petits indices dedans.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Sheets("Data base").Range("a" & j).
    et j dans ce cas là il correspond à quoi , sachant qu ' il n ' est pas déclaré dans la procédure "compare_SA"

  14. #14
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 17
    Points
    17
    Par défaut
    la feuille "data base" est une feuille contenant une base de donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Sheets("Data base").Range("a" & j).
    et la colonne A est la colonne du type devenement. dans ce cas la, il s'agit de hard landing.

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

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    as tu mis " option explicit " en tête du module , pour voir les variables non déclarées

  16. #16
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 17
    Points
    17
    Par défaut
    j'ai mis option explicit dans les deux tetes de modules

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    As-tu mis les variables en entête d'un module standard comme je te l'indiquais dans mon précédent message?

    Tu dois comprendre qu'avec le peu d'infos que tu donnes, il est malaisé de t'aider.

    Donne-nous les lignes d'entête de tes modules et des procédures qui posent problème, que l'on puisse se rendre compte de la façon dont tu as déclaré tes variables.

  18. #18
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 17
    Points
    17
    Par défaut
    Merci de t'interesser meme si je peux donner beaucop d'information.
    J'ai essayé de penser autrement le programme, cela me rajoute une centaine de ligne, mais il fontionne parfaitement.

    Je suis desolé si je vous ai fait perdre du temps.

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

Discussions similaires

  1. Problème de variable dans un foreach
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/05/2006, 17h57
  2. [MySQL] Problme de variables dans requete
    Par eown dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/04/2006, 18h05
  3. Réponses: 8
    Dernier message: 23/03/2006, 20h30
  4. problème de variable dans formulaire
    Par chienlou dans le forum Langage
    Réponses: 4
    Dernier message: 20/03/2006, 07h53
  5. [VB.NET] [Débutant] Probléme de variable dans les requettes
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/03/2005, 14h13

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