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 :

passage de parametre sous VBA excel


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut passage de parametre sous VBA excel
    Bonjour,
    Je debute en VBA sous excel, et je n'arrive pas à passer des parametres sous excel

    j'ai defini un formulaire MyUserform avec 1 variable publique MyVar, et j'ai défini 2 procédures MySub1 et MySub2 dans un module

    j'appelle la premiere fonction en par MyUserform_initialize :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub MyUserform_initialize()
       MySub1 Me
    end sub
     
    sub MySub1 (Form as userform)
      MySub2 Form
    end sub
     
    sub MySub2 (Form as userform)
    Form.Myvar=0
    end sub
    en debug, sous MySub1, je vois bien Form.Myvar, par contre sous MySub2, je n'ai pas acces à MyVar.

    Quelle erreur j'ai fait ????
    D'avance, merci !!!!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Puisque cette variable est publique pourquoi ne pas la créer avant tes modules du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Public myVar as long
     
    sub MySub1 (Form as userform)
    MySub2 Form
    end sub
     
    sub MySub2 ()
    Myvar=0
    end sub
    Par ailleurs je ne comprends pas bien ton code et notamment ton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sub MySub1 (Form as userform)
    MySub2 Form
    end sub
    Quel est le but ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Simplement une erreur... car n'a vraiment aucune utilité
    Merci pour les réponses....

    J'ai voulu simplifier le code pour avoir un truc facilement reproduisable...

    Le pb est la perte du pointeur lors de 2 appels imbriqués

    Voila la même version avec plus de détails...
    Je fais une sorte de banc de test qui communique avec des équipements par RS232. Dans le cas présent, de l'activité sur le port série appelle MySub1 qui analyse le message et appelle MySub2 qui renvoie un message sur le port
    J'ai un formulaire avec un port série. J'ai donc une instance MSComm1 de MSComm sur ce formulaire. J'ai des procédures qui utilisent ce port série que j'ai défini avec des variables publiques. Tout fonctionne très bien.
    Je vais réutiliser les mêmes fonctions dans d'autres applications, je comptais me faire une petite bibliothèque, j'ai donc décidé de les regrouper dans un module à part. Je ne voudrais pas avoir à définir de variables publiques pour faciliter la réutilisation des procédures, je voudrais tout passer en paramètre, et en particulier l'instance MSComm1 de Form1 à MySub1, et puis à MySub2

    Après réécriture du code, ça ne fonctionne plus... Après debug, je me suis rendu compte que le passage de paramètre bloquait de MySub1 vers MySub2.

    Le petit bout de code dans mon premier message est complètement con, mais il reproduit très bien le problème, et sans fioritures...
    Et je ne vois pas ou est l'erreur....
    Si quelqu'un à des idées.... meci d'avance....

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse !!!
    Par contre je n'ai pas tout compris...
    Dans le bout de code, en debug sous MySub1, je vois bien l'userform passé en paramètre, et j'ai accès à tout les controles et variables... par contre, si je le repasse une fois à une autre procédure, le pointeur est perdu....
    Ce qui est passé est un pointeur n'est ce pas ??? et donc normalement si le type de pointeur est connu, on peut acceder à n'importe quelle variable de la structure ???
    En fait, c'est juste un controle que je comptais passer en paramètres, mais je crois que c'est la même chose, non ???

    J'ai developpé tout le code pour piloter 1 equipement, en variable globale, et cela fonctionne très bien.
    La, je vais en piloter 2 ou 3. Je comptais réécrire les fonctions avec le MSComm en paramètre.... mais je bloque sur ce point.....
    Tout déclarer en variable globales, cela m'oblige à doubler ou tripler les procédures....Est ce que je me trompe ???

    Merci pour tes réponses...

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Remet le code modifié des tes 2 fonctions, je comprend pas bien tes explications.
    A+

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Dans Userform1 il y a un control MSComm instance MyMSComm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private sub MyMSComm_on_comm()
      Module1.ManageAnswer MyMSComm
    end sub
    dans module1
    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
    Dim RXBuffer as string *256
     
    sub ManageAnswer (MSComm1 as MSComm)
     
    RxBuffer = RxBuffer & MSComm1.Input
    If Right(RxBuffer, 1) = Chr(10) Then
       if RxBuffer="Coucou"
          SendCommand MSComm1
       end if
       RxBuffer=""
    end if
    end sub
     
     
    sub SendCommand (MSComm2 as MSComm)
    MSComm2.Output="Ca ne marche pas !!!!" & Chr(13) & Chr(10)
    end sub
    Voila...
    Donc en debug, sous ManageAnswer, en espion, MSComm1 pointe sur quelquechose, mais lorsque j'arrive sur SendCommand, MSComm2 est vide....
    Je ne comprend pas l'erreur...
    D'avance, merci !!!

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonjour,

    Citation Envoyé par Ouskeln'or
    On ne peut pas passer un userform en paramètre.
    Désolé de te contredire mais rien ne l'empeche, un petit exemple ici.

    http://www.developpez.net/forums/sho...d.php?t=416007

    Si j'ai bien compris la source du probleme est dans le type de l'argument des procédures. Essaye comme cela:

    Dans ton formulaire nommé MyUserform:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public myvar As Long
     
    Private Sub UserForm_Initialize()
       myvar = 2
       MySub1 Me
    End Sub
    Dans un module standard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub MySub1(Form As MyUserForm)
        MsgBox Form.myvar
        MySub2 Form
    End Sub
     
    Sub MySub2(Form As MyUserForm)
        MsgBox Form.myvar
    End Sub
    Si tes procédures doivent recevoir plusieurs formulaires différents en parametre, il faut déclarer celui-ci avec le type Object.

    Cordialement,

    Tirex28/

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Oula !!!! Il y avait un truc qui me passait au dessus de la tête
    L'erreur que je faisais était de déclarer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sub Mysub (form as userform)
    end sub
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sub Mysub (form as userform1)
    end sub
    J'ai l'impression que je confond classe et objet
    Lorsque l'on crée un userform appellé MyUserform, je croyais que userform était la classe, et MyUserform l'objet.
    Lorsque l'on définit une fonction procédure, on lui précise la classe des paramètres.
    Chaque fois que l'on crée un userform, le compilateur dérive une classe de l'objet ??? est ce que je suis dans le vrai ?

    Merci pour la solution !!!!

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Re,

    Chaque fois que l'on crée un userform, le compilateur dérive une classe de l'objet ??? est ce que je suis dans le vrai ?
    En quelque sorte quoique ce soit peut etre un abus de langage. Un module de Userform c'est une classe. Le formulaire que tu vois apparaitre à l'ecran ou que tu passe en parametre c'est un objet issue de cette classe. Quand tu fais MyUserForm.Show, implicitement cela revient à faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Form As MyUserForm
    Set Form = New MyUserform
    Form.Show
    En chargeant ton formulaire avant de l'afficher, tu peux acceder a ces membres publics.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyUserForm.Load
    MYUserForm.MyVar=2
    MYUserForm.Show
    Ce qui revient implicitement à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Form As MyUserForm
    Set Form = New MyUserform
    Form.MyVar=2
    Form.Show
    Cordialement,

    Tirex28/

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour les réponses, je commence à comprendre...
    Mais la ou je suis perdu, c'est dans le cas ou je définie plusieurs instances d'un control

    Si j'ai un control dans le formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim MyInstance1 as control
    Dans un module externe, je définie des fonctions avec comme paramètre ce controle, je les déclare comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sub MySub (Control as MyInstance1)
    end sub
    et dans le cas ou je définie une autrel instance MyInstance2 de ce controle dans le formulaire, comment je fais pour réutiliser les fonctions ???

    D'avance, merci !!!!

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonjour,

    Dans le formulaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim MyInstance1 as control
    dim MyInstance2 as control
    ...
    MySub Myinstance1
    MySub Myinstance2
    Dans un module externe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub MySub (AnyInstance as control)
    Msgbox AnyInstance.Name
    end sub

    Cordialement,

    Tirex28/

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

Discussions similaires

  1. [VBA-E] Comment créer un tableau sous vba excel
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/01/2007, 09h52
  2. Arc de cercle sous VBA excel?
    Par fredieuric dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/11/2006, 13h58
  3. ptit probleme combobox sous vba/excel
    Par bandito dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/10/2006, 09h34
  4. pb de requette parametrer sous VBA
    Par lucyole dans le forum Access
    Réponses: 13
    Dernier message: 12/05/2006, 23h44
  5. Passage de parametre Access vers Excel
    Par climz dans le forum Access
    Réponses: 2
    Dernier message: 05/05/2006, 15h07

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