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 :

Créer un UserForm dynamique dans un classeur à partir d'un autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Points : 58
    Points
    58
    Par défaut Créer un UserForm dynamique dans un classeur à partir d'un autre
    Bonjour,

    J'ai un problème. Je programme habituellement plus en VB, surtout en évènementiel, alors je débute dans les macros VBA d'Excel.

    Je veux créer dans un classeur(appellons-le "static") tout le code pour traiter les données de différents autres classeurs, et faire des graphiques de ces données.

    J'arrive à créer un UserForm dynamique, mais avec beaucoup de difficulté. Je dois en créer un dans "thisworkbook" d'abord, ce qui le crée dans mon classeur static, pour ensuite le créer dans l'autre classeur(sinon, il n'apparaissait pas dans ce dernier).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Function creationUserForm(nomForm As String) As Object
       Set USF = ThisWorkbook.VBProject.VBComponents.Add(3)
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       Set USF = ActiveWorkbook.VBProject.VBComponents.Add(3)
    et
    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
    28
    29
    30
    31
    32
     
      With USF
        .Properties("Caption") = nomForm
        .Properties("Width") = 505
        .Properties("Height") = 115
        .Properties("Left") = 200
        .Properties("Top") = 90
      End With
     
    'Ajout des plusieurs checkbox
    Set Chk = USF.Designer.Controls.Add("Forms.CheckBox.1")
                With Chk
                    .Left = lpLeft
                    .Top = lpTop
                    .Width = lpWidth
                    .Height = lpHeight
                    .Caption = "affichage"
                    .Name = "Nom du chk"
                End With
                With USF.CodeModule
                    'code sur le checkbox
                    Code = "Sub " & Chk.Name & "_Change()" & vbCrLf
                    Code = ..Code
                    Code = Code & "End Sub"
                    J2 = .CountOfLines
                    .InsertLines J2 + 1, Code
                End With
     
      VBA.UserForms.Add (USF.Name)  'ICI, ME DONNE LE MESSAGE "OBJET REQUIS" SI USF= ACTIVEWORKBOOK.VBPROJECT.VBCOMPONENTS, comme si vba.userforms n'existait pas
     
      Set creationUserForm = UserForms(UserForms.Count - 1)
      End Function
    Je l'appelle ainsi, dans un sub me mon classeur "static", qui lui est la macro exécutée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            Dim X As Object
            Set X = creationUserForm("UserForm1")
            X.Show vbModeless
    Donc, avec THISWORKBOOK n'affiche rien, ACTIVEWORKBOOK n'affiche dans l'autre classeur que s'il y a 1 userform dans le classeur static, qui n'a pas été affiché, et plante si essayé seul.

    Le UserForm s'affiche ainsi, mais je n'arrive pas à vérifier la valeur des checkbox. J'ai maintenant 2 UserForm1, 1 dans mon classeur Static, l'autre dans l'autre classeur dit "1".

    Mais le code dans mon classeur "static" ne voit que les valeurs des chekbox qui se trouvent dans celui qui n'est pas affiché. J'ai certainement manqué quelque chose... c'est comme si le UserForm1 affiché était celui de mon classeur 1(il apparaît à sa création), mais que les valeurs trouvées dans le code userform1.controls correspondaient aux checkbox du classeur static. Je ne sais pas si j'arrive à être claire...

    Je ne suis pas très connaissante dans les objets d'Excel et je n'arrive pas à m'y retrouver. Tout ce que je veux au final, c'est que l'utilisateur ouvre son classeur "1", qu'il démarre la macro "Principale", qui se trouve dans mon classeur "static", et que cette dernière crée un formulaire avec des cases à cocher dans mon classeur "1", pour que l'utilisateur coche ces cases, ce qui génèrera un graphique selon la case cochée. Je n'en suis pas très loin, me manque juste le bug relié au UserForm créé dynamiquement.

    Si quelqu'un pouvait m'aider, j'apprécierais grandement!
    Merci!

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Points : 58
    Points
    58
    Par défaut Demi-solution; en forgeant, on devient forgeronne!
    J'y suis presqu'arrivée. Je ne crée qu'un UserForm1, dans le classeur "1", mais il n'apparaît toujours pas, même si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("hist.xls").Activate
    avant le x.show vbmodeless.

    J'ai créé un bouton sur le classeur "1", et dans son click, je refais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserForm1.show vbmodeless
    Ce n'est pas très utile d'avoir à refaire du code sur un bouton créé encore dynamiquement. Quelqu'un pourrait-il m'expliquer pourquoi je dois refaire un .show dans le code?

    Merci!

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu!...
    bonjour


    tu fait un show
    tu active un classeur

    forcement c'est la fenetre active au premier plan donc tu es obligé de faire un second show



    au plaisir

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Points : 58
    Points
    58
    Par défaut
    Merci de prendre le temps de m'assister, mais c'est "avant le x.show vbmodeless" que j'activais le classeur, pour signaler que c'est dans CE classeur que je voulais afficher le x. Je commençais à désespérer, et je cherchais n'importe quel moyen d'y arriver.

    De toutes façons, ça a recommencé à mal fonctionner.
    Le message "OBJET REQUIS" est revenu à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VBA.UserForms.Add (USF.Name)
    Je ne comprend pas; le VBA est général, non? Si je comprend, je fais le .add
    au document actif (1)(j'ai vérifié, et c'est bien ce document qu'ActiveWrokbook représente)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set USF = ActiveWorkbook.VBProject.VBComponents.Add(3)
    , et à la fin du sub, je l'ajoute à VBA.UserForms.

    Où est-ce que je fais l'erreur?

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu!...
    Re

    je n'en suis pas sur mais je crois que quand tu crée dynamiquement un usf il faut sauver le classeur pour qu'il puisse être pris en compte

    mais encore une fois ,de cela je n'en suis pas sur


    au plaisir

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup,

    Mais ça ne fonctionne toujours pas de cette manière.

    J'ai ajouté une sauvegarde du fichier dans la fonction, avant l'ajout à VBA.UserForms, mais toujours la même erreur après la sauvegarde.

    Une autre idée?

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    non c'est apres l'ajout de l'userform qu'il faut le sauver

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Points : 58
    Points
    58
    Par défaut
    Bonjour!

    C'est la ligne d'ajout qui plante, alors même si j'enregistre après la ligne, il ne se rend pas...

    J'ai transformé ma fonction en sub, comme ça, je n'ai rien à retourner et je ne fais même pas l'ajout au vba.userforms, au moins ça ne plante pas. Mais j'ai toujours besoin du bouton...

    Ce que je voulais faire c'est que dans mon doc "static", je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set USF = ActiveWorkbook.VBProject.VBComponents.Add(3)
    et je l'ajoute aux forms de l'autre doc. Mais je n'arrive pas à saisir comment faire un genre de "autreDoc.collectionForm.add"

    Je sais que mon UserForm est de type 3, et pour y référer à partir d'uin autre sub de mon doc "static", je dois looper dans "ActiveWorkbook.VBProject.VBComponents" et comparer les noms d'objets, alors je n'arrive pas à y référer directement, en faisant "ActiveWorkbook.VBProject.VBComponents("UserForm1")" ou quelque chose comme ça.

    Pour accéder aux contrôles qui s'y trouvent, je mets le code dans le codemodule du document des utilisateurs, parce que lui voit ses propres contrôles.

    Je continue à faire des tests...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Points : 58
    Points
    58
    Par défaut
    Voici;

    dans un module de perso.xls, je crée le formulaire ainsi;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Set USFArb = ActiveWorkbook.VBProject.VBComponents.Add(3)
      With USFArb
        .Properties("Caption") ="Titre" etc.    
        code = "Sub nomControl_change()" & vbcrlf
        code = code & "'Code du controle contenu dans le form" & vbcrlf
        code = code & "End Sub"
        I = .CodeModule.CountOfLines
        .CodeModule.InsertLines I + 1, code  
      End With
      "
    Mais j'ai toujours besoin d'un contrôle appartenant à "ActiveSheet.OLEObjects(lX).Object" pour l'afficher et remplir la liste qui s'y trouvent... Maintenant je comprend mieux les relations entre ces objets... merci!

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

Discussions similaires

  1. Créer des TextBox dynamiquement dans un UserForm ?
    Par Hellgast dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 05/06/2014, 22h16
  2. [VBA/VB] créer une page dynamiquement dans un WebBrowser
    Par SilkyRoad dans le forum Contribuez
    Réponses: 3
    Dernier message: 13/03/2013, 22h24
  3. [C#] Créer une nouvelle feuille dans un classeur Excel
    Par amoiraud dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/03/2008, 08h53
  4. Réponses: 5
    Dernier message: 19/02/2007, 15h44
  5. Creér des Clip dynamiquement dans la scène
    Par jpboogie dans le forum Flash
    Réponses: 2
    Dernier message: 04/10/2006, 16h47

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