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 :

Déclaration publique de tableau interdite en Userform [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut Déclaration publique de tableau interdite en Userform
    Bonjour,

    Je développe depuis quelque temps en VBA et je me trouve aujourd'hui face à quelque chose qui me déplait ...

    Version courte :
    VBA m'interdit de déclarer un tableau publique dans le code de mon userform. Quelle solution s'offre à moi, autre que déclarer une variable publique dans le Sub appelant le userform ? (qui me semble être une solution "moche")

    Version longue :
    Grossomodo, j'ai un Sub ("DeleteColonne") qui doit appeler un userform ("UF_ColonneDelete").
    Le userform a besoin (entre autre) d'une variable tableau de dimension 1 en paramètre pour pouvoir se construire et alimenter une listview.

    Ce code date d'il y a quelque temps, il fonctionne parfaitement car j'utilise des variables publiques dans mon Sub (DeleteColonne)
    Mais le soucis c'est que :
    - C'est moche, j'ai la variable de mon Sub appelant qui se balade partout dans mon projet
    - Mon userform n'est pas autonome, je lui dis "ha au fait, faut que tu récupères aussi une variable d'une autre module pour pouvoir fonctionner, vas y , va la chercher toi même"
    - Si je veux modifier le nom de ma variable publique, je dois balayer tout mon projet pour ne pas oublier d'occurence

    J'aimerai donc l'améliorer et effectuer un code propre en rendant le code de mon userform autonome.

    J'ai donc opter pour la méthode suivante

    Code de mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public sub DeleteColonne()
    dim paramètre1 as string
    dim Parametre2() as string
     
    ' set de mes 2 variables
     
    Call UF_ColonnDelete.UF_Show(Paramètre1, Paramètre2)
     
    '...
    End sub
    Code de mon userform :
    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
    public Parametre1 as string
    Public Parametre2() as string
     
    Public Sub UF_Show(Param1 as string, Param2() as string)
    parametre2 = param2
     
    UF_ColonneDelete.show
     
    Param1=parametre1
    End sub
     
    public sub userform_initialize()
    ' code qui se lance lorsque UF_ColonneDelete.show est executé
    ' construction du userform en fonction de parametre2
    ' l'utilisateur va rentrer parametre1, puis à la fermeture l'idée est de renvoyer parametre1 en sortie
    ' ...
    End sub
    Cette solution est jolie, mais VBA refuse un tableau comme variable publique d'un userform ....
    Une solution "élégante" existe-t-elle ? Si oui laquelle ?
    J’espère avoir été clair ... Merci de vos réponses !

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour ArthG, bonjour le forum,

    je ne comprends pas ton soucis. Si ta variable est déclarée publique dans un module standard, rien ne t'empêche de l'initialiser via l'initialisation de ta UserForm.

    • Module 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Tbl() As Variant
    • UserForm1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub UserForm_Initialize()
    Tbl = Worksheets("Feuil1").Range("A1:A7") '{lundi, Mardi,..., Dimanche}, disponible désormais dans tout le projet VBA
    Me.ComboBox1.List = Application.Transpose(Tbl)
    End Sub

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Un post sur les variables publiques : https://www.developpez.net/forums/d2.../#post11121548 à lire !

  4. #4
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,
    Citation Envoyé par ArthG Voir le message
    J'aimerai donc l'améliorer et effectuer un code propre en rendant le code de mon userform autonome.
    Alors dans ce cas pourquoi tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public sub userform_initialize()
    reste en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub UserForm_Initialize()
    et défini tes variables en tête du module UserForm il sera autonome et transportable.

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut
    Citation Envoyé par Thautheme Voir le message
    Bonjour ArthG, bonjour le forum,

    je ne comprends pas ton soucis. Si ta variable est déclarée publique dans un module standard, rien ne t'empêche de l'initialiser via l'initialisation de ta UserForm.

    • Module 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Tbl() As Variant
    • UserForm1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub UserForm_Initialize()
    Tbl = Worksheets("Feuil1").Range("A1:A7") '{lundi, Mardi,..., Dimanche}, disponible désormais dans tout le projet VBA
    Me.ComboBox1.List = Application.Transpose(Tbl)
    End Sub
    @ Thautheme
    Merci de ta réponse. En fait je n'ai pas de problème technique, mon programme fonctionne. Mais je ne souhaite pas utiliser de variable publique dans mon module standard. J'aimerai tout filer en paramètre

    Citation Envoyé par Patrice740 Voir le message
    Bonjour,

    Un post sur les variables publiques : https://www.developpez.net/forums/d2.../#post11121548 à lire !
    @ Patrice
    Merci infiniment pour ce post ! Comme toi j'enregistre le lien pour me le rappeler ^^. Pierre Fauconnier met à l'écrit ce que je ressentais. Je suis content de voir que je ne suis pas le seul à trouver les variables publiques "moches".
    Mais je crains que lorsqu'il dit "Je pense qu'on peut s'en passer dans tous les cas (ou presque)", il n’émette l'idée que dans certains cas il n'est pas possible de faire autrement ... Peut être suis je dans ce cas.

    Citation Envoyé par anasecu Voir le message
    Bonjour,

    Alors dans ce cas pourquoi tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public sub userform_initialize()
    reste en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub UserForm_Initialize()
    et défini tes variables en tête du module UserForm il sera autonome et transportable.
    @ Anasecu
    En effet ... Merci pour le public/Private, je modifie.
    En revanche, les variables Tableau sont interdites en tant que Variable publique dans un module de UserForm, c'est de là que vient ma gêne.
    D'ailleurs pour être propre, ll faut utiliser envenimement activate et non pas Initialize. L'evenement activate est appelé lorsque le userform est affiché, envenement initialize est appelé lorsque le module du userfrom est activé.

    Merci pour vos réponses !
    Je n'ai toujours pas la réponse à ma question, mais je pense comprendre qu'il n'y a pas de solution propre pour ce cas particulier .... Vraiment dommage ... C'est la première fois que je suis confronté à une telle situation

  6. #6
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim Parametre1(10) As String, Parametre2() As String
    Dim UsF As New UserForm1
     UsF.Parametre2 = Parametre1
     Parametre2 = UsF.Parametre2
    UsF.Show
    End Sub
    Code UserForm1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Parametre2_() As String
    Public Property Let Parametre2(Value As Variant)
    Parametre2_ = Value
    End Property
    Public Property Get Parametre2() As Variant
    Parametre2 = Parametre2_
    End Property

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Dim Parametre1(10) As String, Parametre2() As String
    Dim UsF As New UserForm1
     UsF.Parametre2 = Parametre1
     Parametre2 = UsF.Parametre2
    UsF.Show
    End Sub
    Code UserForm1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Parametre2_() As String
    Public Property Let Parametre2(Value As Variant)
    Parametre2_ = Value
    End Property
    Public Property Get Parametre2() As Variant
    Parametre2 = Parametre2_
    End Property
    Mec, Merci !!!!!!!!
    En fait, j'ai pas fait exactement comme tu dis.
    J'ai déclaré le tableau en private dans le module UserForm, je n'ai pas utilisé les property. J'ai filé mon tableau en paramètre de mon sub, et c'est dans le paramètre que j'écris dans la variable private (comme elle est private, elle est utilisable dans tout le module, du coup pas besoin de gérer les property).
    Je suis refait de ouf !! Vraiment, merci beaucoup !!!
    Je me rend compte que je n'ai pas assez de connaissance sur la portée des variables.

    En gros la solution est de ne pas déclarer mon tableau en public dans mon module de UserForm (car c'est interdit par VBA), mais de le déclarer en Private car je n'ai pas besoin qu'il soit défini en Public.

    Sujet résolu !! Merci à tous !!
    Excel et VBA sont une belle machine

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut
    Voilà la solution donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' code du module standard appelant le userform
    Public sub ColonneDelete
     Dim Tableau1() as string
     Dim ReponseTableau as string
     
     call UF_ColonneDelete.UF_Show (Tableau1,ReponseTableau)
     
     ' ... utilisation de ReponseTebleau dans la suite de mon code
    End sub
    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
    ' Code du module de mon userform
    Private Reponse as string
    Private Tableau() as string
     
    Public UF_Show(ParamTableau() as string, ParamReponse as string)
     Tableau = ParamTableau
     UF_ColonneDelete.show
     ParamReponse = Reponse
    end sub
     
    private UF_ColonneDelete_activate()
     'utilisation de Tableau pour générer mon UserForm
    end sub
     
    '... reste du code

  9. #9
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    pour info!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public UF_Show(ParamTableau() as string, ParamReponse as string)
     ...
     Me.show
     ...
    end sub

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

Discussions similaires

  1. [XL-2016] Déclaration d'un tableau dans une RechercheV pour un USERFORM
    Par Nherve dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/09/2017, 10h54
  2. [Tableaux] Déclaration d'un tableau à 2 dimensions
    Par kcizth dans le forum Langage
    Réponses: 5
    Dernier message: 04/01/2006, 15h35
  3. [VB6] Déclaration d'un tableau avec variable en paramètre.
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 23/10/2005, 12h21
  4. Déclaration d'un tableau d'Object
    Par elitost dans le forum Groovy
    Réponses: 1
    Dernier message: 19/10/2005, 14h15
  5. Réponses: 2
    Dernier message: 27/05/2002, 19h46

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